From bfab9fd730fd3d1a2fcc94a1756401630a9a5a3f Mon Sep 17 00:00:00 2001 From: Daniel Lamando Date: Fri, 19 Sep 2025 23:27:33 +0200 Subject: [PATCH 1/2] v0.5.5: Finish the migration to jsr.io --- .github/README.md | 1 + .github/dependabot.yml | 6 +- .github/workflows/deno-ci.yaml | 54 ++++++++++++---- .github/workflows/jsr-publish-lib.yaml | 25 -------- deno.json | 6 ++ deno.lock | 87 ++++++++++++++++++++++++++ README.md => generation/README.md | 4 +- generation/codegen.ts | 12 ++-- generation/deno.json | 7 +++ generation/deps.ts | 4 -- generation/run-on-crds.ts | 6 +- lib/README.md | 28 +++------ lib/common.ts | 8 +-- lib/{jsr.json => deno.json} | 5 +- lib/deps.ts | 12 ++-- lib/deps_jsr.ts | 5 -- with-jsr-deps.sh | 14 ----- 17 files changed, 181 insertions(+), 103 deletions(-) create mode 120000 .github/README.md delete mode 100644 .github/workflows/jsr-publish-lib.yaml create mode 100644 deno.json create mode 100644 deno.lock rename README.md => generation/README.md (93%) create mode 100644 generation/deno.json delete mode 100644 generation/deps.ts rename lib/{jsr.json => deno.json} (96%) delete mode 100644 lib/deps_jsr.ts delete mode 100755 with-jsr-deps.sh diff --git a/.github/README.md b/.github/README.md new file mode 120000 index 0000000..b169cf3 --- /dev/null +++ b/.github/README.md @@ -0,0 +1 @@ +../lib/README.md \ No newline at end of file diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 9960204..3e3e1df 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,7 +1,7 @@ version: 2 updates: - - package-ecosystem: "github-actions" - directory: "/" + - package-ecosystem: github-actions + directory: / schedule: - interval: "weekly" + interval: monthly diff --git a/.github/workflows/deno-ci.yaml b/.github/workflows/deno-ci.yaml index e910142..ac20c9e 100644 --- a/.github/workflows/deno-ci.yaml +++ b/.github/workflows/deno-ci.yaml @@ -5,6 +5,8 @@ on: branches: [ main ] pull_request: {} +permissions: + contents: read jobs: check: @@ -13,10 +15,12 @@ jobs: strategy: matrix: deno-version: - - v1.41 - - v1.43 - - v1.45 - v2.0 + - v2.1 + - v2.2 + - v2.3 + - v2.4 + - v2.5 - canary fail-fast: false # run each branch to completion @@ -29,14 +33,11 @@ jobs: with: deno-version: ${{ matrix.deno-version }} - # "https" cache: code from the Internet - # External sources won't change much so we use less precise keys - - name: Cache https:// + - name: Cache Deno deps uses: actions/cache@v4 with: - path: ~/.cache/deno/deps/https - key: deno-https/v1-${{ github.sha }} - restore-keys: deno-https/v1- + path: ~/.cache/deno + key: denodir/${{ matrix.deno-version }}-${{ hashFiles('deno.lock') }} - name: Check generation/mod.ts run: time deno check generation/mod.ts @@ -53,7 +54,7 @@ jobs: - name: Test run: time deno test - audit-lib: + check-publish-lib: runs-on: ubuntu-latest name: Audit ./lib @@ -64,6 +65,37 @@ jobs: - name: Use latest Deno uses: denoland/setup-deno@v2 + - name: Cache Deno deps + uses: actions/cache@v4 + with: + path: ~/.cache/deno + key: denodir-${{ hashFiles('deno.lock') }} + - name: Check publish rules working-directory: lib - run: ../with-jsr-deps.sh deno publish --dry-run --allow-dirty + run: deno publish --dry-run --allow-dirty + + publish-lib: + runs-on: ubuntu-latest + name: Publish ./lib + needs: + - check + - check-publish-lib + if: github.event_name == 'push' + + permissions: + contents: read + id-token: write + + steps: + - uses: denoland/setup-deno@v2 + - uses: actions/checkout@v5 + + - name: Cache Deno deps + uses: actions/cache@v4 + with: + path: ~/.cache/deno + key: denodir-${{ hashFiles('deno.lock') }} + + - name: Publish now + run: deno publish diff --git a/.github/workflows/jsr-publish-lib.yaml b/.github/workflows/jsr-publish-lib.yaml deleted file mode 100644 index 74edd27..0000000 --- a/.github/workflows/jsr-publish-lib.yaml +++ /dev/null @@ -1,25 +0,0 @@ -name: Publish -on: - push: - branches: - - main - paths: - - lib/jsr.json - -jobs: - publish: - runs-on: ubuntu-latest - name: Publish ./lib - - permissions: - contents: read - id-token: write - - steps: - - uses: denoland/setup-deno@v2 - - - uses: actions/checkout@v5 - - - name: Publish to JSR - working-directory: lib - run: ../with-jsr-deps.sh deno publish --allow-dirty diff --git a/deno.json b/deno.json new file mode 100644 index 0000000..715f693 --- /dev/null +++ b/deno.json @@ -0,0 +1,6 @@ +{ + "workspace": [ + "generation", + "lib" + ] +} diff --git a/deno.lock b/deno.lock new file mode 100644 index 0000000..5f1ba3c --- /dev/null +++ b/deno.lock @@ -0,0 +1,87 @@ +{ + "version": "5", + "specifiers": { + "jsr:@cloudydeno/kubernetes-client@0.7": "0.7.7", + "jsr:@cloudydeno/stream-observables@1": "1.4.1", + "jsr:@std/internal@^1.0.10": "1.0.10", + "jsr:@std/path@1": "1.1.2", + "jsr:@std/streams@1": "1.0.12", + "jsr:@std/yaml@1": "1.0.9" + }, + "jsr": { + "@cloudydeno/kubernetes-client@0.7.7": { + "integrity": "631ad5d265b03936cf169860bbe3595e336c1e4730ab9bb9d2fe6f7e7fd095ee", + "dependencies": [ + "jsr:@cloudydeno/stream-observables", + "jsr:@std/path", + "jsr:@std/streams", + "jsr:@std/yaml" + ] + }, + "@cloudydeno/stream-observables@1.4.1": { + "integrity": "555aa3d786fcfd066d096fc943ea47afc688618e95146e615705e981008f57c0" + }, + "@std/internal@1.0.10": { + "integrity": "e3be62ce42cab0e177c27698e5d9800122f67b766a0bea6ca4867886cbde8cf7" + }, + "@std/path@1.1.2": { + "integrity": "c0b13b97dfe06546d5e16bf3966b1cadf92e1cc83e56ba5476ad8b498d9e3038", + "dependencies": [ + "jsr:@std/internal" + ] + }, + "@std/streams@1.0.12": { + "integrity": "ae925fa1dc459b1abf5cbaa28cc5c7b0485853af3b2a384b0dc22d86e59dfbf4" + }, + "@std/yaml@1.0.9": { + "integrity": "6bad3dc766dd85b4b37eabcba81b6aa4eac7a392792ae29abcfb0f90602d55bb" + } + }, + "remote": { + "https://deno.land/std@0.177.0/streams/text_line_stream.ts": "a9dd2636c6b90e626e19df26c97034c5f638bdd957cbd5c531d6278fe1d08e90", + "https://deno.land/std@0.198.0/_util/diff.ts": "1a3c044aedf77647d6cac86b798c6417603361b66b54c53331b312caeb447aea", + "https://deno.land/std@0.198.0/assert/_constants.ts": "8a9da298c26750b28b326b297316cdde860bc237533b07e1337c021379e6b2a9", + "https://deno.land/std@0.198.0/assert/_format.ts": "a69126e8a469009adf4cf2a50af889aca364c349797e63174884a52ff75cf4c7", + "https://deno.land/std@0.198.0/assert/assert.ts": "9a97dad6d98c238938e7540736b826440ad8c1c1e54430ca4c4e623e585607ee", + "https://deno.land/std@0.198.0/assert/assert_almost_equals.ts": "e15ca1f34d0d5e0afae63b3f5d975cbd18335a132e42b0c747d282f62ad2cd6c", + "https://deno.land/std@0.198.0/assert/assert_array_includes.ts": "6856d7f2c3544bc6e62fb4646dfefa3d1df5ff14744d1bca19f0cbaf3b0d66c9", + "https://deno.land/std@0.198.0/assert/assert_equals.ts": "a0ee60574e437bcab2dcb79af9d48dc88845f8fd559468d9c21b15fd638ef943", + "https://deno.land/std@0.198.0/assert/assert_exists.ts": "407cb6b9fb23a835cd8d5ad804e2e2edbbbf3870e322d53f79e1c7a512e2efd7", + "https://deno.land/std@0.198.0/assert/assert_false.ts": "a9962749f4bf5844e3fa494257f1de73d69e4fe0e82c34d0099287552163a2dc", + "https://deno.land/std@0.198.0/assert/assert_instance_of.ts": "09fd297352a5b5bbb16da2b5e1a0d8c6c44da5447772648622dcc7df7af1ddb8", + "https://deno.land/std@0.198.0/assert/assert_is_error.ts": "b4eae4e5d182272efc172bf28e2e30b86bb1650cd88aea059e5d2586d4160fb9", + "https://deno.land/std@0.198.0/assert/assert_match.ts": "c4083f80600bc190309903c95e397a7c9257ff8b5ae5c7ef91e834704e672e9b", + "https://deno.land/std@0.198.0/assert/assert_not_equals.ts": "9f1acab95bd1f5fc9a1b17b8027d894509a745d91bac1718fdab51dc76831754", + "https://deno.land/std@0.198.0/assert/assert_not_instance_of.ts": "0c14d3dfd9ab7a5276ed8ed0b18c703d79a3d106102077ec437bfe7ed912bd22", + "https://deno.land/std@0.198.0/assert/assert_not_match.ts": "3796a5b0c57a1ce6c1c57883dd4286be13a26f715ea662318ab43a8491a13ab0", + "https://deno.land/std@0.198.0/assert/assert_not_strict_equals.ts": "ca6c6d645e95fbc873d25320efeb8c4c6089a9a5e09f92d7c1c4b6e935c2a6ad", + "https://deno.land/std@0.198.0/assert/assert_object_match.ts": "d8fc2867cfd92eeacf9cea621e10336b666de1874a6767b5ec48988838370b54", + "https://deno.land/std@0.198.0/assert/assert_rejects.ts": "45c59724de2701e3b1f67c391d6c71c392363635aad3f68a1b3408f9efca0057", + "https://deno.land/std@0.198.0/assert/assert_strict_equals.ts": "5cf29b38b3f8dece95287325723272aa04e04dbf158d886d662fa594fddc9ed3", + "https://deno.land/std@0.198.0/assert/assert_string_includes.ts": "b821d39ebf5cb0200a348863c86d8c4c4b398e02012ce74ad15666fc4b631b0c", + "https://deno.land/std@0.198.0/assert/assert_throws.ts": "63784e951475cb7bdfd59878cd25a0931e18f6dc32a6077c454b2cd94f4f4bcd", + "https://deno.land/std@0.198.0/assert/assertion_error.ts": "4d0bde9b374dfbcbe8ac23f54f567b77024fb67dbb1906a852d67fe050d42f56", + "https://deno.land/std@0.198.0/assert/equal.ts": "9f1a46d5993966d2596c44e5858eec821859b45f783a5ee2f7a695dfc12d8ece", + "https://deno.land/std@0.198.0/assert/fail.ts": "c36353d7ae6e1f7933d45f8ea51e358c8c4b67d7e7502028598fe1fea062e278", + "https://deno.land/std@0.198.0/assert/mod.ts": "08d55a652c22c5da0215054b21085cec25a5da47ce4a6f9de7d9ad36df35bdee", + "https://deno.land/std@0.198.0/assert/unimplemented.ts": "d56fbeecb1f108331a380f72e3e010a1f161baa6956fd0f7cf3e095ae1a4c75a", + "https://deno.land/std@0.198.0/assert/unreachable.ts": "4600dc0baf7d9c15a7f7d234f00c23bca8f3eba8b140286aaca7aa998cf9a536", + "https://deno.land/std@0.198.0/fmt/colors.ts": "a7eecffdf3d1d54db890723b303847b6e0a1ab4b528ba6958b8f2e754cf1b3bc" + }, + "workspace": { + "members": { + "generation": { + "dependencies": [ + "jsr:@cloudydeno/kubernetes-client@0.7", + "jsr:@std/path@1", + "jsr:@std/yaml@1" + ] + }, + "lib": { + "dependencies": [ + "jsr:@cloudydeno/kubernetes-client@0.7" + ] + } + } + } +} diff --git a/README.md b/generation/README.md similarity index 93% rename from README.md rename to generation/README.md index 56f69cd..552f3bd 100644 --- a/README.md +++ b/generation/README.md @@ -1,6 +1,6 @@ -![Deno CI](https://github.com/danopia/deno-kubernetes_apis/workflows/CI/badge.svg?branch=main) +[![CI](https://github.com/cloudydeno/kubernetes-apis/actions/workflows/deno-ci.yaml/badge.svg)](https://github.com/cloudydeno/kubernetes-apis/actions/workflows/deno-ci.yaml) -# `/x/kubernetes_apis` +# `@cloudydeno/kubernetes-apis` NOTE: This README is about code generation concepts. diff --git a/generation/codegen.ts b/generation/codegen.ts index 37659c6..5ac5f95 100644 --- a/generation/codegen.ts +++ b/generation/codegen.ts @@ -1,10 +1,10 @@ -import { path } from "./deps.ts"; +import { join as joinPath } from "@std/path/join"; import { generateModuleTypescript } from "./codegen-mod.ts"; import { generateStructsTypescript } from "./codegen-structs.ts"; import { SurfaceApi, SurfaceMap } from "./describe-surface.ts"; export async function writeApiModule(surface: SurfaceMap, api: SurfaceApi, category: string, apisModuleRoot?: string) { - const modRoot = path.join('lib', category, api.moduleName); + const modRoot = joinPath('lib', category, api.moduleName); function postProcess(text: string) { if (apisModuleRoot) { @@ -22,13 +22,13 @@ export async function writeApiModule(surface: SurfaceMap, api: SurfaceApi, categ await Deno.mkdir(modRoot, {recursive: true}); - await Deno.writeTextFile(path.join(modRoot, 'structs.ts'), + await Deno.writeTextFile(joinPath(modRoot, 'structs.ts'), postProcess(generateStructsTypescript(surface, api))); - console.log('Wrote', path.join(modRoot, 'structs.ts')); + console.log('Wrote', joinPath(modRoot, 'structs.ts')); if (api.operations.length > 0) { - await Deno.writeTextFile(path.join(modRoot, 'mod.ts'), + await Deno.writeTextFile(joinPath(modRoot, 'mod.ts'), postProcess(generateModuleTypescript(surface, api))); - console.log('Wrote', path.join(modRoot, 'mod.ts')); + console.log('Wrote', joinPath(modRoot, 'mod.ts')); } } diff --git a/generation/deno.json b/generation/deno.json new file mode 100644 index 0000000..13607fc --- /dev/null +++ b/generation/deno.json @@ -0,0 +1,7 @@ +{ + "imports": { + "@cloudydeno/kubernetes-client": "jsr:@cloudydeno/kubernetes-client@^0.7", + "@std/path": "jsr:@std/path@^1", + "@std/yaml": "jsr:@std/yaml@^1" + } +} diff --git a/generation/deps.ts b/generation/deps.ts deleted file mode 100644 index 136ddae..0000000 --- a/generation/deps.ts +++ /dev/null @@ -1,4 +0,0 @@ -export * as path from "https://deno.land/std@0.177.0/path/mod.ts"; -export * as YAML from "https://deno.land/std@0.177.0/encoding/yaml.ts"; - -export type { ApiKind, JSONValue } from "https://deno.land/x/kubernetes_client@v0.7.0/mod.ts"; diff --git a/generation/run-on-crds.ts b/generation/run-on-crds.ts index 5dbc3f8..a1a0c8d 100644 --- a/generation/run-on-crds.ts +++ b/generation/run-on-crds.ts @@ -1,4 +1,6 @@ -import { YAML, ApiKind, JSONValue } from "./deps.ts"; +import { parseAll as parseAllYAML } from "@std/yaml/parse"; +import type { ApiKind, JSONValue } from "@cloudydeno/kubernetes-client/lib/contract.ts"; + import type { OpenAPI2SchemaObject, OpenAPI2Methods, OpenAPI2PathMethod } from './openapi.ts'; import { writeApiModule } from "./codegen.ts"; import { SurfaceMap, SurfaceApi, OpScope } from "./describe-surface.ts"; @@ -22,7 +24,7 @@ for await (const dirEntry of Deno.readDir(Deno.args[0])) { if (dirEntry.name.endsWith('.example.yaml')) continue; const raw = await Deno.readFile(Deno.args[0]+'/'+dirEntry.name); - const docs = YAML.parseAll(new TextDecoder('utf-8').decode(raw)) as Array; + const docs = parseAllYAML(new TextDecoder('utf-8').decode(raw)) as Array; for (const doc of docs) { const typing = doc as ApiKind; diff --git a/lib/README.md b/lib/README.md index 197c08f..417487b 100644 --- a/lib/README.md +++ b/lib/README.md @@ -10,12 +10,17 @@ The actual request transports are implemented in `/x/kubernetes_client`. ## Usage +> [!NOTE] +> This library has no default export, so you will need to +> import the particular Kubernetes API groups that you want to work with. +> This arrangement keeps program size smaller. + Here's a basic request, listing all Pods in the `default` namespace. It uses the `autoDetectClient()` entrypoint which returns the first usable client. ```ts -import { autoDetectClient } from 'https://deno.land/x/kubernetes_client@v0.7.3/mod.ts'; -import { CoreV1Api } from 'https://deno.land/x/kubernetes_apis/builtin/core@v1/mod.ts'; +import { autoDetectClient } from 'jsr:@cloudydeno/kubernetes-client'; +import { CoreV1Api } from 'jsr:@cloudydeno/kubernetes-apis/core/v1'; const kubernetes = await autoDetectClient(); const coreApi = new CoreV1Api(kubernetes).namespace("default"); @@ -28,24 +33,7 @@ console.log(podList); When running locally (with `kubectl` set up), you probably just to add `--allow-run=kubectl` to run this. For a container being deployed onto a cluster, there's more flags to provide instead; -see `/x/kubernetes_client` for more information. - - -### Usage with JSR Imports -Note that there is no default export, so you will need to -import the particular Kubernetes API groups that you want to work with. -This layout keeps program size smaller. - -```ts -import { autoDetectClient } from "jsr:@cloudydeno/kubernetes-client@0.7.3"; -import { CoreV1Api } from "jsr:@cloudydeno/kubernetes-apis/core/v1"; - -const kubernetes = await autoDetectClient(); -const coreApi = new CoreV1Api(kubernetes).namespace("default"); - -const podList = await coreApi.getPodList(); -console.log(podList); -``` +see `@cloudydeno/kubernetes-client` docs for more information. ## Changelog diff --git a/lib/common.ts b/lib/common.ts index a27e704..c880e14 100644 --- a/lib/common.ts +++ b/lib/common.ts @@ -3,20 +3,20 @@ // while users are free to pass in a different compatible client to actually call import { toStatus, type Status } from "./builtin/meta@v1/structs.ts"; -import { +import type { ApiKind, JSONObject, JSONValue, RequestOptions, - type WatchEvent -} from "./deps.ts"; + WatchEvent +} from "@cloudydeno/kubernetes-client"; export { type ApiKind, type JSONValue, type RestClient, WatchEventTransformer, type WatchEvent, -} from "./deps.ts"; +} from "@cloudydeno/kubernetes-client"; // Shorthand for generated type signatures export type WatchEventStream = ReadableStream>; diff --git a/lib/jsr.json b/lib/deno.json similarity index 96% rename from lib/jsr.json rename to lib/deno.json index 3861c3c..8b7aea3 100644 --- a/lib/jsr.json +++ b/lib/deno.json @@ -1,6 +1,9 @@ { "name": "@cloudydeno/kubernetes-apis", - "version": "0.5.2", + "version": "0.5.5", + "imports": { + "@cloudydeno/kubernetes-client": "jsr:@cloudydeno/kubernetes-client@^0.7" + }, "exports": { "./admissionregistration.k8s.io/v1": "./builtin/admissionregistration.k8s.io@v1/mod.ts", diff --git a/lib/deps.ts b/lib/deps.ts index 70ac350..b91bd99 100644 --- a/lib/deps.ts +++ b/lib/deps.ts @@ -1,11 +1,11 @@ // This file is just the entire matching kubernetes_client version. -// kubernetes_apis itself only depends on specific files, -// so this is provided an optional utility +// kubernetes-apis itself only depends on specific files, +// so this is provided an optional utility. -export * from "https://deno.land/x/kubernetes_client@v0.7.3/mod.ts"; -export * as tunnelBeta from "https://deno.land/x/kubernetes_client@v0.7.3/tunnel-beta/via-websocket.ts"; +export * from "@cloudydeno/kubernetes-client"; +export * as tunnelBeta from "@cloudydeno/kubernetes-client/tunnel-beta/via-websocket.ts"; -export * from "https://deno.land/x/kubernetes_client@v0.7.3/lib/contract.ts"; +export * from "@cloudydeno/kubernetes-client/lib/contract.ts"; export { WatchEventTransformer, -} from "https://deno.land/x/kubernetes_client@v0.7.3/lib/stream-transformers.ts"; +} from "@cloudydeno/kubernetes-client/lib/stream-transformers.ts"; diff --git a/lib/deps_jsr.ts b/lib/deps_jsr.ts deleted file mode 100644 index 0af8212..0000000 --- a/lib/deps_jsr.ts +++ /dev/null @@ -1,5 +0,0 @@ -// This file is just the entire matching kubernetes_client version. -// kubernetes_apis itself only depends on specific files, -// so this is provided an optional utility - -export * from "jsr:@cloudydeno/kubernetes-client@0.7.3"; diff --git a/with-jsr-deps.sh b/with-jsr-deps.sh deleted file mode 100755 index ee2ec6a..0000000 --- a/with-jsr-deps.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env sh -set -ux - -mv deps.ts deps_https.ts -mv deps_jsr.ts deps.ts -undo () { - ARG=$? - mv deps.ts deps_jsr.ts - mv deps_https.ts deps.ts - exit $ARG -} -trap undo EXIT - -"$@" From 582ac04673574958b44b928b70edf8fa0fe2e656 Mon Sep 17 00:00:00 2001 From: Daniel Lamando Date: Fri, 19 Sep 2025 23:35:50 +0200 Subject: [PATCH 2/2] More tweak --- .github/workflows/deno-ci.yaml | 3 +++ lib/README.md | 21 ++++++++++++++++----- 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/.github/workflows/deno-ci.yaml b/.github/workflows/deno-ci.yaml index ac20c9e..a1f99fc 100644 --- a/.github/workflows/deno-ci.yaml +++ b/.github/workflows/deno-ci.yaml @@ -39,6 +39,9 @@ jobs: path: ~/.cache/deno key: denodir/${{ matrix.deno-version }}-${{ hashFiles('deno.lock') }} + - name: Possibly reset lockfile + run: deno install || rm deno.lock + - name: Check generation/mod.ts run: time deno check generation/mod.ts diff --git a/lib/README.md b/lib/README.md index 417487b..9e81f1f 100644 --- a/lib/README.md +++ b/lib/README.md @@ -6,7 +6,7 @@ Generated, typed interfaces to make every possible Kubernetes API request and work with richer data structures. -The actual request transports are implemented in `/x/kubernetes_client`. +The actual HTTP request logic (e.g. authentication) is handled by `@cloudydeno/kubernetes-client`. ## Usage @@ -15,7 +15,7 @@ The actual request transports are implemented in `/x/kubernetes_client`. > import the particular Kubernetes API groups that you want to work with. > This arrangement keeps program size smaller. -Here's a basic request, listing all Pods in the `default` namespace. +This basic example lists all Pods in the `default` namespace. It uses the `autoDetectClient()` entrypoint which returns the first usable client. ```ts @@ -31,12 +31,23 @@ console.log(podList); // see files in examples/ for more API demos (watching, creation, etc) ``` -When running locally (with `kubectl` set up), you probably just to add `--allow-run=kubectl` to run this. -For a container being deployed onto a cluster, there's more flags to provide instead; -see `@cloudydeno/kubernetes-client` docs for more information. +### Deno Permissions + +When running locally (with `kubectl` set up), you probably want to pass `--allow-run=kubectl` to Deno. + +For a container being deployed onto a cluster with a Service Account, +the minimally required Deno permission flags are: +`--allow-read=/var/run/secrets/kubernetes.io --allow-net=kubernetes.default.svc.cluster.local` + +See [`@cloudydeno/kubernetes-client` docs](https://jsr.io/@cloudydeno/kubernetes-client) +for more information. ## Changelog +* `v0.5.5` on `2025-09-19`: + * Fully adopt JSR. Remove remnants of `/x/` and `/std/` dependencies. + * + * `v0.5.4` on `2025-01-18`: * Includes 'builtin' APIs generated from K8s `v1.32.0`. * Several API versions were changed, removed, or added.