├── .gitignore ├── .fluentci ├── .gitignore ├── mod.ts ├── .vscode │ └── settings.json ├── .env.example ├── src │ ├── gitlab │ │ ├── init.ts │ │ ├── config_test.ts │ │ ├── config.ts │ │ └── README.md │ ├── aws │ │ ├── init.ts │ │ ├── config_test.ts │ │ ├── config.ts │ │ └── README.md │ ├── azure │ │ ├── init.ts │ │ ├── config_test.ts │ │ ├── config.ts │ │ └── README.md │ ├── circleci │ │ ├── init.ts │ │ ├── config_test.ts │ │ ├── config.ts │ │ └── README.md │ ├── github │ │ ├── init.ts │ │ ├── config_test.ts │ │ ├── config.ts │ │ └── README.md │ └── dagger │ │ ├── index.ts │ │ ├── runner.ts │ │ ├── list_jobs.ts │ │ ├── pipeline.ts │ │ ├── lib.ts │ │ └── jobs.ts ├── ci.ts ├── dagger.json ├── sdk │ ├── client.ts │ ├── nix │ │ ├── index.ts │ │ ├── example.ts │ │ ├── example_with_flox.ts │ │ ├── example_with_devenv.ts │ │ ├── example_with_devbox_pkg.ts │ │ ├── example_with_devbox.ts │ │ └── steps.ts │ ├── builder.ts │ ├── connect.ts │ ├── context.ts │ └── utils.ts ├── fixtures │ ├── workflow.yml │ ├── buildspec.yml │ ├── azure-pipelines.yml │ ├── .gitlab-ci.yml │ └── config.yml ├── flake.nix ├── deno.json ├── LICENSE ├── .devcontainer │ └── devcontainer.json ├── import_map.json ├── flake.lock ├── deps.ts ├── CONTRIBUTING.md ├── README.md ├── CODE_OF_CONDUCT.md └── deno.lock ├── .vscode └── settings.json ├── src ├── cmd │ ├── publish.ts │ ├── search.ts │ ├── status.ts │ ├── server.ts │ ├── community.ts │ ├── list.ts │ ├── shell.ts │ ├── logs.ts │ ├── down.ts │ ├── up.ts │ └── init.ts ├── type.ts ├── consts.ts ├── lib.ts ├── workspaces.ts └── pkgx.ts ├── .github ├── images │ └── preview.png ├── FUNDING.yml └── workflows │ ├── flakehub-publish-tagged.yml │ ├── ci.yml │ ├── flakestry-publish.yml │ └── release.yml ├── dagger.json ├── deno.json ├── flake.nix ├── deps.ts ├── CONTRIBUTING.md ├── main.ts ├── install.sh ├── README.md ├── flake.lock ├── CODE_OF_CONDUCT.md ├── LICENSE └── deno.lock /.gitignore: -------------------------------------------------------------------------------- 1 | demo/ -------------------------------------------------------------------------------- /.fluentci/.gitignore: -------------------------------------------------------------------------------- 1 | coverage/ 2 | coverage.lcov -------------------------------------------------------------------------------- /.fluentci/mod.ts: -------------------------------------------------------------------------------- 1 | export * from "./src/dagger/index.ts"; 2 | -------------------------------------------------------------------------------- /.fluentci/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "deno.enable": true 3 | } 4 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "deno.enable": true, 3 | "deno.unstable": true 4 | } -------------------------------------------------------------------------------- /src/cmd/publish.ts: -------------------------------------------------------------------------------- 1 | async function publish() {} 2 | 3 | export default publish; 4 | -------------------------------------------------------------------------------- /src/cmd/search.ts: -------------------------------------------------------------------------------- 1 | async function search() {} 2 | 3 | export default search; 4 | -------------------------------------------------------------------------------- /.fluentci/.env.example: -------------------------------------------------------------------------------- 1 | DENO_PROJECT=your-project-name 2 | DENO_DEPLOY_TOKEN=your-deploy-token 3 | -------------------------------------------------------------------------------- /src/cmd/status.ts: -------------------------------------------------------------------------------- 1 | async function status(_workspace?: string) {} 2 | 3 | export default status; 4 | -------------------------------------------------------------------------------- /.fluentci/src/gitlab/init.ts: -------------------------------------------------------------------------------- 1 | import { generateYaml } from "./config.ts"; 2 | 3 | generateYaml().write(); 4 | -------------------------------------------------------------------------------- /.github/images/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pocketenv-io/pocketenv/HEAD/.github/images/preview.png -------------------------------------------------------------------------------- /src/cmd/server.ts: -------------------------------------------------------------------------------- 1 | async function server({ port: _port }: { port?: number }) {} 2 | 3 | export default server; 4 | -------------------------------------------------------------------------------- /.fluentci/src/aws/init.ts: -------------------------------------------------------------------------------- 1 | import { generateYaml } from "./config.ts"; 2 | 3 | generateYaml().save("buildspec.yml"); 4 | -------------------------------------------------------------------------------- /.fluentci/src/azure/init.ts: -------------------------------------------------------------------------------- 1 | import { generateYaml } from "./config.ts"; 2 | 3 | generateYaml().save("azure-pipeline.yml"); 4 | -------------------------------------------------------------------------------- /.fluentci/src/circleci/init.ts: -------------------------------------------------------------------------------- 1 | import { generateYaml } from "./config.ts"; 2 | 3 | generateYaml().save(".circleci/config.yml"); 4 | -------------------------------------------------------------------------------- /.fluentci/src/github/init.ts: -------------------------------------------------------------------------------- 1 | import { generateYaml } from "./config.ts"; 2 | 3 | generateYaml().save(".github/workflows/ci.yml"); 4 | -------------------------------------------------------------------------------- /.fluentci/ci.ts: -------------------------------------------------------------------------------- 1 | import { fmt, lint, test } from "https://deno.land/x/deno_pipeline/mod.ts"; 2 | 3 | await fmt(); 4 | await lint(); 5 | await test(); 6 | -------------------------------------------------------------------------------- /src/type.ts: -------------------------------------------------------------------------------- 1 | export type Workspace = { 2 | containerId: string | null; 3 | name: string; 4 | status: string; 5 | path: string; 6 | description?: string; 7 | createdAt: string; 8 | updatedAt: string; 9 | }; 10 | -------------------------------------------------------------------------------- /dagger.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pocketdev", 3 | "sdk": "github.com/fluentci-io/daggerverse/deno-sdk@main", 4 | "version": "v0.1.0", 5 | "description": "", 6 | "author": "Tsiry Sandratraina ", 7 | "license": "MIT" 8 | } -------------------------------------------------------------------------------- /.fluentci/dagger.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pocketdev", 3 | "sdk": "github.com/fluentci-io/daggerverse/deno-sdk@main", 4 | "version": "v0.1.0", 5 | "description": "", 6 | "author": "Tsiry Sandratraina ", 7 | "license": "MIT" 8 | } -------------------------------------------------------------------------------- /.fluentci/src/dagger/index.ts: -------------------------------------------------------------------------------- 1 | import pipeline from "./pipeline.ts"; 2 | import { 3 | fmt, 4 | lint, 5 | test, 6 | deploy, 7 | compile, 8 | exclude, 9 | jobDescriptions, 10 | } from "./jobs.ts"; 11 | 12 | export { fmt, lint, pipeline, test, deploy, compile, exclude, jobDescriptions }; 13 | -------------------------------------------------------------------------------- /src/cmd/community.ts: -------------------------------------------------------------------------------- 1 | import { open } from "../../deps.ts"; 2 | 3 | export default function community() { 4 | const DISCORD_INVITE = "https://discord.gg/RxKa62YAs4"; 5 | console.log(DISCORD_INVITE); 6 | 7 | open(DISCORD_INVITE).catch((err) => { 8 | console.error(err); 9 | Deno.exit(1); 10 | }); 11 | } 12 | -------------------------------------------------------------------------------- /.fluentci/sdk/client.ts: -------------------------------------------------------------------------------- 1 | import { GraphQLClient } from "../deps.ts"; 2 | 3 | export function createGQLClient(port: number, token: string): GraphQLClient { 4 | return new GraphQLClient(`http://127.0.0.1:${port}/query`, { 5 | headers: { 6 | Authorization: "Basic " + btoa(token + ":"), 7 | }, 8 | }); 9 | } 10 | -------------------------------------------------------------------------------- /deno.json: -------------------------------------------------------------------------------- 1 | { 2 | "tasks": { 3 | "dev": "deno run --watch main.ts" 4 | }, 5 | "fmt": { 6 | "exclude": [ 7 | ".fluentci" 8 | ] 9 | }, 10 | "lint": { 11 | "exclude": [ 12 | ".fluentci" 13 | ] 14 | }, 15 | "test": { 16 | "exclude": [ 17 | ".fluentci" 18 | ] 19 | } 20 | } -------------------------------------------------------------------------------- /.fluentci/sdk/nix/index.ts: -------------------------------------------------------------------------------- 1 | import { 2 | withDevbox, 3 | withDevboxExec, 4 | withDevenv, 5 | withFlox, 6 | withNix, 7 | withPackageFromDevbox, 8 | } from "./steps.ts"; 9 | 10 | export { 11 | withDevbox, 12 | withDevboxExec, 13 | withDevenv, 14 | withFlox, 15 | withNix, 16 | withPackageFromDevbox, 17 | }; 18 | -------------------------------------------------------------------------------- /src/consts.ts: -------------------------------------------------------------------------------- 1 | import { dir } from "../deps.ts"; 2 | 3 | export const VERSION = "0.1.5"; 4 | 5 | export const POCKETENV_DIR = `${dir("home")}/.pocketenv`; 6 | 7 | export const POCKETENV_CACHE_DIR = `${POCKETENV_DIR}/cache`; 8 | 9 | export const POCKETENV_WORKSPACES_DIR = `${POCKETENV_DIR}/workspaces`; 10 | 11 | export const POCKETENV_KV_PREFIX = "pocketenv"; 12 | -------------------------------------------------------------------------------- /.fluentci/src/circleci/config_test.ts: -------------------------------------------------------------------------------- 1 | import { assertEquals } from "../../deps.ts"; 2 | import { generateYaml } from "./config.ts"; 3 | 4 | Deno.test(function generateCircleCITest() { 5 | const circleci = generateYaml(); 6 | const actual = circleci.toString(); 7 | const expected = Deno.readTextFileSync("./fixtures/config.yml"); 8 | assertEquals(actual, expected); 9 | }); 10 | -------------------------------------------------------------------------------- /.fluentci/src/gitlab/config_test.ts: -------------------------------------------------------------------------------- 1 | import { assertEquals } from "../../deps.ts"; 2 | import { generateYaml } from "./config.ts"; 3 | 4 | Deno.test(function generateGitlabCITest() { 5 | const gitlabci = generateYaml(); 6 | const actual = gitlabci.toString(); 7 | const expected = Deno.readTextFileSync("./fixtures/.gitlab-ci.yml"); 8 | assertEquals(actual, expected); 9 | }); 10 | -------------------------------------------------------------------------------- /.fluentci/src/aws/config_test.ts: -------------------------------------------------------------------------------- 1 | import { assertEquals } from "../../deps.ts"; 2 | import { generateYaml } from "./config.ts"; 3 | 4 | Deno.test(function generateAWSCodePipelineTest() { 5 | const buildspec = generateYaml(); 6 | const actual = buildspec.toString(); 7 | const expected = Deno.readTextFileSync("./fixtures/buildspec.yml"); 8 | assertEquals(actual, expected); 9 | }); 10 | -------------------------------------------------------------------------------- /.fluentci/src/github/config_test.ts: -------------------------------------------------------------------------------- 1 | import { assertEquals } from "../../deps.ts"; 2 | import { generateYaml } from "./config.ts"; 3 | 4 | Deno.test(function generateGithubActionsWorkflowTest() { 5 | const workflow = generateYaml(); 6 | const actual = workflow.toString(); 7 | const expected = Deno.readTextFileSync("./fixtures/workflow.yml"); 8 | assertEquals(actual, expected); 9 | }); 10 | -------------------------------------------------------------------------------- /.fluentci/src/azure/config_test.ts: -------------------------------------------------------------------------------- 1 | import { assertEquals } from "../../deps.ts"; 2 | import { generateYaml } from "./config.ts"; 3 | 4 | Deno.test(function generateAzurePipelinesTest() { 5 | const azurepipelines = generateYaml(); 6 | const actual = azurepipelines.toString(); 7 | const expected = Deno.readTextFileSync("./fixtures/azure-pipelines.yml"); 8 | assertEquals(actual, expected); 9 | }); 10 | -------------------------------------------------------------------------------- /.fluentci/sdk/nix/example.ts: -------------------------------------------------------------------------------- 1 | import Client from "../../deps.ts"; 2 | import { connect } from "../connect.ts"; 3 | import { withNix } from "./steps.ts"; 4 | 5 | connect(async (client: Client) => { 6 | const ctr = withNix( 7 | client 8 | .pipeline("nix-installer") 9 | .container() 10 | .from("alpine") 11 | .withExec(["apk", "add", "curl"]) 12 | ); 13 | 14 | const result = await ctr.stdout(); 15 | 16 | console.log(result); 17 | }); 18 | -------------------------------------------------------------------------------- /.fluentci/sdk/nix/example_with_flox.ts: -------------------------------------------------------------------------------- 1 | import Client from "../../deps.ts"; 2 | import { connect } from "../connect.ts"; 3 | import { withFlox } from "./steps.ts"; 4 | 5 | connect(async (client: Client) => { 6 | const ctr = withFlox( 7 | client 8 | .pipeline("nix-installer") 9 | .container() 10 | .from("alpine") 11 | .withExec(["apk", "add", "curl"]) 12 | ); 13 | 14 | const result = await ctr.stdout(); 15 | 16 | console.log(result); 17 | }); 18 | -------------------------------------------------------------------------------- /.fluentci/sdk/nix/example_with_devenv.ts: -------------------------------------------------------------------------------- 1 | import Client from "../../deps.ts"; 2 | import { connect } from "../connect.ts"; 3 | import { withDevenv } from "./steps.ts"; 4 | 5 | connect(async (client: Client) => { 6 | const ctr = withDevenv( 7 | client 8 | .pipeline("nix-installer") 9 | .container() 10 | .from("alpine") 11 | .withExec(["apk", "add", "curl"]) 12 | ); 13 | 14 | const result = await ctr.stdout(); 15 | 16 | console.log(result); 17 | }); 18 | -------------------------------------------------------------------------------- /.fluentci/fixtures/workflow.yml: -------------------------------------------------------------------------------- 1 | # Do not edit this file directly. It is generated by https://deno.land/x/fluent_github_actions 2 | 3 | name: Tests 4 | on: 5 | push: 6 | branches: 7 | - main 8 | jobs: 9 | tests: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v2 13 | - name: Setup Fluent CI 14 | uses: fluentci-io/setup-fluentci@v2 15 | - name: Run Dagger Pipelines 16 | run: fluentci run deno_pipeline fmt lint test 17 | -------------------------------------------------------------------------------- /.fluentci/src/dagger/runner.ts: -------------------------------------------------------------------------------- 1 | import pipeline from "./pipeline.ts"; 2 | import { parse, camelCase, snakeCase } from "../../deps.ts"; 3 | 4 | const args = parse(Deno.args.map((x) => x.split(" ")).flat()); 5 | 6 | if (!Array.isArray(Deno.args)) { 7 | for (const param of Object.keys(args) 8 | .filter((x) => x !== "_") 9 | .map((x) => snakeCase(x).toUpperCase())) { 10 | Deno.env.set(param, args[camelCase(param)]); 11 | } 12 | } 13 | 14 | await pipeline( 15 | ".", 16 | Array.isArray(Deno.args) ? Deno.args : (args._ as string[]) 17 | ); 18 | -------------------------------------------------------------------------------- /.fluentci/src/dagger/list_jobs.ts: -------------------------------------------------------------------------------- 1 | import { brightGreen, stringifyTree } from "../../deps.ts"; 2 | import { runnableJobs, jobDescriptions, Job } from "./jobs.ts"; 3 | 4 | const tree = { 5 | name: brightGreen("deno_pipeline"), 6 | children: (Object.keys(runnableJobs) as Job[]).map((job) => ({ 7 | name: jobDescriptions[job] 8 | ? `${brightGreen(job)} - ${jobDescriptions[job]}` 9 | : brightGreen(job), 10 | children: [], 11 | })), 12 | }; 13 | 14 | console.log( 15 | stringifyTree( 16 | tree, 17 | (t) => t.name, 18 | (t) => t.children 19 | ) 20 | ); 21 | -------------------------------------------------------------------------------- /.fluentci/sdk/nix/example_with_devbox_pkg.ts: -------------------------------------------------------------------------------- 1 | import Client from "../../deps.ts"; 2 | import { connect } from "../connect.ts"; 3 | import { withDevboxExec, withPackageFromDevbox } from "./steps.ts"; 4 | 5 | connect(async (client: Client) => { 6 | const ctr = withDevboxExec( 7 | withPackageFromDevbox( 8 | client 9 | .pipeline("nix-installer") 10 | .container() 11 | .from("alpine") 12 | .withExec(["apk", "add", "curl", "bash"]), 13 | ["gh"] 14 | ), 15 | ["gh version"] 16 | ); 17 | 18 | const result = await ctr.stdout(); 19 | 20 | console.log(result); 21 | }); 22 | -------------------------------------------------------------------------------- /.fluentci/flake.nix: -------------------------------------------------------------------------------- 1 | { 2 | description = "A Nix-flake-based Deno development environment"; 3 | 4 | inputs = { 5 | nixpkgs.url = "github:nixos/nixpkgs/release-23.05"; 6 | flake-utils.url = "github:numtide/flake-utils"; 7 | }; 8 | 9 | outputs = { 10 | self, 11 | nixpkgs, 12 | flake-utils, 13 | }: 14 | flake-utils.lib.eachDefaultSystem 15 | (system: let 16 | pkgs = import nixpkgs { 17 | inherit system; 18 | }; 19 | in { 20 | devShells.default = pkgs.mkShell { 21 | buildInputs = [ 22 | pkgs.deno 23 | ]; 24 | }; 25 | }); 26 | } -------------------------------------------------------------------------------- /.fluentci/sdk/nix/example_with_devbox.ts: -------------------------------------------------------------------------------- 1 | import Client from "../../deps.ts"; 2 | import { connect } from "../connect.ts"; 3 | import { withDevbox } from "./steps.ts"; 4 | 5 | connect(async (client: Client) => { 6 | const ctr = withDevbox( 7 | client 8 | .pipeline("nix-installer") 9 | .container() 10 | .from("alpine") 11 | .withExec(["apk", "add", "curl", "bash"]) 12 | ) 13 | .withExec(["devbox", "global", "add", "gh"]) 14 | .withExec(["sh", "-c", 'eval "$(devbox global shellenv)" && gh version']); 15 | 16 | const result = await ctr.stdout(); 17 | 18 | console.log(result); 19 | }); 20 | -------------------------------------------------------------------------------- /.fluentci/deno.json: -------------------------------------------------------------------------------- 1 | { 2 | "importMap": "import_map.json", 3 | "tasks": { 4 | "esm:add": "deno run -A https://esm.sh/v128 add", 5 | "esm:update": "deno run -A https://esm.sh/v128 update", 6 | "esm:remove": "deno run -A https://esm.sh/v128 remove" 7 | }, 8 | "fmt": { 9 | "exclude": [ 10 | "example/", 11 | ".fluentci/", 12 | "gen/" 13 | ] 14 | }, 15 | "lint": { 16 | "exclude": [ 17 | "example/", 18 | ".fluentci/", 19 | "gen/" 20 | ] 21 | }, 22 | "test": { 23 | "exclude": [ 24 | "example/", 25 | ".fluentci/", 26 | "gen/" 27 | ] 28 | } 29 | } -------------------------------------------------------------------------------- /src/cmd/list.ts: -------------------------------------------------------------------------------- 1 | import { Table, dayjs } from "../../deps.ts"; 2 | import * as workspaces from "../workspaces.ts"; 3 | 4 | async function list() { 5 | const results = await workspaces.list(); 6 | const table = new Table(); 7 | 8 | table.header(["NAME", "STATUS", "CONTAINER ID", "CREATED", "UPDATED"]); 9 | 10 | for (const item of results) { 11 | table.push([ 12 | item.value.name, 13 | item.value.status, 14 | item.value.containerId?.slice(0, 12), 15 | dayjs(item.value.createdAt).fromNow(), 16 | dayjs(item.value.updatedAt).fromNow(), 17 | ]); 18 | } 19 | 20 | table.render(); 21 | } 22 | 23 | export default list; 24 | -------------------------------------------------------------------------------- /.fluentci/fixtures/buildspec.yml: -------------------------------------------------------------------------------- 1 | # Do not edit this file directly. It is generated by https://deno.land/x/fluent_aws_codepipeline 2 | 3 | version: 0.2 4 | phases: 5 | install: 6 | commands: 7 | - curl -fsSL https://deno.land/x/install/install.sh | sh 8 | - export DENO_INSTALL="$HOME/.deno" 9 | - export PATH="$DENO_INSTALL/bin:$PATH" 10 | - deno install -A -r https://cli.fluentci.io -n fluentci 11 | - curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.9.3 sh 12 | - mv bin/dagger /usr/local/bin 13 | - dagger version 14 | build: 15 | commands: 16 | - fluentci run deno_pipeline fmt lint test 17 | post_build: 18 | commands: 19 | - echo Build completed on `date` 20 | -------------------------------------------------------------------------------- /.fluentci/src/github/config.ts: -------------------------------------------------------------------------------- 1 | import { JobSpec, Workflow } from "fluent_github_actions"; 2 | 3 | export function generateYaml(): Workflow { 4 | const workflow = new Workflow("Tests"); 5 | 6 | const push = { 7 | branches: ["main"], 8 | }; 9 | 10 | const tests: JobSpec = { 11 | "runs-on": "ubuntu-latest", 12 | steps: [ 13 | { 14 | uses: "actions/checkout@v2", 15 | }, 16 | { 17 | name: "Setup Fluent CI", 18 | uses: "fluentci-io/setup-fluentci@v2", 19 | }, 20 | { 21 | name: "Run Dagger Pipelines", 22 | run: "fluentci run deno_pipeline fmt lint test", 23 | }, 24 | ], 25 | }; 26 | 27 | workflow.on({ push }).jobs({ tests }); 28 | return workflow; 29 | } 30 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [pocketenv-io] 4 | patreon: # Replace with a single Patreon username 5 | open_collective: # Replace with a single Open Collective username 6 | ko_fi: # Replace with a single Ko-fi username 7 | tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 8 | community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 9 | liberapay: # Replace with a single Liberapay username 10 | issuehunt: # Replace with a single IssueHunt username 11 | otechie: # Replace with a single Otechie username 12 | lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 13 | custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 14 | -------------------------------------------------------------------------------- /.fluentci/src/dagger/pipeline.ts: -------------------------------------------------------------------------------- 1 | import { uploadContext } from "../../deps.ts"; 2 | import * as jobs from "./jobs.ts"; 3 | 4 | const { fmt, lint, test, runnableJobs, exclude } = jobs; 5 | 6 | export default async function pipeline(src = ".", args: string[] = []) { 7 | if (Deno.env.has("FLUENTCI_SESSION_ID")) { 8 | await uploadContext(src, exclude); 9 | } 10 | if (args.length > 0) { 11 | await runSpecificJobs(args as jobs.Job[]); 12 | return; 13 | } 14 | 15 | await fmt(src); 16 | await lint(src); 17 | await test(src); 18 | } 19 | 20 | async function runSpecificJobs(args: jobs.Job[]) { 21 | for (const name of args) { 22 | const job = runnableJobs[name]; 23 | if (!job) { 24 | throw new Error(`Job ${name} not found`); 25 | } 26 | await job("."); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/lib.ts: -------------------------------------------------------------------------------- 1 | export async function spawn( 2 | name: string, 3 | args: string[], 4 | stdout: "inherit" | "piped" = "inherit", 5 | cwd = Deno.cwd() 6 | ): Promise { 7 | const command = new Deno.Command(name, { 8 | args, 9 | stdout, 10 | stderr: "inherit", 11 | cwd, 12 | }); 13 | const child = command.spawn(); 14 | await child.status; 15 | if (stdout === "piped") { 16 | const output = await child.output(); 17 | return new TextDecoder().decode(output.stdout).trim(); 18 | } 19 | return ""; 20 | } 21 | 22 | export async function getDefaultGithubBranch(repo: string) { 23 | // https://api.github.com/repos/pocketenv-io/nix 24 | const data = await fetch(`https://api.github.com/repos/${repo}`).then((res) => 25 | res.json() 26 | ); 27 | return data.default_branch; 28 | } 29 | -------------------------------------------------------------------------------- /.fluentci/fixtures/azure-pipelines.yml: -------------------------------------------------------------------------------- 1 | # Do not edit this file directly. It is generated by https://deno.land/x/fluent_azure_pipelines 2 | 3 | trigger: 4 | - main 5 | pool: 6 | name: Default 7 | vmImage: ubuntu-latest 8 | steps: 9 | - script: | 10 | curl -fsSL https://deno.land/x/install/install.sh | sh 11 | export DENO_INSTALL="$HOME/.deno" 12 | export PATH="$DENO_INSTALL/bin:$PATH" 13 | displayName: Install Deno 14 | - script: deno install -A -r https://cli.fluentci.io -n fluentci 15 | displayName: Setup Fluent CI CLI 16 | - script: | 17 | curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.9.3 sh 18 | sudo mv bin/dagger /usr/local/bin 19 | dagger version 20 | displayName: Setup Dagger 21 | - script: fluentci run deno_pipeline fmt lint test 22 | displayName: Run Dagger Pipelines 23 | -------------------------------------------------------------------------------- /.fluentci/fixtures/.gitlab-ci.yml: -------------------------------------------------------------------------------- 1 | # Do not edit this file directly. It is generated by https://deno.land/x/fluent_gitlab_ci 2 | 3 | .docker: 4 | image: denoland/deno:alpine 5 | services: 6 | - docker:${DOCKER_VERSION}-dind 7 | variables: 8 | DOCKER_HOST: tcp://docker:2376 9 | DOCKER_TLS_VERIFY: "1" 10 | DOCKER_TLS_CERTDIR: /certs 11 | DOCKER_CERT_PATH: /certs/client 12 | DOCKER_DRIVER: overlay2 13 | DOCKER_VERSION: 20.10.16 14 | 15 | .dagger: 16 | extends: .docker 17 | before_script: 18 | - apk add docker-cli curl unzip 19 | - deno install -A -r https://cli.fluentci.io -n fluentci 20 | - curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.9.3 sh 21 | - mv bin/dagger /usr/local/bin 22 | - dagger version 23 | 24 | tests: 25 | extends: .dagger 26 | script: 27 | - fluentci run deno_pipeline fmt lint test 28 | 29 | -------------------------------------------------------------------------------- /.github/workflows/flakehub-publish-tagged.yml: -------------------------------------------------------------------------------- 1 | name: "Publish tags to FlakeHub" 2 | on: 3 | push: 4 | tags: 5 | - "v?[0-9]+.[0-9]+.[0-9]+*" 6 | workflow_dispatch: 7 | inputs: 8 | tag: 9 | description: "The existing tag to publish to FlakeHub" 10 | type: "string" 11 | required: true 12 | jobs: 13 | flakehub-publish: 14 | runs-on: "ubuntu-latest" 15 | permissions: 16 | id-token: "write" 17 | contents: "read" 18 | steps: 19 | - uses: "actions/checkout@v3" 20 | with: 21 | ref: "${{ (inputs.tag != null) && format('refs/tags/{0}', inputs.tag) || '' }}" 22 | - uses: "DeterminateSystems/nix-installer-action@main" 23 | - uses: "DeterminateSystems/flakehub-push@main" 24 | with: 25 | visibility: "public" 26 | name: "pocketenv-io/pocketenv" 27 | tag: "${{ inputs.tag }}" 28 | -------------------------------------------------------------------------------- /src/cmd/shell.ts: -------------------------------------------------------------------------------- 1 | import { pkgx } from "../../deps.ts"; 2 | import { spawn } from "../lib.ts"; 3 | import { existsSync } from "node:fs"; 4 | import * as workspaces from "../workspaces.ts"; 5 | 6 | async function shell(workspace?: string) { 7 | let workdir = Deno.cwd(); 8 | 9 | if (workspace) { 10 | const result = await workspaces.get(workspace); 11 | if (!result) { 12 | console.error(`🚨 Workspace ${workspace} not found.`); 13 | Deno.exit(1); 14 | } 15 | workdir = result.path; 16 | } 17 | 18 | if (existsSync(`${workdir}/.pocketenv`)) { 19 | workdir = `${workdir}/.pocketenv`; 20 | } 21 | 22 | const containerId = await spawn( 23 | "sh", 24 | ["-c", 'pkgx terraform output -json | pkgx jq -r ".container_id.value"'], 25 | "piped", 26 | workdir 27 | ); 28 | await pkgx.run(`docker exec -it ${containerId} bash`); 29 | } 30 | 31 | export default shell; 32 | -------------------------------------------------------------------------------- /.fluentci/sdk/builder.ts: -------------------------------------------------------------------------------- 1 | import { createGQLClient } from "./client.ts"; 2 | import { Context } from "./context.ts"; 3 | 4 | /** 5 | * @hidden 6 | * 7 | * Initialize a default client context from environment. 8 | */ 9 | export function initDefaultContext(): Context { 10 | let ctx = new Context(); 11 | 12 | // Prefer DAGGER_SESSION_PORT if set 13 | const daggerSessionPort = Deno.env.get("DAGGER_SESSION_PORT"); 14 | if (daggerSessionPort) { 15 | const sessionToken = Deno.env.get("DAGGER_SESSION_TOKEN"); 16 | if (!sessionToken) { 17 | throw new Error( 18 | "DAGGER_SESSION_TOKEN must be set when using DAGGER_SESSION_PORT" 19 | ); 20 | } 21 | 22 | ctx = new Context({ 23 | client: createGQLClient(Number(daggerSessionPort), sessionToken), 24 | }); 25 | } else { 26 | throw new Error("DAGGER_SESSION_PORT must be set"); 27 | } 28 | 29 | return ctx; 30 | } 31 | -------------------------------------------------------------------------------- /src/workspaces.ts: -------------------------------------------------------------------------------- 1 | import { POCKETENV_KV_PREFIX } from "./consts.ts"; 2 | import { Workspace } from "./type.ts"; 3 | import { _ } from "../deps.ts"; 4 | 5 | const kv = await Deno.openKv(); 6 | 7 | export async function save(path: string, data: Workspace) { 8 | await kv.set([POCKETENV_KV_PREFIX, "workspaces", path], data); 9 | await kv.set([POCKETENV_KV_PREFIX, "workspaces", data.name], data); 10 | } 11 | 12 | export async function get(path: string) { 13 | const { value } = await kv.get([ 14 | POCKETENV_KV_PREFIX, 15 | "workspaces", 16 | path, 17 | ]); 18 | return value; 19 | } 20 | 21 | export async function list() { 22 | const iter = kv.list({ 23 | prefix: [POCKETENV_KV_PREFIX, "workspaces"], 24 | }); 25 | const workspaces = []; 26 | for await (const res of iter) workspaces.push(res); 27 | return _.uniqBy(workspaces, (x: Deno.KvEntry) => x.value.path); 28 | } 29 | -------------------------------------------------------------------------------- /.fluentci/src/aws/config.ts: -------------------------------------------------------------------------------- 1 | import { FluentAWSCodePipeline } from "../../deps.ts"; 2 | 3 | export function generateYaml(): FluentAWSCodePipeline.BuildSpec { 4 | const buildspec = new FluentAWSCodePipeline.BuildSpec(); 5 | buildspec 6 | .phase("install", { 7 | commands: [ 8 | "curl -fsSL https://deno.land/x/install/install.sh | sh", 9 | 'export DENO_INSTALL="$HOME/.deno"', 10 | 'export PATH="$DENO_INSTALL/bin:$PATH"', 11 | "deno install -A -r https://cli.fluentci.io -n fluentci", 12 | "curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.9.3 sh", 13 | "mv bin/dagger /usr/local/bin", 14 | "dagger version", 15 | ], 16 | }) 17 | .phase("build", { 18 | commands: ["fluentci run deno_pipeline fmt lint test"], 19 | }) 20 | .phase("post_build", { 21 | commands: ["echo Build completed on `date`"], 22 | }); 23 | return buildspec; 24 | } 25 | -------------------------------------------------------------------------------- /src/cmd/logs.ts: -------------------------------------------------------------------------------- 1 | import { pkgx } from "../../deps.ts"; 2 | import { spawn } from "../lib.ts"; 3 | import { existsSync } from "node:fs"; 4 | import * as workspaces from "../workspaces.ts"; 5 | 6 | async function logs({ follow }: { follow?: boolean }, workspace?: string) { 7 | let workdir = Deno.cwd(); 8 | 9 | if (workspace) { 10 | const result = await workspaces.get(workspace); 11 | if (!result) { 12 | console.error(`🚨 Workspace ${workspace} not found.`); 13 | Deno.exit(1); 14 | } 15 | workdir = result.path; 16 | } 17 | 18 | if (existsSync(`${workdir}/.pocketenv`)) { 19 | workdir = `${workdir}/.pocketenv`; 20 | } 21 | 22 | const containerId = await spawn( 23 | "sh", 24 | ["-c", 'pkgx terraform output -json | pkgx jq -r ".container_id.value"'], 25 | "piped", 26 | workdir 27 | ); 28 | await pkgx.run(`docker logs ${containerId} ${follow ? "-f" : ""}`); 29 | } 30 | 31 | export default logs; 32 | -------------------------------------------------------------------------------- /.fluentci/fixtures/config.yml: -------------------------------------------------------------------------------- 1 | # Do not edit this file directly. It is generated by https://deno.land/x/fluent_circleci 2 | 3 | version: 2.1 4 | jobs: 5 | tests: 6 | steps: 7 | - checkout 8 | - run: sudo apt-get update && sudo apt-get install -y curl unzip 9 | - run: | 10 | curl -fsSL https://deno.land/x/install/install.sh | sh 11 | export DENO_INSTALL="$HOME/.deno" 12 | export PATH="$DENO_INSTALL/bin:$PATH" 13 | - run: deno install -A -r https://cli.fluentci.io -n fluentci 14 | - run: | 15 | curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.9.3 sh 16 | sudo mv bin/dagger /usr/local/bin 17 | dagger version 18 | - run: 19 | name: Run Dagger Pipelines 20 | command: fluentci run deno_pipeline fmt lint test 21 | machine: 22 | image: ubuntu-2004:2023.07.1 23 | workflows: 24 | dagger: 25 | jobs: 26 | - tests 27 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | # Do not edit this file directly. It is generated by https://deno.land/x/fluent_github_actions 2 | 3 | name: ci 4 | on: 5 | push: 6 | branches: 7 | - main 8 | jobs: 9 | test: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v3 13 | - name: Setup Fluent CI 14 | uses: fluentci-io/setup-fluentci@v5 15 | with: 16 | wasm: true 17 | plugin: deno 18 | args: | 19 | fmt 20 | lint 21 | env: 22 | GITHUB_ACCESS_TOKEN: ${{ secrets.GITHUB_TOKEN }} 23 | - name: Run tests 24 | run: | 25 | deno run -A --unstable-kv main.ts init -t tsirysndr/base-workspace demo-workspace 26 | deno run -A --unstable-kv main.ts up 27 | docker ps 28 | - name: Destroy 29 | run: | 30 | deno run -A --unstable-kv main.ts list 31 | deno run -A --unstable-kv main.ts down 32 | -------------------------------------------------------------------------------- /.github/workflows/flakestry-publish.yml: -------------------------------------------------------------------------------- 1 | name: "Publish a flake to flakestry" 2 | on: 3 | push: 4 | tags: 5 | - "v?[0-9]+.[0-9]+.[0-9]+" 6 | - "v?[0-9]+.[0-9]+" 7 | workflow_dispatch: 8 | inputs: 9 | tag: 10 | description: "The existing tag to publish" 11 | type: "string" 12 | required: true 13 | jobs: 14 | publish-flake: 15 | runs-on: ubuntu-latest 16 | permissions: 17 | id-token: "write" 18 | contents: "read" 19 | steps: 20 | - uses: actions/checkout@v3 21 | - name: Setup Fluent CI 22 | uses: fluentci-io/setup-fluentci@v5 23 | with: 24 | wasm: true 25 | plugin: flakestry 26 | args: publish 27 | env: 28 | VERSION: ${{ inputs.tag || github.ref_name }} 29 | GH_TOKEN: ${{ github.token }} 30 | ACTIONS_ID_TOKEN_REQUEST_TOKEN: ${{ env.ACTIONS_ID_TOKEN_REQUEST_TOKEN }} 31 | ACTIONS_ID_TOKEN_REQUEST_URL: ${{ env.ACTIONS_ID_TOKEN_REQUEST_URL }} 32 | REF: ${{ github.sha }} 33 | -------------------------------------------------------------------------------- /.fluentci/LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2023 Tsiry Sandratraina 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in all 11 | copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 19 | SOFTWARE. -------------------------------------------------------------------------------- /.fluentci/.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | // For format details, see https://aka.ms/devcontainer.json. For config options, see the 2 | // README at: https://github.com/devcontainers/templates/tree/main/src/debian 3 | { 4 | "name": "Debian", 5 | // Or use a Dockerfile or Docker Compose file. More info: https://containers.dev/guide/dockerfile 6 | "image": "mcr.microsoft.com/devcontainers/base:bullseye", 7 | "features": { 8 | "ghcr.io/devcontainers/features/github-cli:1": {}, 9 | "ghcr.io/devcontainers/features/nix:1": {} 10 | }, 11 | 12 | // Features to add to the dev container. More info: https://containers.dev/features. 13 | // "features": {}, 14 | 15 | // Use 'forwardPorts' to make a list of ports inside the container available locally. 16 | // "forwardPorts": [], 17 | 18 | // Use 'postCreateCommand' to run commands after the container is created. 19 | "postCreateCommand": "nix develop --experimental-features \"nix-command flakes\"" 20 | // Configure tool-specific properties. 21 | // "customizations": {}, 22 | 23 | // Uncomment to connect as root instead. More info: https://aka.ms/dev-containers-non-root. 24 | // "remoteUser": "root" 25 | } 26 | -------------------------------------------------------------------------------- /.fluentci/src/circleci/config.ts: -------------------------------------------------------------------------------- 1 | import { FluentCircleCI } from "../../deps.ts"; 2 | 3 | export function generateYaml(): FluentCircleCI.CircleCI { 4 | const circleci = new FluentCircleCI.CircleCI(); 5 | 6 | const tests = new FluentCircleCI.Job() 7 | .machine({ image: "ubuntu-2004:2023.07.1" }) 8 | .steps([ 9 | "checkout", 10 | { 11 | run: "sudo apt-get update && sudo apt-get install -y curl unzip", 12 | }, 13 | { 14 | run: `\ 15 | curl -fsSL https://deno.land/x/install/install.sh | sh 16 | export DENO_INSTALL="$HOME/.deno" 17 | export PATH="$DENO_INSTALL/bin:$PATH"`, 18 | }, 19 | { 20 | run: "deno install -A -r https://cli.fluentci.io -n fluentci", 21 | }, 22 | { 23 | run: `\ 24 | curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.9.3 sh 25 | sudo mv bin/dagger /usr/local/bin 26 | dagger version`, 27 | }, 28 | { 29 | run: { 30 | name: "Run Dagger Pipelines", 31 | command: "fluentci run deno_pipeline fmt lint test", 32 | }, 33 | }, 34 | ]); 35 | 36 | circleci.jobs({ tests }).workflow("dagger", ["tests"]); 37 | 38 | return circleci; 39 | } 40 | -------------------------------------------------------------------------------- /flake.nix: -------------------------------------------------------------------------------- 1 | { 2 | description = "Manage your development environment with ease ✨"; 3 | 4 | inputs = { 5 | utils.url = "github:numtide/flake-utils"; 6 | deno2nix = { 7 | url = "github:tsirysndr/deno2nix"; 8 | inputs.nixpkgs.follows = "nixpkgs"; 9 | }; 10 | }; 11 | 12 | outputs = { self, nixpkgs, utils, deno2nix }: 13 | utils.lib.eachDefaultSystem (system: 14 | let 15 | pkgs = import nixpkgs { 16 | inherit system; 17 | overlays = [ deno2nix.overlays.default ]; 18 | }; 19 | in 20 | rec { 21 | 22 | apps.default = utils.lib.mkApp { 23 | drv = packages.default; 24 | }; 25 | 26 | packages.default = pkgs.deno2nix.mkExecutable { 27 | pname = "pocketenv"; 28 | version = "0.1.5"; 29 | 30 | src = ./.; 31 | lockfile = "./deno.lock"; 32 | config = "./deno.json"; 33 | entrypoint = "./main.ts"; 34 | allow = { 35 | all = true; 36 | }; 37 | }; 38 | 39 | devShell = pkgs.mkShell { 40 | buildInputs = with pkgs; [ 41 | deno 42 | ]; 43 | }; 44 | }); 45 | } 46 | -------------------------------------------------------------------------------- /.fluentci/src/gitlab/config.ts: -------------------------------------------------------------------------------- 1 | import { FluentGitlabCI } from "../../deps.ts"; 2 | 3 | export function generateYaml(): FluentGitlabCI.GitlabCI { 4 | const docker = new FluentGitlabCI.Job() 5 | .image("denoland/deno:alpine") 6 | .services(["docker:${DOCKER_VERSION}-dind"]) 7 | .variables({ 8 | DOCKER_HOST: "tcp://docker:2376", 9 | DOCKER_TLS_VERIFY: "1", 10 | DOCKER_TLS_CERTDIR: "/certs", 11 | DOCKER_CERT_PATH: "/certs/client", 12 | DOCKER_DRIVER: "overlay2", 13 | DOCKER_VERSION: "20.10.16", 14 | }); 15 | 16 | const dagger = new FluentGitlabCI.Job().extends(".docker").beforeScript( 17 | ` 18 | apk add docker-cli curl unzip 19 | deno install -A -r https://cli.fluentci.io -n fluentci 20 | curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.9.3 sh 21 | mv bin/dagger /usr/local/bin 22 | dagger version 23 | ` 24 | ); 25 | 26 | const tests = new FluentGitlabCI.Job() 27 | .extends(".dagger") 28 | .script("fluentci run deno_pipeline fmt lint test"); 29 | 30 | return new FluentGitlabCI.GitlabCI() 31 | .addJob(".docker", docker) 32 | .addJob(".dagger", dagger) 33 | .addJob("tests", tests); 34 | } 35 | -------------------------------------------------------------------------------- /deps.ts: -------------------------------------------------------------------------------- 1 | import * as pkgx from "./src/pkgx.ts"; 2 | export { pkgx }; 3 | import * as semver from "jsr:@std/semver"; 4 | export { semver }; 5 | export { 6 | bold, 7 | brightGreen, 8 | brightMagenta, 9 | cyan, 10 | gray, 11 | green, 12 | magenta, 13 | red, 14 | yellow, 15 | } from "jsr:@std/fmt/colors"; 16 | export { Command } from "jsr:@cliffy/command@1.0.0-rc.7"; 17 | export { 18 | Checkbox, 19 | Confirm, 20 | Input, 21 | prompt, 22 | } from "jsr:@cliffy/prompt@1.0.0-rc.7"; 23 | export { 24 | SpinnerTypes, 25 | TerminalSpinner, 26 | } from "https://cdn.jsdelivr.net/gh/will-weiss/spinners@master/mod.ts"; 27 | import dir from "https://deno.land/x/dir@1.5.2/mod.ts"; 28 | export { dir }; 29 | import Logger from "https://deno.land/x/logger@v1.1.3/logger.ts"; 30 | export { Logger }; 31 | import dayjs from "npm:dayjs"; 32 | import relativeTime from "npm:dayjs/plugin/relativeTime.js"; 33 | dayjs.extend(relativeTime); 34 | export { dayjs }; 35 | export { Cell, Table } from "jsr:@cliffy/table@1.0.0-rc.7"; 36 | export { generateName } from "https://deno.land/x/docker_names@v1.1.0/mod.ts "; 37 | import * as _ from "https://cdn.skypack.dev/lodash"; 38 | export { _ }; 39 | export { open } from "https://deno.land/x/open@v0.0.6/index.ts"; 40 | -------------------------------------------------------------------------------- /.fluentci/src/azure/config.ts: -------------------------------------------------------------------------------- 1 | import { FluentAzurePipelines } from "../../deps.ts"; 2 | 3 | export function generateYaml(): FluentAzurePipelines.AzurePipeline { 4 | const azurePipeline = new FluentAzurePipelines.AzurePipeline(); 5 | 6 | const installDeno = `\ 7 | curl -fsSL https://deno.land/x/install/install.sh | sh 8 | export DENO_INSTALL="$HOME/.deno" 9 | export PATH="$DENO_INSTALL/bin:$PATH" 10 | `; 11 | 12 | const setupDagger = `\ 13 | curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.9.3 sh 14 | sudo mv bin/dagger /usr/local/bin 15 | dagger version 16 | `; 17 | 18 | azurePipeline 19 | .trigger(["main"]) 20 | .pool({ 21 | name: "Default", 22 | vmImage: "ubuntu-latest", 23 | }) 24 | .step({ 25 | script: installDeno, 26 | displayName: "Install Deno", 27 | }) 28 | .step({ 29 | script: "deno install -A -r https://cli.fluentci.io -n fluentci", 30 | displayName: "Setup Fluent CI CLI", 31 | }) 32 | .step({ 33 | script: setupDagger, 34 | displayName: "Setup Dagger", 35 | }) 36 | .step({ 37 | script: "fluentci run deno_pipeline fmt lint test", 38 | displayName: "Run Dagger Pipelines", 39 | }); 40 | return azurePipeline; 41 | } 42 | -------------------------------------------------------------------------------- /.fluentci/src/dagger/lib.ts: -------------------------------------------------------------------------------- 1 | import { dag } from '../../sdk/client.gen.ts'; 2 | import { 3 | Directory, 4 | DirectoryID, 5 | Secret, 6 | SecretID, 7 | } from "../../deps.ts"; 8 | 9 | export const getDirectory = async ( 10 | src: string | Directory | undefined = "." 11 | ) => { 12 | if (typeof src === "string") { 13 | try { 14 | const directory = dag.loadDirectoryFromID(src as DirectoryID); 15 | await directory.id(); 16 | return directory; 17 | } catch (_) { 18 | return dag.host().directory(src); 19 | } 20 | } 21 | return src instanceof Directory ? src : dag.host().directory(src); 22 | }; 23 | 24 | export const getDenoDeployToken = async ( 25 | token?: string | Secret 26 | ) => { 27 | if (Deno.env.get("DENO_DEPLOY_TOKEN")) { 28 | return dag.setSecret( 29 | "DENO_DEPLOY_TOKEN", 30 | Deno.env.get("DENO_DEPLOY_TOKEN")! 31 | ); 32 | } 33 | if (token && typeof token === "string") { 34 | try { 35 | const secret = dag.loadSecretFromID(token as SecretID); 36 | await secret.id(); 37 | return secret; 38 | } catch (_) { 39 | return dag.setSecret("DENO_DEPLOY_TOKEN", token); 40 | } 41 | } 42 | if (token && token instanceof Secret) { 43 | return token; 44 | } 45 | return undefined; 46 | }; 47 | -------------------------------------------------------------------------------- /src/cmd/down.ts: -------------------------------------------------------------------------------- 1 | import { pkgx, Logger } from "../../deps.ts"; 2 | import * as workspaces from "../workspaces.ts"; 3 | import { existsSync } from "node:fs"; 4 | 5 | async function down({ ask }: { ask?: boolean }, workspace?: string) { 6 | const logger = new Logger(); 7 | const args = []; 8 | 9 | if (!ask) { 10 | args.push("-auto-approve"); 11 | } 12 | 13 | let workdir = Deno.cwd(); 14 | 15 | if (workspace) { 16 | const result = await workspaces.get(workspace); 17 | if (!result) { 18 | console.error(`Workspace ${workspace} not found.`); 19 | Deno.exit(1); 20 | } 21 | workdir = result.path; 22 | } 23 | 24 | if (existsSync(`${workdir}/.pocketenv`)) { 25 | workdir = `${workdir}/.pocketenv`; 26 | } 27 | 28 | await pkgx.run(`terraform destroy ${args.join(" ")}`, "inherit", workdir); 29 | 30 | const result = await workspaces.get( 31 | workspace || workdir.replace(/\/.pocketenv$/, "") 32 | ); 33 | 34 | if (!result) { 35 | logger.warn("Workspace not found"); 36 | } 37 | 38 | await workspaces.save(result?.path || Deno.cwd(), { 39 | containerId: null, 40 | name: result!.name, 41 | path: result?.path || Deno.cwd(), 42 | status: "Stopped", 43 | createdAt: result!.createdAt, 44 | updatedAt: new Date().toISOString(), 45 | }); 46 | } 47 | 48 | export default down; 49 | -------------------------------------------------------------------------------- /.github/workflows/release.yml: -------------------------------------------------------------------------------- 1 | name: release 2 | on: 3 | release: 4 | types: [created] 5 | 6 | jobs: 7 | build: 8 | name: release 9 | runs-on: ubuntu-latest 10 | strategy: 11 | matrix: 12 | target: 13 | - x86_64-unknown-linux-gnu 14 | - aarch64-unknown-linux-gnu 15 | - x86_64-apple-darwin 16 | - aarch64-apple-darwin 17 | steps: 18 | - uses: actions/checkout@v3 19 | - name: Setup Fluent CI 20 | uses: fluentci-io/setup-fluentci@v5 21 | - name: Set env 22 | run: echo "RELEASE_VERSION=${GITHUB_REF#refs/*/}" >> $GITHUB_ENV 23 | - name: Build 24 | run: | 25 | rm .fluentci/deno.lock 26 | fluentci run . compile 27 | env: 28 | TAG: ${{ env.RELEASE_VERSION }} 29 | TARGET: ${{ matrix.target }} 30 | DAGGER_CLOUD_TOKEN: ${{ secrets.DAGGER_CLOUD_TOKEN }} 31 | - name: Upload release assets 32 | run: | 33 | for ext in tar.gz tar.gz.sha256; do 34 | export FILE=/app/pocketenv_${{ env.RELEASE_VERSION }}_${{ matrix.target }}.$ext 35 | fluentci run github_pipeline release_upload 36 | done 37 | env: 38 | TAG: ${{ env.RELEASE_VERSION }} 39 | GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} 40 | DAGGER_CLOUD_TOKEN: ${{ secrets.DAGGER_CLOUD_TOKEN }} 41 | -------------------------------------------------------------------------------- /.fluentci/sdk/connect.ts: -------------------------------------------------------------------------------- 1 | import { Writable } from "node:stream"; 2 | import { Client } from "./client.gen.ts"; 3 | import { Context } from "./context.ts"; 4 | 5 | /** 6 | * ConnectOpts defines option used to connect to an engine. 7 | */ 8 | export interface ConnectOpts { 9 | /** 10 | * Use to overwrite Dagger workdir 11 | * @defaultValue process.cwd() 12 | */ 13 | Workdir?: string; 14 | /** 15 | * Enable logs output 16 | * @example 17 | * LogOutput 18 | * ```ts 19 | * connect(async (client: Client) => { 20 | const source = await client.host().workdir().id() 21 | ... 22 | }, {LogOutput: process.stdout}) 23 | ``` 24 | */ 25 | LogOutput?: Writable; 26 | } 27 | 28 | export type CallbackFct = (client: Client) => Promise; 29 | 30 | export interface ConnectParams { 31 | port: number; 32 | session_token: string; 33 | } 34 | 35 | /** 36 | * connect runs GraphQL server and initializes a 37 | * GraphQL client to execute query on it through its callback. 38 | * This implementation is based on the existing Go SDK. 39 | */ 40 | export async function connect( 41 | cb: CallbackFct, 42 | _config: ConnectOpts = {} 43 | ): Promise { 44 | const ctx = new Context(); 45 | const client = new Client({ ctx: ctx }); 46 | 47 | // Initialize connection 48 | await ctx.connection(); 49 | 50 | await cb(client).finally(() => { 51 | ctx.close(); 52 | }); 53 | } 54 | -------------------------------------------------------------------------------- /src/pkgx.ts: -------------------------------------------------------------------------------- 1 | import { spawn } from "./lib.ts"; 2 | 3 | export async function run( 4 | command: string, 5 | stdout: "piped" | "inherit" = "inherit", 6 | cwd = Deno.cwd(), 7 | ) { 8 | await setupPkgx(); 9 | const env: Record = {}; 10 | 11 | if (Deno.env.has("POCKETENV_CONTEXT")) { 12 | env.TF_VAR_context = Deno.env.get("POCKETENV_CONTEXT")!; 13 | } 14 | 15 | if (!Deno.env.has("POCKETENV_CONTEXT") && !Deno.env.has("POCKETENV_IMAGE")) { 16 | env.TF_VAR_context = "./build"; 17 | } 18 | 19 | if (Deno.env.has("POCKETENV_IMAGE")) { 20 | env.TF_VAR_image = Deno.env.get("POCKETENV_IMAGE")!; 21 | } 22 | 23 | const pkgx = new Deno.Command("pkgx", { 24 | args: command.trim().split(" "), 25 | stdin: "inherit", 26 | stdout, 27 | stderr: "inherit", 28 | env, 29 | cwd, 30 | }); 31 | const process = pkgx.spawn(); 32 | 33 | if (stdout === "inherit") { 34 | await process.status; 35 | return ""; 36 | } 37 | 38 | const output = await process.output(); 39 | return new TextDecoder().decode(output.stdout); 40 | } 41 | 42 | async function setupPkgx() { 43 | await spawn("sh", [ 44 | "-c", 45 | "type pkgx > /dev/null 2> /dev/null || curl -fsS https://pkgx.sh | sh", 46 | ]); 47 | } 48 | 49 | export async function installPackage(name: string) { 50 | await setupPkgx(); 51 | await spawn("sh", [ 52 | "-c", 53 | `type ${name} > /dev/null 2> /dev/null || pkgm install ${name}`, 54 | ]); 55 | } 56 | -------------------------------------------------------------------------------- /.fluentci/sdk/context.ts: -------------------------------------------------------------------------------- 1 | import { GraphQLClient } from "../deps.ts"; 2 | 3 | import { initDefaultContext } from "./builder.ts"; 4 | 5 | interface ContextConfig { 6 | client?: GraphQLClient; 7 | } 8 | 9 | /** 10 | * Context abstracts the connection to the engine. 11 | * 12 | * It's required to implement the default global SDK. 13 | * Its purpose is to store and returns the connection to the graphQL API, if 14 | * no connection is set, it can create its own. 15 | * 16 | * This is also useful for lazy evaluation with the default global client, 17 | * this one should only run the engine if it actually executes something. 18 | */ 19 | export class Context { 20 | private _client?: GraphQLClient; 21 | 22 | constructor(config?: ContextConfig) { 23 | this._client = config?.client; 24 | } 25 | 26 | /** 27 | * Returns a GraphQL client connected to the engine. 28 | * 29 | * If no client is set, it will create one. 30 | */ 31 | public async connection(): Promise { 32 | if (!this._client) { 33 | const defaultCtx = await initDefaultContext(); 34 | this._client = defaultCtx._client as GraphQLClient; 35 | } 36 | 37 | return this._client; 38 | } 39 | 40 | /** 41 | * Close the connection and the engine if this one was started by the node 42 | * SDK. 43 | */ 44 | public close(): void { 45 | // Reset client, so it can restart a new connection if necessary 46 | this._client = undefined; 47 | } 48 | } 49 | 50 | /** 51 | * Expose a default context for the global client 52 | */ 53 | export const defaultContext = new Context(); 54 | -------------------------------------------------------------------------------- /.fluentci/src/aws/README.md: -------------------------------------------------------------------------------- 1 | # AWS CodePipeline 2 | 3 | [![fluentci pipeline](https://img.shields.io/badge/dynamic/json?label=pkg.fluentci.io&labelColor=%23000&color=%23460cf1&url=https%3A%2F%2Fapi.fluentci.io%2Fv1%2Fpipeline%2Fdeno_pipeline&query=%24.version)](https://pkg.fluentci.io/deno_pipeline) 4 | [![deno module](https://shield.deno.dev/x/deno_pipeline)](https://deno.land/x/deno_pipeline) 5 | ![deno compatibility](https://shield.deno.dev/deno/^1.37) 6 | [![](https://img.shields.io/codecov/c/gh/fluent-ci-templates/deno-pipeline)](https://codecov.io/gh/fluent-ci-templates/deno-pipeline) 7 | 8 | The following command will generate a `buildspec.yml` file in your project: 9 | 10 | ```bash 11 | fluentci ac init -t deno_pipeline 12 | ``` 13 | 14 | Generated file: 15 | 16 | ```yaml 17 | # Do not edit this file directly. It is generated by https://deno.land/x/fluent_aws_codepipeline 18 | 19 | version: 0.2 20 | phases: 21 | install: 22 | commands: 23 | - curl -fsSL https://deno.land/x/install/install.sh | sh 24 | - export DENO_INSTALL="$HOME/.deno" 25 | - export PATH="$DENO_INSTALL/bin:$PATH" 26 | - deno install -A -r https://cli.fluentci.io -n fluentci 27 | - curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh 28 | - mv bin/dagger /usr/local/bin 29 | - dagger version 30 | build: 31 | commands: 32 | - fluentci run deno_pipeline fmt lint test 33 | post_build: 34 | commands: 35 | - echo Build completed on `date` 36 | 37 | ``` 38 | 39 | Feel free to edit the template generator at `.fluentci/src/aws/config.ts` to your needs. 40 | -------------------------------------------------------------------------------- /.fluentci/import_map.json: -------------------------------------------------------------------------------- 1 | { 2 | "imports": { 3 | "@fluentci.io/dagger": "https://sdk.fluentci.io/v0.1.9/mod.ts", 4 | "@dagger.io/dagger": "https://esm.sh/v128/*@dagger.io/dagger@0.8.4", 5 | "graphql-tag": "https://esm.sh/v128/graphql-tag@2.12.6", 6 | "graphql-request": "https://esm.sh/v128/graphql-request@6.1.0", 7 | "fluent_gitlab_ci": "https://deno.land/x/fluent_gitlab_ci@v0.4.2/mod.ts", 8 | "fluent_github_actions": "https://deno.land/x/fluent_github_actions@v0.2.1/mod.ts", 9 | "fluent_circleci": "https://deno.land/x/fluent_circleci@v0.2.5/mod.ts", 10 | "fluent_azure_pipelines": "https://deno.land/x/fluent_azure_pipelines@v0.2.0/mod.ts", 11 | "fluent_aws_codepipeline": "https://deno.land/x/fluent_aws_codepipeline@v0.2.3/mod.ts", 12 | "url": "node:url", 13 | "readline": "node:readline", 14 | "process": "node:process", 15 | "path": "node:path", 16 | "os": "node:os", 17 | "fs": "node:fs", 18 | "crypto": "node:crypto" 19 | }, 20 | "scopes": { 21 | "https://esm.sh/v128/": { 22 | "@lifeomic/axios-fetch": "https://esm.sh/v128/@lifeomic/axios-fetch@3.0.1", 23 | "adm-zip": "https://esm.sh/v128/adm-zip@0.5.10", 24 | "env-paths": "https://esm.sh/v128/env-paths@3.0.0", 25 | "execa": "https://esm.sh/v128/execa@7.1.1", 26 | "graphql-request": "https://esm.sh/v128/graphql-request@6.1.0", 27 | "graphql-tag": "https://esm.sh/v128/graphql-tag@2.12.6", 28 | "graphql": "https://esm.sh/v128/graphql@16.7.1", 29 | "node-color-log": "https://esm.sh/v128/node-color-log@10.0.2", 30 | "node-fetch": "https://esm.sh/v128/node-fetch@3.3.1", 31 | "tar": "https://esm.sh/v128/tar@6.1.15" 32 | } 33 | } 34 | } -------------------------------------------------------------------------------- /.fluentci/src/azure/README.md: -------------------------------------------------------------------------------- 1 | # Azure Pipelines 2 | 3 | [![fluentci pipeline](https://img.shields.io/badge/dynamic/json?label=pkg.fluentci.io&labelColor=%23000&color=%23460cf1&url=https%3A%2F%2Fapi.fluentci.io%2Fv1%2Fpipeline%2Fdeno_pipeline&query=%24.version)](https://pkg.fluentci.io/deno_pipeline) 4 | [![deno module](https://shield.deno.dev/x/codecov_pipeline)](https://deno.land/x/deno_pipeline) 5 | ![deno compatibility](https://shield.deno.dev/deno/^1.37) 6 | [![](https://img.shields.io/codecov/c/gh/fluent-ci-templates/deno-pipeline)](https://codecov.io/gh/fluent-ci-templates/deno-pipeline) 7 | 8 | The following command will generate a `azure-pipelines.yml` file in your project: 9 | 10 | ```bash 11 | fluentci ap init -t deno_pipeline 12 | ``` 13 | 14 | Generated file: 15 | 16 | ```yaml 17 | # Do not edit this file directly. It is generated by https://deno.land/x/fluent_azure_pipelines 18 | 19 | trigger: 20 | - main 21 | pool: 22 | name: Default 23 | vmImage: ubuntu-latest 24 | steps: 25 | - script: | 26 | curl -fsSL https://deno.land/x/install/install.sh | sh 27 | export DENO_INSTALL="$HOME/.deno" 28 | export PATH="$DENO_INSTALL/bin:$PATH" 29 | displayName: Install Deno 30 | - script: deno install -A -r https://cli.fluentci.io -n fluentci 31 | displayName: Setup Fluent CI CLI 32 | - script: | 33 | curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh 34 | sudo mv bin/dagger /usr/local/bin 35 | dagger version 36 | displayName: Setup Dagger 37 | - script: fluentci run deno_pipeline fmt lint test 38 | displayName: Run Dagger Pipelines 39 | 40 | ``` 41 | 42 | Feel free to edit the template generator at `.fluentci/src/azure/config.ts` to your needs. 43 | -------------------------------------------------------------------------------- /.fluentci/src/gitlab/README.md: -------------------------------------------------------------------------------- 1 | # Gitlab CI 2 | 3 | [![fluentci pipeline](https://img.shields.io/badge/dynamic/json?label=pkg.fluentci.io&labelColor=%23000&color=%23460cf1&url=https%3A%2F%2Fapi.fluentci.io%2Fv1%2Fpipeline%2Fdeno_pipeline&query=%24.version)](https://pkg.fluentci.io/deno_pipeline) 4 | [![deno module](https://shield.deno.dev/x/deno_pipeline)](https://deno.land/x/deno_pipeline) 5 | ![deno compatibility](https://shield.deno.dev/deno/^1.37) 6 | [![](https://img.shields.io/codecov/c/gh/fluent-ci-templates/deno-pipeline)](https://codecov.io/gh/fluent-ci-templates/deno-pipeline) 7 | 8 | The following command will generate a `.gitlab-ci.yml` file in your project: 9 | 10 | ```bash 11 | fluentci gl init -t deno_pipeline 12 | ``` 13 | 14 | Generated file: 15 | 16 | ```yaml 17 | 18 | # Do not edit this file directly. It is generated by https://deno.land/x/fluent_gitlab_ci 19 | 20 | .docker: 21 | image: denoland/deno:alpine 22 | services: 23 | - docker:${DOCKER_VERSION}-dind 24 | variables: 25 | DOCKER_HOST: tcp://docker:2376 26 | DOCKER_TLS_VERIFY: "1" 27 | DOCKER_TLS_CERTDIR: /certs 28 | DOCKER_CERT_PATH: /certs/client 29 | DOCKER_DRIVER: overlay2 30 | DOCKER_VERSION: 20.10.16 31 | 32 | .dagger: 33 | extends: .docker 34 | before_script: 35 | - apk add docker-cli curl unzip 36 | - deno install -A -r https://cli.fluentci.io -n fluentci 37 | - curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh 38 | - mv bin/dagger /usr/local/bin 39 | - dagger version 40 | 41 | tests: 42 | extends: .dagger 43 | script: 44 | - fluentci run deno_pipeline fmt lint test 45 | 46 | ``` 47 | 48 | Feel free to edit the template generator at `.fluentci/src/gitlab/config.ts` to your needs. 49 | -------------------------------------------------------------------------------- /.fluentci/flake.lock: -------------------------------------------------------------------------------- 1 | { 2 | "nodes": { 3 | "flake-utils": { 4 | "inputs": { 5 | "systems": "systems" 6 | }, 7 | "locked": { 8 | "lastModified": 1687709756, 9 | "narHash": "sha256-Y5wKlQSkgEK2weWdOu4J3riRd+kV/VCgHsqLNTTWQ/0=", 10 | "owner": "numtide", 11 | "repo": "flake-utils", 12 | "rev": "dbabf0ca0c0c4bce6ea5eaf65af5cb694d2082c7", 13 | "type": "github" 14 | }, 15 | "original": { 16 | "owner": "numtide", 17 | "repo": "flake-utils", 18 | "type": "github" 19 | } 20 | }, 21 | "nixpkgs": { 22 | "locked": { 23 | "lastModified": 1688910226, 24 | "narHash": "sha256-kLTsFu9CAU2Gb288JhIBN/WlX4UUUDz4WiC/U59nvwk=", 25 | "owner": "nixos", 26 | "repo": "nixpkgs", 27 | "rev": "2540432a940aee979be6ccfefba9ea0652c273a0", 28 | "type": "github" 29 | }, 30 | "original": { 31 | "owner": "nixos", 32 | "ref": "release-23.05", 33 | "repo": "nixpkgs", 34 | "type": "github" 35 | } 36 | }, 37 | "root": { 38 | "inputs": { 39 | "flake-utils": "flake-utils", 40 | "nixpkgs": "nixpkgs" 41 | } 42 | }, 43 | "systems": { 44 | "locked": { 45 | "lastModified": 1681028828, 46 | "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 47 | "owner": "nix-systems", 48 | "repo": "default", 49 | "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", 50 | "type": "github" 51 | }, 52 | "original": { 53 | "owner": "nix-systems", 54 | "repo": "default", 55 | "type": "github" 56 | } 57 | } 58 | }, 59 | "root": "root", 60 | "version": 7 61 | } 62 | -------------------------------------------------------------------------------- /.fluentci/src/circleci/README.md: -------------------------------------------------------------------------------- 1 | # Circle CI 2 | 3 | [![fluentci pipeline](https://img.shields.io/badge/dynamic/json?label=pkg.fluentci.io&labelColor=%23000&color=%23460cf1&url=https%3A%2F%2Fapi.fluentci.io%2Fv1%2Fpipeline%2Fdeno_pipeline&query=%24.version)](https://pkg.fluentci.io/deno_pipeline) 4 | [![deno module](https://shield.deno.dev/x/deno_pipeline)](https://deno.land/x/deno_pipeline) 5 | ![deno compatibility](https://shield.deno.dev/deno/^1.37) 6 | [![](https://img.shields.io/codecov/c/gh/fluent-ci-templates/deno-pipeline)](https://codecov.io/gh/fluent-ci-templates/deno-pipeline) 7 | 8 | 9 | The following command will generate a `.circleci/config.yml` file in your project: 10 | 11 | ```bash 12 | fluentci cci init -t deno_pipeline 13 | ``` 14 | 15 | Generated file: 16 | 17 | ```yaml 18 | # Do not edit this file directly. It is generated by https://deno.land/x/fluent_circleci 19 | 20 | version: 2.1 21 | jobs: 22 | tests: 23 | steps: 24 | - checkout 25 | - run: sudo apt-get update && sudo apt-get install -y curl unzip 26 | - run: | 27 | curl -fsSL https://deno.land/x/install/install.sh | sh 28 | export DENO_INSTALL="$HOME/.deno" 29 | export PATH="$DENO_INSTALL/bin:$PATH" 30 | - run: deno install -A -r https://cli.fluentci.io -n fluentci 31 | - run: | 32 | curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh 33 | sudo mv bin/dagger /usr/local/bin 34 | dagger version 35 | - run: 36 | name: Upload Coverage 37 | command: fluentci run deno_pipeline fmt lint test 38 | machine: 39 | image: ubuntu-2004:2023.07.1 40 | workflows: 41 | dagger: 42 | jobs: 43 | - tests 44 | 45 | ``` 46 | 47 | Feel free to edit the template generator at `.fluentci/src/circleci/config.ts` to your needs. 48 | -------------------------------------------------------------------------------- /.fluentci/src/github/README.md: -------------------------------------------------------------------------------- 1 | # Github Actions 2 | 3 | [![fluentci pipeline](https://img.shields.io/badge/dynamic/json?label=pkg.fluentci.io&labelColor=%23000&color=%23460cf1&url=https%3A%2F%2Fapi.fluentci.io%2Fv1%2Fpipeline%2Fdeno_pipeline&query=%24.version)](https://pkg.fluentci.io/deno_pipeline) 4 | [![deno module](https://shield.deno.dev/x/deno_pipeline)](https://deno.land/x/deno_pipeline) 5 | ![deno compatibility](https://shield.deno.dev/deno/^1.37) 6 | [![](https://img.shields.io/codecov/c/gh/fluent-ci-templates/deno-pipeline)](https://codecov.io/gh/fluent-ci-templates/deno-pipeline) 7 | 8 | The following command will generate a `.github/workflows/ci.yml` file in your project: 9 | 10 | ```bash 11 | fluentci gh init -t deno_pipeline 12 | ``` 13 | 14 | Or, if you already have a `.fluentci` folder (generated from `fluentci init -t deno`) in your project: 15 | 16 | ```bash 17 | fluentci gh init 18 | ``` 19 | 20 | Generated file: 21 | 22 | ```yaml 23 | # Do not edit this file directly. It is generated by https://deno.land/x/fluent_github_actions 24 | 25 | name: Tests 26 | on: 27 | push: 28 | branches: 29 | - main 30 | jobs: 31 | tests: 32 | runs-on: ubuntu-latest 33 | steps: 34 | - uses: actions/checkout@v2 35 | - uses: denoland/setup-deno@v1 36 | with: 37 | deno-version: v1.37 38 | - name: Setup Fluent CI CLI 39 | run: deno install -A -r https://cli.fluentci.io -n fluentci 40 | - name: Setup Dagger 41 | run: | 42 | curl -L https://dl.dagger.io/dagger/install.sh | DAGGER_VERSION=0.8.1 sh 43 | sudo mv bin/dagger /usr/local/bin 44 | dagger version 45 | - name: Run Dagger Pipelines 46 | run: fluentci run deno_pipeline fmt lint test 47 | ``` 48 | 49 | Feel free to edit the template generator at `.fluentci/src/github/config.ts` to your needs. 50 | -------------------------------------------------------------------------------- /.fluentci/deps.ts: -------------------------------------------------------------------------------- 1 | export { assertEquals } from "https://deno.land/std@0.191.0/testing/asserts.ts"; 2 | import { Client } from "./sdk/client.gen.ts"; 3 | export default Client; 4 | 5 | export type { DirectoryID, SecretID } from "./sdk/client.gen.ts"; 6 | export { Directory, Secret, File } from "./sdk/client.gen.ts"; 7 | export { connect, uploadContext } from "https://sdk.fluentci.io/v0.3.0/mod.ts"; 8 | export { brightGreen } from "https://deno.land/std@0.191.0/fmt/colors.ts"; 9 | export { withDevbox } from "https://nix.fluentci.io/v0.5.3/src/dagger/steps.ts"; 10 | export { stringifyTree } from "https://esm.sh/stringify-tree@1.1.1"; 11 | import gql from "https://esm.sh/graphql-tag@2.12.6"; 12 | export { gql }; 13 | export { 14 | dirname, 15 | join, 16 | resolve, 17 | } from "https://deno.land/std@0.203.0/path/mod.ts"; 18 | export { parse } from "https://deno.land/std@0.205.0/flags/mod.ts"; 19 | export { snakeCase, camelCase } from "https://cdn.skypack.dev/lodash"; 20 | 21 | export { 22 | ClientError, 23 | GraphQLClient, 24 | } from "https://esm.sh/v128/graphql-request@6.1.0"; 25 | export { 26 | DaggerSDKError, 27 | UnknownDaggerError, 28 | DockerImageRefValidationError, 29 | EngineSessionConnectParamsParseError, 30 | ExecError, 31 | GraphQLRequestError, 32 | InitEngineSessionBinaryError, 33 | TooManyNestedObjectsError, 34 | EngineSessionError, 35 | EngineSessionConnectionTimeoutError, 36 | NotAwaitedRequestError, 37 | ERROR_CODES, 38 | } from "https://esm.sh/@dagger.io/dagger@0.9.3"; 39 | 40 | export type { 41 | CallbackFct, 42 | ConnectOpts, 43 | } from "https://sdk.fluentci.io/v0.3.0/mod.ts"; 44 | 45 | export * as FluentGitlabCI from "https://deno.land/x/fluent_gitlab_ci@v0.4.2/mod.ts"; 46 | export * as FluentGithubActions from "https://deno.land/x/fluent_github_actions@v0.2.1/mod.ts"; 47 | export * as FluentCircleCI from "https://deno.land/x/fluent_circleci@v0.2.5/mod.ts"; 48 | export * as FluentAzurePipelines from "https://deno.land/x/fluent_azure_pipelines@v0.2.0/mod.ts"; 49 | export * as FluentAWSCodePipeline from "https://deno.land/x/fluent_aws_codepipeline@v0.2.3/mod.ts"; 50 | -------------------------------------------------------------------------------- /src/cmd/up.ts: -------------------------------------------------------------------------------- 1 | import { generateName, pkgx } from "../../deps.ts"; 2 | import { existsSync } from "node:fs"; 3 | import { POCKETENV_CACHE_DIR } from "../consts.ts"; 4 | import { spawn } from "../lib.ts"; 5 | import * as workspaces from "../workspaces.ts"; 6 | 7 | async function up( 8 | { 9 | ask, 10 | template: _template, 11 | }: { 12 | ask?: boolean; 13 | template?: string; 14 | }, 15 | workspace?: string 16 | ) { 17 | await Deno.mkdir(POCKETENV_CACHE_DIR, { recursive: true }); 18 | 19 | const args = []; 20 | 21 | if (!ask) { 22 | args.push("-auto-approve"); 23 | } 24 | 25 | let workdir = Deno.cwd(); 26 | const generatedName = generateName(); 27 | 28 | if (workspace) { 29 | const result = await workspaces.get(workspace); 30 | if (!result) { 31 | console.error(`Workspace ${workspace} not found.`); 32 | Deno.exit(1); 33 | } 34 | workdir = result.path; 35 | args.push(`-var hostname=${result.name}`); 36 | args.push(`-var workspace_name=${result.name}`); 37 | } 38 | 39 | if (!workspace) { 40 | args.push(`-var hostname=${generatedName}`); 41 | args.push(`-var workspace_name=${generatedName}`); 42 | } 43 | 44 | if (existsSync(`${workdir}/.pocketenv`)) { 45 | workdir = `${workdir}/.pocketenv`; 46 | } 47 | 48 | if (!existsSync(`${workdir}/.terraform`)) { 49 | await pkgx.run(`terraform init`, "inherit", workdir); 50 | } 51 | 52 | await pkgx.run(`terraform apply ${args.join(" ")}`, "inherit", workdir); 53 | const containerId = await spawn( 54 | "sh", 55 | ["-c", 'pkgx terraform output -json | pkgx jq -r ".container_id.value"'], 56 | "piped", 57 | workdir 58 | ); 59 | const logs = await spawn("sh", ["-c", `docker logs ${containerId}`]); 60 | console.log(logs); 61 | 62 | const result = await workspaces.get(workspace || Deno.cwd()); 63 | 64 | workspace = result?.name || workspace || generatedName; 65 | await workspaces.save(result?.path || Deno.cwd(), { 66 | containerId, 67 | name: workspace, 68 | path: result?.path || Deno.cwd(), 69 | status: "Running", 70 | createdAt: result?.createdAt || new Date().toISOString(), 71 | updatedAt: new Date().toISOString(), 72 | }); 73 | } 74 | 75 | export default up; 76 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing Guidelines 2 | 3 | Thank you for your interest in contributing to our project. Whether it's a bug report, new feature, correction, or additional 4 | documentation, we greatly value feedback and contributions from our community. 5 | 6 | Please read through this document before submitting any issues or pull requests to ensure we have all the necessary 7 | information to effectively respond to your bug report or contribution. 8 | 9 | 10 | ## Reporting Bugs/Feature Requests 11 | 12 | We welcome you to use the GitHub issue tracker to report bugs or suggest features. 13 | 14 | When filing an issue, please check existing open, or recently closed, issues to make sure somebody else hasn't already 15 | reported the issue. Please try to include as much information as you can. Details like these are incredibly useful: 16 | 17 | * A reproducible test case or series of steps 18 | * The version of our code being used 19 | * Any modifications you've made relevant to the bug 20 | * Anything unusual about your environment or deployment 21 | 22 | 23 | ## Contributing via Pull Requests 24 | Contributions via pull requests are much appreciated. Before sending us a pull request, please ensure that: 25 | 26 | 1. You are working against the latest source on the *main* branch. 27 | 2. You check existing open, and recently merged, pull requests to make sure someone else hasn't addressed the problem already. 28 | 3. You open an issue to discuss any significant work - we would hate for your time to be wasted. 29 | 30 | To send us a pull request, please: 31 | 32 | 1. Fork the repository. 33 | 2. Modify the source; please focus on the specific change you are contributing. If you also reformat all the code, it will be hard for us to focus on your change. 34 | 3. Ensure local tests pass. 35 | 4. Commit to your fork using clear commit messages. 36 | 5. Send us a pull request, answering any default questions in the pull request interface. 37 | 6. Pay attention to any automated CI failures reported in the pull request, and stay involved in the conversation. 38 | 39 | GitHub provides additional document on [forking a repository](https://help.github.com/articles/fork-a-repo/) and 40 | [creating a pull request](https://help.github.com/articles/creating-a-pull-request/). 41 | 42 | 43 | ## Finding contributions to work on 44 | Looking at the existing issues is a great way to find something to contribute on. As our projects, by default, use the default GitHub issue labels (enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any 'help wanted' issues is a great place to start. 45 | 46 | 47 | ## Code of Conduct 48 | This project has adopted the [Contributor Covenant](https://www.contributor-covenant.org/), version 2.1, available at https://www.contributor-covenant.org/version/2/1/code_of_conduct.html. 49 | 50 | 51 | ## Licensing 52 | 53 | See the [LICENSE](LICENSE) file for our project's licensing. We will ask you to confirm the licensing of your contribution. -------------------------------------------------------------------------------- /main.ts: -------------------------------------------------------------------------------- 1 | import { Command, brightGreen } from "./deps.ts"; 2 | import community from "./src/cmd/community.ts"; 3 | import down from "./src/cmd/down.ts"; 4 | import init from "./src/cmd/init.ts"; 5 | import list from "./src/cmd/list.ts"; 6 | import logs from "./src/cmd/logs.ts"; 7 | import shell from "./src/cmd/shell.ts"; 8 | import up from "./src/cmd/up.ts"; 9 | import { VERSION } from "./src/consts.ts"; 10 | 11 | async function main() { 12 | await new Command() 13 | .name("pocketenv") 14 | .version(VERSION) 15 | .description( 16 | brightGreen(` 17 | . 18 | ____ __ __ 19 | / __ \\____ _____/ /_____ / /____ ____ _ __ 20 | / /_/ / __ \\/ ___/ //_/ _ \\/ __/ _ \\/ __ \\ | / / 21 | / ____/ /_/ / /__/ ,< / __/ /_/ __/ / / / |/ / 22 | /_/ \\____/\\___/_/|_|\\___/\\__/\\___/_/ /_/|___/ 23 | 24 | https://pocketenv.io - Manage your development environment with ease. 25 | `) 26 | ) 27 | .command("init", "Generate a new Pocketenv workspace") 28 | .arguments("[name:string]") 29 | .option( 30 | "-t, --template ", 31 | "Create a workspace from a template" 32 | ) 33 | .option( 34 | "-s, --standalone [standalone:boolean]", 35 | "Create a standalone workspace from a template" 36 | ) 37 | .action(function (options, name) { 38 | init(options, name); 39 | }) 40 | .command("up", "Start the Pocketenv workspace") 41 | .arguments("[workspace:string]") 42 | .option("--ask", "Ask before creating the workspace") 43 | .option( 44 | "-t, --template ", 45 | "Create and start a workspace from a template" 46 | ) 47 | .action(async function (options, workspace) { 48 | await up(options, workspace); 49 | }) 50 | .command("down", "Stop the Pocketenv workspace") 51 | .arguments("[workspace:string]") 52 | .option("--ask", "Ask before destroying the workspace") 53 | .action(async function (options, workspace) { 54 | await down(options, workspace); 55 | }) 56 | .command("shell", "Start a shell in the Pocketenv workspace") 57 | .arguments("[workspace:string]") 58 | .action(async function (_options, workspace) { 59 | await shell(workspace); 60 | }) 61 | .command("logs", "Show the logs of a Pocketenv workspace") 62 | .arguments("[workspace:string]") 63 | .option("-f, --follow", "Follow log output") 64 | .action(async function (options, workspace) { 65 | await logs(options, workspace); 66 | }) 67 | .command("list", "List all Pocketenv workspaces") 68 | .action(async function () { 69 | await list(); 70 | }) 71 | .command("community", "Join our community Discord to chat with us") 72 | .action(async function () { 73 | await community(); 74 | }) 75 | .parse(Deno.args); 76 | } 77 | 78 | // Learn more at https://deno.land/manual/examples/module_metadata#concepts 79 | if (import.meta.main) { 80 | await main(); 81 | } 82 | -------------------------------------------------------------------------------- /.fluentci/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributing Guidelines 2 | 3 | Thank you for your interest in contributing to our project. Whether it's a bug 4 | report, new feature, correction, or additional documentation, we greatly value 5 | feedback and contributions from our community. 6 | 7 | Please read through this document before submitting any issues or pull requests 8 | to ensure we have all the necessary information to effectively respond to your 9 | bug report or contribution. 10 | 11 | ## Reporting Bugs/Feature Requests 12 | 13 | We welcome you to use the GitHub issue tracker to report bugs or suggest 14 | features. 15 | 16 | When filing an issue, please check existing open, or recently closed, issues to 17 | make sure somebody else hasn't already reported the issue. Please try to include 18 | as much information as you can. Details like these are incredibly useful: 19 | 20 | - A reproducible test case or series of steps 21 | - The version of our code being used 22 | - Any modifications you've made relevant to the bug 23 | - Anything unusual about your environment or deployment 24 | 25 | ## Contributing via Pull Requests 26 | 27 | Contributions via pull requests are much appreciated. Before sending us a pull 28 | request, please ensure that: 29 | 30 | 1. You are working against the latest source on the _master_ branch. 31 | 2. You check existing open, and recently merged, pull requests to make sure 32 | someone else hasn't addressed the problem already. 33 | 3. You open an issue to discuss any significant work - we would hate for your 34 | time to be wasted. 35 | 36 | To send us a pull request, please: 37 | 38 | 1. Fork the repository. 39 | 2. Modify the source; please focus on the specific change you are contributing. 40 | If you also reformat all the code, it will be hard for us to focus on your 41 | change. 42 | 3. Ensure local tests pass. 43 | 4. Commit to your fork using clear commit messages. 44 | 5. Send us a pull request, answering any default questions in the pull request 45 | interface. 46 | 6. Pay attention to any automated CI failures reported in the pull request, and 47 | stay involved in the conversation. 48 | 49 | GitHub provides additional document on 50 | [forking a repository](https://help.github.com/articles/fork-a-repo/) and 51 | [creating a pull request](https://help.github.com/articles/creating-a-pull-request/). 52 | 53 | ## Finding contributions to work on 54 | 55 | Looking at the existing issues is a great way to find something to contribute 56 | on. As our projects, by default, use the default GitHub issue labels 57 | (enhancement/bug/duplicate/help wanted/invalid/question/wontfix), looking at any 58 | 'help wanted' issues is a great place to start. 59 | 60 | ## Code of Conduct 61 | 62 | This project has adopted the 63 | [Contributor Covenant](https://www.contributor-covenant.org/), version 2.1, 64 | available at 65 | https://www.contributor-covenant.org/version/2/1/code_of_conduct.html. 66 | 67 | ## Licensing 68 | 69 | See the [LICENSE](LICENSE) file for our project's licensing. We will ask you to 70 | confirm the licensing of your contribution. 71 | -------------------------------------------------------------------------------- /install.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | readonly MAGENTA="$(tput setaf 5 2>/dev/null || echo '')" 4 | readonly GREEN="$(tput setaf 2 2>/dev/null || echo '')" 5 | readonly CYAN="$(tput setaf 6 2>/dev/null || echo '')" 6 | readonly NO_COLOR="$(tput sgr0 2>/dev/null || echo '')" 7 | 8 | set -e 9 | 10 | # Define the release information 11 | RELEASE_URL="https://api.github.com/repos/pocketenv-io/pocketenv/releases/latest" 12 | 13 | # Determine the operating system 14 | OS=$(uname -s) 15 | if [ "$OS" = "Darwin" ]; then 16 | # Determine the CPU architecture 17 | ARCH=$(uname -m) 18 | if [ "$ARCH" = "arm64" ]; then 19 | ASSET_NAME="_aarch64-apple-darwin.tar.gz" 20 | else 21 | ASSET_NAME="_x86_64-apple-darwin.tar.gz" 22 | fi 23 | elif [ "$OS" = "Linux" ]; then 24 | # Determine the CPU architecture 25 | ARCH=$(uname -m) 26 | if [ "$ARCH" = "aarch64" ]; then 27 | ASSET_NAME="_aarch64-unknown-linux-gnu.tar.gz" 28 | elif [ "$ARCH" = "x86_64" ]; then 29 | ASSET_NAME="_x86_64-unknown-linux-gnu.tar.gz" 30 | else 31 | echo "Unsupported architecture: $ARCH" 32 | exit 1 33 | fi 34 | else 35 | echo "Unsupported operating system: $OS" 36 | exit 1 37 | fi 38 | 39 | # Retrieve the download URL for the desired asset 40 | DOWNLOAD_URL=$(curl -sSL $RELEASE_URL | grep -o "browser_download_url.*$ASSET_NAME\"" | cut -d ' ' -f 2) 41 | 42 | ASSET_NAME=$(basename $DOWNLOAD_URL) 43 | 44 | # Define the installation directory 45 | INSTALL_DIR="/usr/local/bin" 46 | 47 | DOWNLOAD_URL=`echo $DOWNLOAD_URL | tr -d '\"'` 48 | 49 | # Download the asset 50 | curl -SL $DOWNLOAD_URL -o /tmp/$ASSET_NAME 51 | 52 | # Extract the asset 53 | tar -xzf /tmp/$ASSET_NAME -C /tmp 54 | 55 | # Set the correct permissions for the binary 56 | chmod +x /tmp/pocketenv 57 | 58 | # Check if the 'local' argument was passed 59 | LOCAL=0 60 | if [ $# -eq 1 ]; then 61 | if [ $1 = "--local" ]; then 62 | LOCAL=1 63 | fi 64 | fi 65 | 66 | # Move the extracted binary to the installation directory 67 | # use sudo if OS is Linux 68 | if [ "$OS" = "Linux" ]; then 69 | # Install locally if LOCAL is set to 1 70 | LOCAL_DIR="/home/$USER/.local/bin" 71 | if [ "$LOCAL" -eq 1 ]; then 72 | mv /tmp/pocketenv $LOCAL_DIR 73 | else 74 | if command -v sudo >/dev/null 2>&1; then 75 | sudo mv /tmp/pocketenv $INSTALL_DIR 76 | else 77 | mv /tmp/pocketenv $INSTALL_DIR 78 | fi 79 | fi 80 | else 81 | mv /tmp/pocketenv $INSTALL_DIR 82 | fi 83 | 84 | # Clean up temporary files 85 | rm /tmp/$ASSET_NAME 86 | 87 | cat << EOF 88 | ${CYAN} 89 | ____ __ __ 90 | / __ \\____ _____/ /_____ / /____ ____ _ __ 91 | / /_/ / __ \\/ ___/ //_/ _ \\/ __/ _ \\/ __ \\ | / / 92 | / ____/ /_/ / /__/ ,< / __/ /_/ __/ / / / |/ / 93 | /_/ \\____/\\___/_/|_|\\___/\\__/\\___/_/ /_/|___/ 94 | 95 | ${NO_COLOR} 96 | Manage your ${GREEN}development environment${NO_COLOR} with ease ✨ 97 | 98 | ${GREEN}https://github.com/pocketenv-io/pocketenv${NO_COLOR} 99 | 100 | Please file an issue if you encounter any problems! 101 | 102 | =============================================================================== 103 | 104 | Installation completed! 🎉 105 | 106 | To get started, run: 107 | 108 | ${MAGENTA}pocketenv init${NO_COLOR} 109 | 110 | EOF -------------------------------------------------------------------------------- /.fluentci/README.md: -------------------------------------------------------------------------------- 1 | # Deno Pipeline 2 | 3 | [![fluentci pipeline](https://img.shields.io/badge/dynamic/json?label=pkg.fluentci.io&labelColor=%23000&color=%23460cf1&url=https%3A%2F%2Fapi.fluentci.io%2Fv1%2Fpipeline%2Fdeno_pipeline&query=%24.version)](https://pkg.fluentci.io/deno_pipeline) 4 | [![deno module](https://shield.deno.dev/x/deno_pipeline)](https://deno.land/x/deno_pipeline) 5 | ![deno compatibility](https://shield.deno.dev/deno/^1.37) 6 | [![](https://img.shields.io/codecov/c/gh/fluent-ci-templates/deno-pipeline)](https://codecov.io/gh/fluent-ci-templates/deno-pipeline) 7 | 8 | A ready-to-use CI/CD Pipeline for your Deno projects. 9 | 10 | ![Made with VHS](https://vhs.charm.sh/vhs-3itysSnE548cLEyRNkuLAo.gif) 11 | 12 | ## 🚀 Usage 13 | 14 | Run the following command: 15 | 16 | ```bash 17 | fluentci run deno_pipeline 18 | ``` 19 | 20 | Or, if you want to use it as a template: 21 | 22 | ```bash 23 | fluentci init -t deno 24 | ``` 25 | 26 | This will create a `.fluentci` folder in your project. 27 | 28 | Now you can run the pipeline with: 29 | 30 | ```bash 31 | fluentci run . 32 | ``` 33 | 34 | ## Dagger Module 35 | 36 | Use as a [Dagger](https://dagger.io) module: 37 | 38 | ```bash 39 | dagger mod install github.com/fluent-ci-templates/deno-pipeline@mod 40 | ``` 41 | 42 | ## Environment variables (Deno Deploy) 43 | 44 | | Variable | Description | Default | 45 | | ----------------- | ------------------------- | ---------- | 46 | | DENO_PROJECT | Your project name | | 47 | | NO_STATIC | Disable static assets | `false` | 48 | | EXCLUDE | Exclude files from deploy | | 49 | | DENO_DEPLOY_TOKEN | Your Deno Deploy token | | 50 | | DENO_MAIN_SCRIPT | Your main script | `main.tsx` | 51 | 52 | ## Jobs 53 | 54 | | Job | Description | Options | 55 | | ------- | --------------------------------------------------------- | ---------------------- | 56 | | fmt | Format your code | | 57 | | lint | Lint your code | | 58 | | test | Run your tests | `{ ignore: string[] }` | 59 | | compile | Compile the given script into a self contained executable | | 60 | | deploy | Deploy your app to Deno Deploy | | 61 | 62 | ```typescript 63 | lint( 64 | src: string | Directory | undefined = "." 65 | ): Promise 66 | 67 | fmt( 68 | src: string | Directory | undefined = "." 69 | ): Promise 70 | 71 | test( 72 | src: string | Directory | undefined = ".", 73 | ignore: string[] = [] 74 | ): Promise 75 | 76 | compile( 77 | src: string | Directory | undefined = ".", 78 | file = "main.ts", 79 | output = "main", 80 | target = "x86_64-unknown-linux-gnu" 81 | ): Promise 82 | 83 | deploy( 84 | src: string | Directory | undefined = ".", 85 | token?: string | Secret, 86 | project?: string, 87 | main?: string, 88 | noStatic?: boolean, 89 | excludeOpt?: string 90 | ): Promise 91 | ``` 92 | 93 | ## Programmatic usage 94 | 95 | You can also use this pipeline programmatically: 96 | 97 | ```ts 98 | import { fmt, lint, test } from "https://deno.land/x/deno_pipeline/mod.ts"; 99 | 100 | await fmt(); 101 | await lint(); 102 | await test(); 103 | ``` 104 | -------------------------------------------------------------------------------- /.fluentci/sdk/nix/steps.ts: -------------------------------------------------------------------------------- 1 | import { Container } from "../client.gen.ts"; 2 | 3 | export const withNix = (ctr: Container) => 4 | ctr 5 | .withExec([ 6 | "sh", 7 | "-c", 8 | "[ -f /etc/nix/group ] && cp /etc/nix/group /etc/group; exit 0", 9 | ]) 10 | .withExec([ 11 | "sh", 12 | "-c", 13 | "[ -f /etc/nix/passwd ] && cp /etc/nix/passwd /etc/passwd; exit 0", 14 | ]) 15 | .withExec([ 16 | "sh", 17 | "-c", 18 | "[ -f /etc/nix/shadow ] && cp /etc/nix/shadow /etc/shadow; exit 0", 19 | ]) 20 | .withExec([ 21 | "sh", 22 | "-c", 23 | '[ ! -f "/nix/receipt.json" ] && curl --proto =https --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install linux --extra-conf "sandbox = false" --init none --no-confirm; exit 0', 24 | ]) 25 | .withExec(["cp", "/etc/group", "/etc/nix/group"]) 26 | .withExec(["cp", "/etc/passwd", "/etc/nix/passwd"]) 27 | .withExec(["cp", "/etc/shadow", "/etc/nix/shadow"]) 28 | .withExec([ 29 | "sed", 30 | "-i", 31 | "s/auto-allocate-uids = true/auto-allocate-uids = false/g", 32 | "/etc/nix/nix.conf", 33 | ]) 34 | .withEnvVariable("PATH", "${PATH}:/nix/var/nix/profiles/default/bin", { 35 | expand: true, 36 | }) 37 | .withExec(["nix", "run", "nixpkgs#hello"]); 38 | 39 | export const withDevbox = (ctr: Container) => 40 | withNix(ctr) 41 | .withExec(["adduser", "--disabled-password", "devbox"]) 42 | .withExec(["addgroup", "devbox", "nixbld"]) 43 | .withEnvVariable("FORCE", "1") 44 | .withExec(["sh", "-c", "curl -fsSL https://get.jetpack.io/devbox | bash"]) 45 | .withExec(["devbox", "version"]); 46 | 47 | export const withPackageFromDevbox = (ctr: Container, pkgs: string[]) => 48 | withDevbox(ctr).withExec(["devbox", "global", "add", ...pkgs]); 49 | 50 | export const withDevboxExec = (ctr: Container, cmds: string[]) => 51 | cmds.reduce( 52 | (ctr, cmd) => 53 | ctr.withExec(["sh", "-c", `eval "$(devbox global shellenv)" && ${cmd}`]), 54 | ctr 55 | ); 56 | 57 | export const withDevenv = (ctr: Container) => 58 | withNix(ctr) 59 | .withExec(["adduser", "--disabled-password", "devenv"]) 60 | .withExec(["addgroup", "devenv", "nixbld"]) 61 | .withEnvVariable("USER", "root") 62 | .withExec([ 63 | "sh", 64 | "-c", 65 | 'echo "trusted-users = root $USER" | tee -a /etc/nix/nix.conf', 66 | ]) 67 | .withExec([ 68 | "nix", 69 | "profile", 70 | "install", 71 | "--accept-flake-config", 72 | "github:cachix/cachix", 73 | ]) 74 | .withExec(["cachix", "use", "devenv"]) 75 | .withExec([ 76 | "nix", 77 | "profile", 78 | "install", 79 | "--accept-flake-config", 80 | "github:cachix/devenv/latest", 81 | ]) 82 | .withExec(["devenv", "version"]); 83 | 84 | export const withFlox = (ctr: Container) => 85 | withNix(ctr) 86 | .withExec(["adduser", "--disabled-password", "flox"]) 87 | .withExec(["addgroup", "flox", "nixbld"]) 88 | .withExec([ 89 | "sh", 90 | "-c", 91 | "echo 'extra-trusted-substituters = https://cache.floxdev.com' | tee -a /etc/nix/nix.conf && echo 'extra-trusted-public-keys = flox-store-public-0:8c/B+kjIaQ+BloCmNkRUKwaVPFWkriSAd0JJvuDu4F0=' | tee -a /etc/nix/nix.conf", 92 | ]) 93 | .withExec([ 94 | "nix", 95 | "profile", 96 | "install", 97 | "--impure", 98 | "--experimental-features", 99 | "nix-command flakes auto-allocate-uids", 100 | "--accept-flake-config", 101 | "github:flox/floxpkgs#flox.fromCatalog", 102 | ]) 103 | .withExec(["flox", "--version"]); 104 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![pokeball](https://cdn3.emoji.gg/emojis/pokeball.png)](https://emoji.gg/emoji/pokeball) 2 | 3 | # Pocketenv 4 | 5 | [![FlakeHub](https://img.shields.io/endpoint?url=https://flakehub.com/f/pocketenv-io/pocketenv/badge)](https://flakehub.com/flake/pocketenv-io/pocketenv) 6 | [![discord](https://img.shields.io/discord/1270021300240252979?label=discord&logo=discord&color=5865F2)](https://discord.gg/RxKa62YAs4) 7 | [![built with nix](https://img.shields.io/badge/Built_With-Nix-5277C3.svg?logo=nixos&labelColor=73C3D5)](https://builtwithnix.org) 8 | [![deno module](https://shield.deno.dev/x/pocketenv)](https://deno.land/x/pocketenv) 9 | ![deno compatibility](https://shield.deno.dev/deno/^1.37) 10 | [![ci](https://github.com/pocketenv-io/pocketenv/actions/workflows/ci.yml/badge.svg)](https://github.com/pocketenv-io/pocketenv/actions/workflows/ci.yml) 11 | 12 | Pocketenv is a simple and lightweight tool to manage development workspace environments. It allows you to define and manage workspaces for your projects, and easily switch between them. 13 | 14 | ![preview](./.github/images/preview.png) 15 | 16 | > [!NOTE] 17 | > * `Pocketenv Workspaces` are just Docker Containers with some preinstalled tools, volumes, and [vscode tunnel](https://code.visualstudio.com/docs/remote/tunnels) as an entry point. 18 | > * `Pocketenv Templates` are just Github Repositories with terraform files to create a new workspace. 19 | 20 | > [!IMPORTANT] 21 | > Pocketenv is still in development and not ready for production use. 22 | 23 | ## 🚚 Installation 24 | 25 | With Bash: 26 | 27 | ```bash 28 | curl -fsSL https://cli.pocketenv.io | bash 29 | ``` 30 | 31 | With [Homebrew](https://brew.sh/) (macOS/Linux): 32 | 33 | ```sh 34 | brew install pocketenv-io/tap/pocketenv 35 | ``` 36 | 37 | With Deno: 38 | 39 | ```bash 40 | deno install -A -r https://cli.pocketenv.io -n pocketenv 41 | ``` 42 | 43 | With Nix: 44 | 45 | ```bash 46 | nix profile install --experimental-features "nix-command flakes" github:pocketenv-io/pocketenv 47 | ``` 48 | 49 | Or download the binary from the [releases page](https://github.com/pocketenv-io/pocketenv/releases) and add it to your PATH. 50 | 51 | > [!TIP] 52 | > * Quickly create a new workspace with `pocketenv init` and `pocketenv up` command. 53 | > * Destroy it with `pocketenv down` command. 54 | > * List all workspaces with `pocketenv list` command. 55 | > * Start a shell in a workspace with `pocketenv shell` command. 56 | 57 | ## 🚀 Usage 58 | 59 | ```bash 60 | pocketenv --help 61 | 62 | Usage: pocketenv 63 | Version: 0.1.5 64 | 65 | Description: 66 | 67 | 68 | . 69 | ____ __ __ 70 | / __ \____ _____/ /_____ / /____ ____ _ __ 71 | / /_/ / __ \/ ___/ //_/ _ \/ __/ _ \/ __ \ | / / 72 | / ____/ /_/ / /__/ ,< / __/ /_/ __/ / / / |/ / 73 | /_/ \____/\___/_/|_|\___/\__/\___/_/ /_/|___/ 74 | 75 | https://pocketenv.io - Manage your development environment with ease. 76 | 77 | 78 | Options: 79 | 80 | -h, --help - Show this help. 81 | -V, --version - Show the version number for this program. 82 | 83 | Commands: 84 | 85 | init [name] - Generate a new Pocketenv workspace 86 | up [workspace] - Start the Pocketenv workspace 87 | down [workspace] - Stop the Pocketenv workspace 88 | list - List all Pocketenv workspaces 89 | shell [workspace] - Start a shell in the Pocketenv workspace 90 | ``` 91 | -------------------------------------------------------------------------------- /flake.lock: -------------------------------------------------------------------------------- 1 | { 2 | "nodes": { 3 | "deno2nix": { 4 | "inputs": { 5 | "devshell": "devshell", 6 | "flake-compat": "flake-compat", 7 | "flake-utils": "flake-utils", 8 | "nixpkgs": [ 9 | "nixpkgs" 10 | ] 11 | }, 12 | "locked": { 13 | "lastModified": 1708712887, 14 | "narHash": "sha256-gCnFHxA6TqMzyO3E2Jr7ElMpTwLdme7wPgNZnHY1CUk=", 15 | "owner": "tsirysndr", 16 | "repo": "deno2nix", 17 | "rev": "59b13ec521e8e5a1e0c8b15ddaed6a1e7ae75237", 18 | "type": "github" 19 | }, 20 | "original": { 21 | "owner": "tsirysndr", 22 | "repo": "deno2nix", 23 | "type": "github" 24 | } 25 | }, 26 | "devshell": { 27 | "inputs": { 28 | "flake-utils": [ 29 | "deno2nix", 30 | "flake-utils" 31 | ], 32 | "nixpkgs": [ 33 | "deno2nix", 34 | "nixpkgs" 35 | ] 36 | }, 37 | "locked": { 38 | "lastModified": 1667210711, 39 | "narHash": "sha256-IoErjXZAkzYWHEpQqwu/DeRNJGFdR7X2OGbkhMqMrpw=", 40 | "owner": "numtide", 41 | "repo": "devshell", 42 | "rev": "96a9dd12b8a447840cc246e17a47b81a4268bba7", 43 | "type": "github" 44 | }, 45 | "original": { 46 | "owner": "numtide", 47 | "repo": "devshell", 48 | "type": "github" 49 | } 50 | }, 51 | "flake-compat": { 52 | "flake": false, 53 | "locked": { 54 | "lastModified": 1668681692, 55 | "narHash": "sha256-Ht91NGdewz8IQLtWZ9LCeNXMSXHUss+9COoqu6JLmXU=", 56 | "owner": "edolstra", 57 | "repo": "flake-compat", 58 | "rev": "009399224d5e398d03b22badca40a37ac85412a1", 59 | "type": "github" 60 | }, 61 | "original": { 62 | "owner": "edolstra", 63 | "repo": "flake-compat", 64 | "type": "github" 65 | } 66 | }, 67 | "flake-utils": { 68 | "locked": { 69 | "lastModified": 1667395993, 70 | "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", 71 | "owner": "numtide", 72 | "repo": "flake-utils", 73 | "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", 74 | "type": "github" 75 | }, 76 | "original": { 77 | "owner": "numtide", 78 | "repo": "flake-utils", 79 | "type": "github" 80 | } 81 | }, 82 | "nixpkgs": { 83 | "locked": { 84 | "lastModified": 1708564076, 85 | "narHash": "sha256-KKkqoxlgx9n3nwST7O2kM8tliDOijiSSNaWuSkiozdQ=", 86 | "owner": "NixOS", 87 | "repo": "nixpkgs", 88 | "rev": "98b00b6947a9214381112bdb6f89c25498db4959", 89 | "type": "github" 90 | }, 91 | "original": { 92 | "id": "nixpkgs", 93 | "type": "indirect" 94 | } 95 | }, 96 | "root": { 97 | "inputs": { 98 | "deno2nix": "deno2nix", 99 | "nixpkgs": "nixpkgs", 100 | "utils": "utils" 101 | } 102 | }, 103 | "systems": { 104 | "locked": { 105 | "lastModified": 1681028828, 106 | "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", 107 | "owner": "nix-systems", 108 | "repo": "default", 109 | "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", 110 | "type": "github" 111 | }, 112 | "original": { 113 | "owner": "nix-systems", 114 | "repo": "default", 115 | "type": "github" 116 | } 117 | }, 118 | "utils": { 119 | "inputs": { 120 | "systems": "systems" 121 | }, 122 | "locked": { 123 | "lastModified": 1705309234, 124 | "narHash": "sha256-uNRRNRKmJyCRC/8y1RqBkqWBLM034y4qN7EprSdmgyA=", 125 | "owner": "numtide", 126 | "repo": "flake-utils", 127 | "rev": "1ef2e671c3b0c19053962c07dbda38332dcebf26", 128 | "type": "github" 129 | }, 130 | "original": { 131 | "owner": "numtide", 132 | "repo": "flake-utils", 133 | "type": "github" 134 | } 135 | } 136 | }, 137 | "root": "root", 138 | "version": 7 139 | } 140 | -------------------------------------------------------------------------------- /src/cmd/init.ts: -------------------------------------------------------------------------------- 1 | import { 2 | brightGreen, 3 | cyan, 4 | generateName, 5 | green, 6 | magenta, 7 | pkgx, 8 | SpinnerTypes, 9 | TerminalSpinner, 10 | } from "../../deps.ts"; 11 | import { POCKETENV_CACHE_DIR } from "../consts.ts"; 12 | import { existsSync } from "node:fs"; 13 | import * as workspaces from "../workspaces.ts"; 14 | import { getDefaultGithubBranch } from "../lib.ts"; 15 | 16 | async function init( 17 | { template, standalone }: { template?: string; standalone?: boolean }, 18 | name?: string, 19 | ) { 20 | if (!name) { 21 | console.log(`${cyan("?")} Workspace name: `); 22 | 23 | while (!name || name === "") { 24 | name = await pkgx.run(`gum input --value ${generateName()}`, "piped"); 25 | name = name.trim(); 26 | } 27 | 28 | await Deno.stdout.write(new TextEncoder().encode(magenta(name) + "\n")); 29 | } 30 | if (!template) { 31 | console.log(`${cyan("?")} Choose a template: `); 32 | template = await pkgx.run( 33 | `gum choose pkgx nix devbox homebrew devenv flox`, 34 | "piped", 35 | ); 36 | await Deno.stdout.write(new TextEncoder().encode(magenta(template))); 37 | template = template.trim(); 38 | } 39 | 40 | await downloadFromGithub(template, standalone); 41 | 42 | await workspaces.save(Deno.cwd(), { 43 | containerId: null, 44 | name, 45 | path: Deno.cwd(), 46 | status: "Initialized", 47 | createdAt: new Date().toISOString(), 48 | updatedAt: new Date().toISOString(), 49 | }); 50 | 51 | console.log("Workspace successfully generated! 🚀"); 52 | console.log(`Run ${brightGreen("`pocketenv up`")} to start the workspace.`); 53 | } 54 | 55 | async function downloadFromGithub(template: string, standalone?: boolean) { 56 | if (!standalone) { 57 | if (existsSync(".pocketenv")) { 58 | console.log( 59 | `🚨 ${brightGreen( 60 | ".pocketenv", 61 | ) 62 | } directory already exists. Please remove it and try again.`, 63 | ); 64 | Deno.exit(1); 65 | } 66 | } 67 | const terminalSpinner = new TerminalSpinner({ 68 | text: `Downloading ${green(template)} template ...`, 69 | spinner: SpinnerTypes.dots, 70 | }); 71 | terminalSpinner.start(); 72 | 73 | await Deno.mkdir(`${POCKETENV_CACHE_DIR}`, { recursive: true }); 74 | 75 | const filePath = `${POCKETENV_CACHE_DIR}/${template.replaceAll( 76 | "/", 77 | "-", 78 | ) 79 | }.zip`; 80 | 81 | const branch = await getDefaultGithubBranch( 82 | template.split("/").length === 2 ? template : `pocketenv-io/${template}`, 83 | ); 84 | 85 | const url = template.split("/").length === 2 86 | ? `https://codeload.github.com/${template}/zip/refs/heads/${branch}` 87 | : `https://codeload.github.com/pocketenv-io/${template}/zip/refs/heads/${branch}`; 88 | 89 | if (!existsSync(filePath)) { 90 | const response = await fetch(url); 91 | const data = await response.arrayBuffer(); 92 | await Deno.writeFile(filePath, new Uint8Array(data)); 93 | } 94 | 95 | terminalSpinner.succeed("Template downloaded successfully!"); 96 | terminalSpinner.stop(); 97 | 98 | const cacheDir = `${POCKETENV_CACHE_DIR}/${template}`; 99 | await Deno.mkdir(cacheDir, { recursive: true }); 100 | 101 | if (!existsSync(`${cacheDir}/${template.split("/").pop()}-${branch}`)) { 102 | await pkgx.installPackage("unzip"); 103 | await pkgx.run(`unzip ${filePath} -d ${cacheDir}`, "inherit"); 104 | await pkgx.run( 105 | `terraform init`, 106 | "inherit", 107 | `${cacheDir}/${template.split("/").pop()}-${branch}`, 108 | ); 109 | } else { 110 | console.log( 111 | `💾 Using cached template: ${brightGreen(template)} ${brightGreen("...") 112 | }`, 113 | ); 114 | } 115 | 116 | await copyDir( 117 | `${cacheDir}/${template.split("/").pop()}-${branch}`, 118 | standalone ? "." : ".pocketenv", 119 | ); 120 | } 121 | 122 | async function copyDir(src: string, dest: string) { 123 | if (dest !== ".") { 124 | await Deno.mkdir(dest); 125 | } 126 | for await (const dirEntry of Deno.readDir(src)) { 127 | const srcPath = `${src}/${dirEntry.name}`; 128 | const destPath = `${dest}/${dirEntry.name}`; 129 | if (dirEntry.isDirectory) { 130 | await copyDir(srcPath, destPath); 131 | } else { 132 | await Deno.copyFile(srcPath, destPath); 133 | } 134 | } 135 | } 136 | 137 | export default init; 138 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, caste, color, religion, or sexual 10 | identity and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community include: 19 | 20 | * Demonstrating empathy and kindness toward other people 21 | * Being respectful of differing opinions, viewpoints, and experiences 22 | * Giving and gracefully accepting constructive feedback 23 | * Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | * Focusing on what is best not just for us as individuals, but for the overall 26 | community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | * The use of sexualized language or imagery, and sexual attention or advances of 31 | any kind 32 | * Trolling, insulting or derogatory comments, and personal or political attacks 33 | * Public or private harassment 34 | * Publishing others' private information, such as a physical or email address, 35 | without their explicit permission 36 | * Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces, and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement at 63 | [GitHub Issues](https://github.com/pocketenv-io/pocketenv/issues). 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series of 86 | actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or permanent 93 | ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within the 113 | community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.1, available at 119 | [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. 120 | 121 | Community Impact Guidelines were inspired by 122 | [Mozilla's code of conduct enforcement ladder][Mozilla CoC]. 123 | 124 | For answers to common questions about this code of conduct, see the FAQ at 125 | [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at 126 | [https://www.contributor-covenant.org/translations][translations]. 127 | 128 | [homepage]: https://www.contributor-covenant.org 129 | [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html 130 | [Mozilla CoC]: https://github.com/mozilla/diversity 131 | [FAQ]: https://www.contributor-covenant.org/faq 132 | [translations]: https://www.contributor-covenant.org/translations -------------------------------------------------------------------------------- /.fluentci/CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, caste, color, religion, or sexual 10 | identity and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community include: 19 | 20 | - Demonstrating empathy and kindness toward other people 21 | - Being respectful of differing opinions, viewpoints, and experiences 22 | - Giving and gracefully accepting constructive feedback 23 | - Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | - Focusing on what is best not just for us as individuals, but for the overall 26 | community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | - The use of sexualized language or imagery, and sexual attention or advances of 31 | any kind 32 | - Trolling, insulting or derogatory comments, and personal or political attacks 33 | - Public or private harassment 34 | - Publishing others' private information, such as a physical or email address, 35 | without their explicit permission 36 | - Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces, and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement at 63 | [GitHub Issues](https://github.com/fluent-ci-templates/deno-pipeline/issues). 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series of 86 | actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or permanent 93 | ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within the 113 | community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.1, available at 119 | [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. 120 | 121 | Community Impact Guidelines were inspired by 122 | [Mozilla's code of conduct enforcement ladder][Mozilla CoC]. 123 | 124 | For answers to common questions about this code of conduct, see the FAQ at 125 | [https://www.contributor-covenant.org/faq][FAQ]. Translations are available at 126 | [https://www.contributor-covenant.org/translations][translations]. 127 | 128 | [homepage]: https://www.contributor-covenant.org 129 | [v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html 130 | [Mozilla CoC]: https://github.com/mozilla/diversity 131 | [FAQ]: https://www.contributor-covenant.org/faq 132 | [translations]: https://www.contributor-covenant.org/translations 133 | -------------------------------------------------------------------------------- /.fluentci/sdk/utils.ts: -------------------------------------------------------------------------------- 1 | // deno-lint-ignore-file no-explicit-any 2 | import { 3 | ClientError, 4 | gql, 5 | GraphQLClient, 6 | GraphQLRequestError, 7 | TooManyNestedObjectsError, 8 | UnknownDaggerError, 9 | NotAwaitedRequestError, 10 | ExecError, 11 | } from "../deps.ts"; 12 | 13 | import { Metadata, QueryTree } from "./client.gen.ts"; 14 | 15 | /** 16 | * Format argument into GraphQL query format. 17 | */ 18 | function buildArgs(args: any): string { 19 | const metadata: Metadata = args.__metadata || {}; 20 | 21 | // Remove unwanted quotes 22 | const formatValue = (key: string, value: string) => { 23 | // Special treatment for enumeration, they must be inserted without quotes 24 | if (metadata[key]?.is_enum) { 25 | return JSON.stringify(value).replace(/['"]+/g, ""); 26 | } 27 | 28 | return JSON.stringify(value).replace( 29 | /\{"[a-zA-Z]+":|,"[a-zA-Z]+":/gi, 30 | (str) => { 31 | return str.replace(/"/g, ""); 32 | } 33 | ); 34 | }; 35 | 36 | if (args === undefined || args === null) { 37 | return ""; 38 | } 39 | 40 | const formattedArgs = Object.entries(args).reduce( 41 | (acc: any, [key, value]) => { 42 | // Ignore internal metadata key 43 | if (key === "__metadata") { 44 | return acc; 45 | } 46 | 47 | if (value !== undefined && value !== null) { 48 | acc.push(`${key}: ${formatValue(key, value as string)}`); 49 | } 50 | 51 | return acc; 52 | }, 53 | [] 54 | ); 55 | 56 | if (formattedArgs.length === 0) { 57 | return ""; 58 | } 59 | 60 | return `(${formattedArgs})`; 61 | } 62 | 63 | /** 64 | * Find QueryTree, convert them into GraphQl query 65 | * then compute and return the result to the appropriate field 66 | */ 67 | async function computeNestedQuery( 68 | query: QueryTree[], 69 | client: GraphQLClient 70 | ): Promise { 71 | // Check if there is a nested queryTree to be executed 72 | const isQueryTree = (value: any) => value["_queryTree"] !== undefined; 73 | 74 | // Check if there is a nested array of queryTree to be executed 75 | const isArrayQueryTree = (value: any[]) => 76 | value.every((v) => v instanceof Object && isQueryTree(v)); 77 | 78 | // Prepare query tree for final query by computing nested queries 79 | // and building it with their results. 80 | const computeQueryTree = async (value: any): Promise => { 81 | // Resolve sub queries if operation's args is a subquery 82 | for (const op of value["_queryTree"]) { 83 | await computeNestedQuery([op], client); 84 | } 85 | 86 | // push an id that will be used by the container 87 | return buildQuery([ 88 | ...value["_queryTree"], 89 | { 90 | operation: "id", 91 | }, 92 | ]); 93 | }; 94 | 95 | // Remove all undefined args and assert args type 96 | const queryToExec = query.filter((q): q is Required => !!q.args); 97 | 98 | for (const q of queryToExec) { 99 | await Promise.all( 100 | // Compute nested query for single object 101 | Object.entries(q.args).map(async ([key, value]: any) => { 102 | if (value instanceof Object && isQueryTree(value)) { 103 | // push an id that will be used by the container 104 | const getQueryTree = await computeQueryTree(value); 105 | 106 | q.args[key] = await compute(getQueryTree, client); 107 | } 108 | 109 | // Compute nested query for array of object 110 | if (Array.isArray(value) && isArrayQueryTree(value)) { 111 | const tmp: any = q.args[key]; 112 | 113 | for (let i = 0; i < value.length; i++) { 114 | // push an id that will be used by the container 115 | const getQueryTree = await computeQueryTree(value[i]); 116 | 117 | tmp[i] = await compute(getQueryTree, client); 118 | } 119 | 120 | q.args[key] = tmp; 121 | } 122 | }) 123 | ); 124 | } 125 | } 126 | 127 | /** 128 | * Convert the queryTree into a GraphQL query 129 | * @param q 130 | * @returns 131 | */ 132 | export function buildQuery(q: QueryTree[]): string { 133 | const query = q.reduce((acc, { operation, args }, i) => { 134 | const qLen = q.length; 135 | 136 | acc += ` ${operation} ${args ? `${buildArgs(args)}` : ""} ${ 137 | qLen - 1 !== i ? "{" : "}".repeat(qLen - 1) 138 | }`; 139 | 140 | return acc; 141 | }, ""); 142 | 143 | return `{${query} }`; 144 | } 145 | 146 | /** 147 | * Convert querytree into a Graphql query then compute it 148 | * @param q | QueryTree[] 149 | * @param client | GraphQLClient 150 | * @returns 151 | */ 152 | export async function computeQuery( 153 | q: QueryTree[], 154 | client: GraphQLClient 155 | ): Promise { 156 | await computeNestedQuery(q, client); 157 | 158 | const query = buildQuery(q); 159 | 160 | return await compute(query, client); 161 | } 162 | 163 | /** 164 | * Return a Graphql query result flattened 165 | * @param response any 166 | * @returns 167 | */ 168 | export function queryFlatten(response: any): T { 169 | // Recursion break condition 170 | // If our response is not an object or an array we assume we reached the value 171 | if (!(response instanceof Object) || Array.isArray(response)) { 172 | return response; 173 | } 174 | 175 | const keys = Object.keys(response); 176 | 177 | if (keys.length != 1) { 178 | // Dagger is currently expecting to only return one value 179 | // If the response is nested in a way were more than one object is nested inside throw an error 180 | throw new TooManyNestedObjectsError( 181 | "Too many nested objects inside graphql response", 182 | { response: response } 183 | ); 184 | } 185 | 186 | const nestedKey = keys[0]; 187 | 188 | return queryFlatten(response[nestedKey]); 189 | } 190 | 191 | /** 192 | * Send a GraphQL document to the server 193 | * return a flatten result 194 | * @hidden 195 | */ 196 | export async function compute( 197 | query: string, 198 | client: GraphQLClient 199 | ): Promise { 200 | let computeQuery: Awaited; 201 | try { 202 | computeQuery = await client.request( 203 | gql` 204 | ${query} 205 | ` 206 | ); 207 | } catch (e: any) { 208 | if (e instanceof ClientError) { 209 | const msg = e.response.errors?.[0]?.message ?? `API Error`; 210 | const ext = e.response.errors?.[0]?.extensions; 211 | 212 | if (ext?._type === "EXEC_ERROR") { 213 | throw new ExecError(msg, { 214 | cmd: (ext.cmd as string[]) ?? [], 215 | exitCode: (ext.exitCode as number) ?? -1, 216 | stdout: (ext.stdout as string) ?? "", 217 | stderr: (ext.stderr as string) ?? "", 218 | }); 219 | } 220 | 221 | throw new GraphQLRequestError(msg, { 222 | request: e.request, 223 | response: e.response, 224 | cause: e, 225 | }); 226 | } 227 | 228 | // Looking for connection error in case the function has not been awaited. 229 | if (e.errno === "ECONNREFUSED") { 230 | throw new NotAwaitedRequestError( 231 | "Encountered an error while requesting data via graphql through a synchronous call. Make sure the function called is awaited.", 232 | { cause: e } 233 | ); 234 | } 235 | 236 | // Just throw the unknown error 237 | throw new UnknownDaggerError( 238 | "Encountered an unknown error while requesting data via graphql", 239 | { cause: e } 240 | ); 241 | } 242 | 243 | return queryFlatten(computeQuery); 244 | } 245 | -------------------------------------------------------------------------------- /.fluentci/src/dagger/jobs.ts: -------------------------------------------------------------------------------- 1 | import { dag } from '../../sdk/client.gen.ts'; 2 | import { Directory, Secret, File } from "../../deps.ts"; 3 | import { existsSync } from "node:fs"; 4 | import { getDirectory, getDenoDeployToken } from "./lib.ts"; 5 | 6 | export enum Job { 7 | fmt = "fmt", 8 | lint = "lint", 9 | test = "test", 10 | compile = "compile", 11 | deploy = "deploy", 12 | } 13 | 14 | export const exclude = [".git", ".devbox", ".fluentci"]; 15 | 16 | const baseCtr = (pipeline: string) => { 17 | return dag 18 | .pipeline(pipeline) 19 | .container() 20 | .from("denoland/deno:alpine") 21 | .withExec(["apk", "update"]) 22 | .withExec(["apk", "add", "perl-utils"]); 23 | }; 24 | 25 | /** 26 | * @function 27 | * @description Lint your code 28 | * @param {string | Directory} src 29 | * @returns {string} 30 | */ 31 | export async function lint( 32 | src: string | Directory | undefined = "." 33 | ): Promise { 34 | let id = ""; 35 | const context = await getDirectory(src); 36 | let command = ["deno", "lint"]; 37 | 38 | if (existsSync("devbox.json")) { 39 | command = ["sh", "-c", `devbox run -- ${command.join(" ")}`]; 40 | } 41 | 42 | const ctr = baseCtr(Job.lint) 43 | .withDirectory("/app", context, { 44 | exclude, 45 | }) 46 | .withWorkdir("/app") 47 | .withExec(command); 48 | 49 | const result = await ctr.stdout(); 50 | console.log(result); 51 | 52 | return ctr.directory("/app").id(); 53 | } 54 | 55 | /** 56 | * @function 57 | * @description Format your code 58 | * @param {string | Directory} src 59 | * @returns {string} 60 | */ 61 | export async function fmt( 62 | src: string | Directory | undefined = "." 63 | ): Promise { 64 | let id = ""; 65 | const context = await getDirectory(src); 66 | let command = ["deno", "fmt"]; 67 | 68 | if (existsSync("devbox.json")) { 69 | command = ["sh", "-c", `devbox run -- ${command.join(" ")}`]; 70 | } 71 | 72 | const ctr = baseCtr(Job.fmt) 73 | .withDirectory("/app", context, { 74 | exclude, 75 | }) 76 | .withWorkdir("/app") 77 | .withExec(command); 78 | 79 | const result = await ctr.stdout(); 80 | console.log(result); 81 | return ctr.directory("/app").id(); 82 | } 83 | 84 | /** 85 | * @function 86 | * @description Run your tests 87 | * @param {string | Directory} src 88 | * @param {string[]} ignore 89 | * @returns {string} 90 | */ 91 | export async function test( 92 | src: string | Directory | undefined = ".", 93 | ignore: string[] = [] 94 | ): Promise { 95 | let id = ""; 96 | const context = await getDirectory(src); 97 | let command = ["deno", "test", "-A", "--coverage=coverage", "--lock-write"]; 98 | 99 | if (ignore.length > 0) { 100 | command = command.concat([`--ignore=${ignore.join(",")}`]); 101 | } 102 | 103 | if (existsSync("devbox.json")) { 104 | command = ["sh", "-c", `devbox run -- ${command.join(" ")}`]; 105 | } 106 | 107 | const ctr = baseCtr(Job.test) 108 | .from("denoland/deno:alpine") 109 | .withDirectory("/app", context, { 110 | exclude, 111 | }) 112 | .withWorkdir("/app") 113 | .withMountedCache("/deno-dir", dag.cacheVolume("deno-cache")) 114 | .withExec(command) 115 | .withExec([ 116 | "sh", 117 | "-c", 118 | "deno coverage ./coverage --lcov > coverage.lcov", 119 | ]); 120 | 121 | const cov = await ctr.file("/app/coverage.lcov"); 122 | cov.export("./coverage.lcov"); 123 | 124 | const result = await ctr.stdout(); 125 | console.log(result); 126 | 127 | return cov.id(); 128 | } 129 | 130 | /** 131 | * @function 132 | * @description Compile your code 133 | * @param {string | Directory} src 134 | * @param {string} file 135 | * @param {string} output 136 | * @param {string} target 137 | * @returns {string} 138 | */ 139 | export async function compile( 140 | src: string | Directory | undefined = ".", 141 | file = "main.ts", 142 | output = "main", 143 | target = "x86_64-unknown-linux-gnu" 144 | ): Promise { 145 | const context = await getDirectory(src); 146 | let command = [ 147 | "deno", 148 | "compile", 149 | "--unstable", 150 | "-A", 151 | "--output", 152 | "pocketenv", 153 | "--target", 154 | Deno.env.get("TARGET") || target, 155 | file, 156 | ]; 157 | 158 | if (existsSync("devbox.json")) { 159 | command = ["sh", "-c", `devbox run -- ${command.join(" ")}`]; 160 | } 161 | 162 | const ctr = baseCtr(Job.fmt) 163 | .withMountedCache("/assets", dag.cacheVolume("gh-release-assets")) 164 | .withDirectory("/app", context, { 165 | exclude, 166 | }) 167 | .withWorkdir("/app") 168 | .withExec(command) 169 | .withExec(["ls", "-ltr", "."]) 170 | .withExec([ 171 | "tar", 172 | "czvf", 173 | `/assets/pocketenv_${Deno.env.get("TAG") || ""}_${ 174 | Deno.env.get("TARGET") || target 175 | }.tar.gz`, 176 | "pocketenv", 177 | ]) 178 | .withExec([ 179 | "sh", 180 | "-c", 181 | `shasum -a 256 /assets/pocketenv_${Deno.env.get("TAG") || ""}_${ 182 | Deno.env.get("TARGET") || target 183 | }.tar.gz > /assets/pocketenv_${Deno.env.get("TAG") || ""}_${ 184 | Deno.env.get("TARGET") || target 185 | }.tar.gz.sha256`, 186 | ]) 187 | .withExec(["sh", "-c", "cp /assets/* /app"]); 188 | 189 | const sha256 = await ctr.file( 190 | `/app/pocketenv_${Deno.env.get("TAG") || ""}_${ 191 | Deno.env.get("TARGET") || target 192 | }.tar.gz.sha256` 193 | ); 194 | const tar = await ctr.file( 195 | `/app/pocketenv_${Deno.env.get("TAG") || ""}_${ 196 | Deno.env.get("TARGET") || target 197 | }.tar.gz` 198 | ); 199 | tar.export( 200 | `./pocketenv_${Deno.env.get("TAG") || ""}_${ 201 | Deno.env.get("TARGET") || target 202 | }.tar.gz` 203 | ); 204 | sha256.export( 205 | `./pocketenv_${Deno.env.get("TAG") || ""}_${ 206 | Deno.env.get("TARGET") || target 207 | }.tar.gz.sha256` 208 | ); 209 | 210 | await ctr.stdout(); 211 | return tar.id(); 212 | } 213 | 214 | /** 215 | * @function 216 | * @description Deploy your code to Deno Deploy 217 | * @param {string | Directory} src 218 | * @param {string | Secret} token 219 | * @param {string} project 220 | * @param {string} main 221 | * @param {boolean} noStatic 222 | * @param {string} excludeOpt 223 | * @returns {string} 224 | */ 225 | export async function deploy( 226 | src: string | Directory | undefined = ".", 227 | token?: string | Secret, 228 | project?: string, 229 | main?: string, 230 | noStatic?: boolean, 231 | excludeOpt?: string 232 | ): Promise { 233 | let result = ""; 234 | const context = await getDirectory(src); 235 | let installDeployCtl = [ 236 | "deno", 237 | "install", 238 | "--allow-all", 239 | "--no-check", 240 | "-r", 241 | "-f", 242 | "https://deno.land/x/deploy/deployctl.ts", 243 | ]; 244 | 245 | let command = ["deployctl", "deploy"]; 246 | 247 | if (Deno.env.get("NO_STATIC") || noStatic) { 248 | command = command.concat(["--no-static"]); 249 | } 250 | 251 | if (Deno.env.get("EXCLUDE") || excludeOpt) { 252 | command = command.concat([ 253 | `--exclude=${Deno.env.get("EXCLUDE") || excludeOpt}`, 254 | ]); 255 | } 256 | 257 | const secret = await getDenoDeployToken(token); 258 | 259 | if (!secret) { 260 | console.error("DENO_DEPLOY_TOKEN environment variable is not set"); 261 | Deno.exit(1); 262 | } 263 | 264 | if (!project) { 265 | throw new Error("DENO_PROJECT environment variable is not set"); 266 | } 267 | 268 | const script = Deno.env.get("DENO_MAIN_SCRIPT") || "main.tsx"; 269 | command = command.concat([ 270 | `--project=${Deno.env.get("DENO_PROJECT") || project}`, 271 | script, 272 | ]); 273 | 274 | if (existsSync("devbox.json")) { 275 | command = ["sh", "-c", `devbox run -- ${command.join(" ")}`]; 276 | installDeployCtl = [ 277 | "sh", 278 | "-c", 279 | `devbox run -- ${installDeployCtl.join(" ")}`, 280 | ]; 281 | } 282 | 283 | const ctr = baseCtr(Job.deploy) 284 | .from("denoland/deno:alpine") 285 | .withDirectory("/app", context, { 286 | exclude, 287 | }) 288 | .withWorkdir("/app") 289 | .withEnvVariable("PATH", "/root/.deno/bin:$PATH", { expand: true }) 290 | .withSecretVariable("DENO_DEPLOY_TOKEN", secret) 291 | .withEnvVariable( 292 | "DENO_MAIN_SCRIPT", 293 | Deno.env.get("DENO_MAIN_SCRIPT") || main || "main.tsx" 294 | ) 295 | .withExec(installDeployCtl) 296 | .withExec(command); 297 | 298 | return ctr.stdout(); 299 | 300 | } 301 | 302 | export type JobExec = 303 | | ((src: string | Directory | undefined) => Promise) 304 | | (( 305 | src: string | Directory | undefined, 306 | ignore?: string[] 307 | ) => Promise) 308 | | (( 309 | src: string | Directory | undefined, 310 | file?: string, 311 | output?: string, 312 | target?: string 313 | ) => Promise); 314 | 315 | export const runnableJobs: Record = { 316 | [Job.fmt]: fmt, 317 | [Job.lint]: lint, 318 | [Job.test]: test, 319 | [Job.compile]: compile, 320 | [Job.deploy]: deploy, 321 | }; 322 | 323 | export const jobDescriptions: Record = { 324 | [Job.fmt]: "Format your code", 325 | [Job.lint]: "Lint your code", 326 | [Job.test]: "Run your tests", 327 | [Job.compile]: "Compile your code", 328 | [Job.deploy]: "Deploy your code to Deno Deploy", 329 | }; 330 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2024 Tsiry Sandratraina 2 | 3 | Mozilla Public License, version 2.0 4 | 5 | 1. Definitions 6 | 7 | 1.1. "Contributor" 8 | 9 | means each individual or legal entity that creates, contributes to the 10 | creation of, or owns Covered Software. 11 | 12 | 1.2. "Contributor Version" 13 | 14 | means the combination of the Contributions of others (if any) used by a 15 | Contributor and that particular Contributor's Contribution. 16 | 17 | 1.3. "Contribution" 18 | 19 | means Covered Software of a particular Contributor. 20 | 21 | 1.4. "Covered Software" 22 | 23 | means Source Code Form to which the initial Contributor has attached the 24 | notice in Exhibit A, the Executable Form of such Source Code Form, and 25 | Modifications of such Source Code Form, in each case including portions 26 | thereof. 27 | 28 | 1.5. "Incompatible With Secondary Licenses" 29 | means 30 | 31 | a. that the initial Contributor has attached the notice described in 32 | Exhibit B to the Covered Software; or 33 | 34 | b. that the Covered Software was made available under the terms of 35 | version 1.1 or earlier of the License, but not also under the terms of 36 | a Secondary License. 37 | 38 | 1.6. "Executable Form" 39 | 40 | means any form of the work other than Source Code Form. 41 | 42 | 1.7. "Larger Work" 43 | 44 | means a work that combines Covered Software with other material, in a 45 | separate file or files, that is not Covered Software. 46 | 47 | 1.8. "License" 48 | 49 | means this document. 50 | 51 | 1.9. "Licensable" 52 | 53 | means having the right to grant, to the maximum extent possible, whether 54 | at the time of the initial grant or subsequently, any and all of the 55 | rights conveyed by this License. 56 | 57 | 1.10. "Modifications" 58 | 59 | means any of the following: 60 | 61 | a. any file in Source Code Form that results from an addition to, 62 | deletion from, or modification of the contents of Covered Software; or 63 | 64 | b. any new file in Source Code Form that contains any Covered Software. 65 | 66 | 1.11. "Patent Claims" of a Contributor 67 | 68 | means any patent claim(s), including without limitation, method, 69 | process, and apparatus claims, in any patent Licensable by such 70 | Contributor that would be infringed, but for the grant of the License, 71 | by the making, using, selling, offering for sale, having made, import, 72 | or transfer of either its Contributions or its Contributor Version. 73 | 74 | 1.12. "Secondary License" 75 | 76 | means either the GNU General Public License, Version 2.0, the GNU Lesser 77 | General Public License, Version 2.1, the GNU Affero General Public 78 | License, Version 3.0, or any later versions of those licenses. 79 | 80 | 1.13. "Source Code Form" 81 | 82 | means the form of the work preferred for making modifications. 83 | 84 | 1.14. "You" (or "Your") 85 | 86 | means an individual or a legal entity exercising rights under this 87 | License. For legal entities, "You" includes any entity that controls, is 88 | controlled by, or is under common control with You. For purposes of this 89 | definition, "control" means (a) the power, direct or indirect, to cause 90 | the direction or management of such entity, whether by contract or 91 | otherwise, or (b) ownership of more than fifty percent (50%) of the 92 | outstanding shares or beneficial ownership of such entity. 93 | 94 | 95 | 2. License Grants and Conditions 96 | 97 | 2.1. Grants 98 | 99 | Each Contributor hereby grants You a world-wide, royalty-free, 100 | non-exclusive license: 101 | 102 | a. under intellectual property rights (other than patent or trademark) 103 | Licensable by such Contributor to use, reproduce, make available, 104 | modify, display, perform, distribute, and otherwise exploit its 105 | Contributions, either on an unmodified basis, with Modifications, or 106 | as part of a Larger Work; and 107 | 108 | b. under Patent Claims of such Contributor to make, use, sell, offer for 109 | sale, have made, import, and otherwise transfer either its 110 | Contributions or its Contributor Version. 111 | 112 | 2.2. Effective Date 113 | 114 | The licenses granted in Section 2.1 with respect to any Contribution 115 | become effective for each Contribution on the date the Contributor first 116 | distributes such Contribution. 117 | 118 | 2.3. Limitations on Grant Scope 119 | 120 | The licenses granted in this Section 2 are the only rights granted under 121 | this License. No additional rights or licenses will be implied from the 122 | distribution or licensing of Covered Software under this License. 123 | Notwithstanding Section 2.1(b) above, no patent license is granted by a 124 | Contributor: 125 | 126 | a. for any code that a Contributor has removed from Covered Software; or 127 | 128 | b. for infringements caused by: (i) Your and any other third party's 129 | modifications of Covered Software, or (ii) the combination of its 130 | Contributions with other software (except as part of its Contributor 131 | Version); or 132 | 133 | c. under Patent Claims infringed by Covered Software in the absence of 134 | its Contributions. 135 | 136 | This License does not grant any rights in the trademarks, service marks, 137 | or logos of any Contributor (except as may be necessary to comply with 138 | the notice requirements in Section 3.4). 139 | 140 | 2.4. Subsequent Licenses 141 | 142 | No Contributor makes additional grants as a result of Your choice to 143 | distribute the Covered Software under a subsequent version of this 144 | License (see Section 10.2) or under the terms of a Secondary License (if 145 | permitted under the terms of Section 3.3). 146 | 147 | 2.5. Representation 148 | 149 | Each Contributor represents that the Contributor believes its 150 | Contributions are its original creation(s) or it has sufficient rights to 151 | grant the rights to its Contributions conveyed by this License. 152 | 153 | 2.6. Fair Use 154 | 155 | This License is not intended to limit any rights You have under 156 | applicable copyright doctrines of fair use, fair dealing, or other 157 | equivalents. 158 | 159 | 2.7. Conditions 160 | 161 | Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in 162 | Section 2.1. 163 | 164 | 165 | 3. Responsibilities 166 | 167 | 3.1. Distribution of Source Form 168 | 169 | All distribution of Covered Software in Source Code Form, including any 170 | Modifications that You create or to which You contribute, must be under 171 | the terms of this License. You must inform recipients that the Source 172 | Code Form of the Covered Software is governed by the terms of this 173 | License, and how they can obtain a copy of this License. You may not 174 | attempt to alter or restrict the recipients' rights in the Source Code 175 | Form. 176 | 177 | 3.2. Distribution of Executable Form 178 | 179 | If You distribute Covered Software in Executable Form then: 180 | 181 | a. such Covered Software must also be made available in Source Code Form, 182 | as described in Section 3.1, and You must inform recipients of the 183 | Executable Form how they can obtain a copy of such Source Code Form by 184 | reasonable means in a timely manner, at a charge no more than the cost 185 | of distribution to the recipient; and 186 | 187 | b. You may distribute such Executable Form under the terms of this 188 | License, or sublicense it under different terms, provided that the 189 | license for the Executable Form does not attempt to limit or alter the 190 | recipients' rights in the Source Code Form under this License. 191 | 192 | 3.3. Distribution of a Larger Work 193 | 194 | You may create and distribute a Larger Work under terms of Your choice, 195 | provided that You also comply with the requirements of this License for 196 | the Covered Software. If the Larger Work is a combination of Covered 197 | Software with a work governed by one or more Secondary Licenses, and the 198 | Covered Software is not Incompatible With Secondary Licenses, this 199 | License permits You to additionally distribute such Covered Software 200 | under the terms of such Secondary License(s), so that the recipient of 201 | the Larger Work may, at their option, further distribute the Covered 202 | Software under the terms of either this License or such Secondary 203 | License(s). 204 | 205 | 3.4. Notices 206 | 207 | You may not remove or alter the substance of any license notices 208 | (including copyright notices, patent notices, disclaimers of warranty, or 209 | limitations of liability) contained within the Source Code Form of the 210 | Covered Software, except that You may alter any license notices to the 211 | extent required to remedy known factual inaccuracies. 212 | 213 | 3.5. Application of Additional Terms 214 | 215 | You may choose to offer, and to charge a fee for, warranty, support, 216 | indemnity or liability obligations to one or more recipients of Covered 217 | Software. However, You may do so only on Your own behalf, and not on 218 | behalf of any Contributor. You must make it absolutely clear that any 219 | such warranty, support, indemnity, or liability obligation is offered by 220 | You alone, and You hereby agree to indemnify every Contributor for any 221 | liability incurred by such Contributor as a result of warranty, support, 222 | indemnity or liability terms You offer. You may include additional 223 | disclaimers of warranty and limitations of liability specific to any 224 | jurisdiction. 225 | 226 | 4. Inability to Comply Due to Statute or Regulation 227 | 228 | If it is impossible for You to comply with any of the terms of this License 229 | with respect to some or all of the Covered Software due to statute, 230 | judicial order, or regulation then You must: (a) comply with the terms of 231 | this License to the maximum extent possible; and (b) describe the 232 | limitations and the code they affect. Such description must be placed in a 233 | text file included with all distributions of the Covered Software under 234 | this License. Except to the extent prohibited by statute or regulation, 235 | such description must be sufficiently detailed for a recipient of ordinary 236 | skill to be able to understand it. 237 | 238 | 5. Termination 239 | 240 | 5.1. The rights granted under this License will terminate automatically if You 241 | fail to comply with any of its terms. However, if You become compliant, 242 | then the rights granted under this License from a particular Contributor 243 | are reinstated (a) provisionally, unless and until such Contributor 244 | explicitly and finally terminates Your grants, and (b) on an ongoing 245 | basis, if such Contributor fails to notify You of the non-compliance by 246 | some reasonable means prior to 60 days after You have come back into 247 | compliance. Moreover, Your grants from a particular Contributor are 248 | reinstated on an ongoing basis if such Contributor notifies You of the 249 | non-compliance by some reasonable means, this is the first time You have 250 | received notice of non-compliance with this License from such 251 | Contributor, and You become compliant prior to 30 days after Your receipt 252 | of the notice. 253 | 254 | 5.2. If You initiate litigation against any entity by asserting a patent 255 | infringement claim (excluding declaratory judgment actions, 256 | counter-claims, and cross-claims) alleging that a Contributor Version 257 | directly or indirectly infringes any patent, then the rights granted to 258 | You by any and all Contributors for the Covered Software under Section 259 | 2.1 of this License shall terminate. 260 | 261 | 5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user 262 | license agreements (excluding distributors and resellers) which have been 263 | validly granted by You or Your distributors under this License prior to 264 | termination shall survive termination. 265 | 266 | 6. Disclaimer of Warranty 267 | 268 | Covered Software is provided under this License on an "as is" basis, 269 | without warranty of any kind, either expressed, implied, or statutory, 270 | including, without limitation, warranties that the Covered Software is free 271 | of defects, merchantable, fit for a particular purpose or non-infringing. 272 | The entire risk as to the quality and performance of the Covered Software 273 | is with You. Should any Covered Software prove defective in any respect, 274 | You (not any Contributor) assume the cost of any necessary servicing, 275 | repair, or correction. This disclaimer of warranty constitutes an essential 276 | part of this License. No use of any Covered Software is authorized under 277 | this License except under this disclaimer. 278 | 279 | 7. Limitation of Liability 280 | 281 | Under no circumstances and under no legal theory, whether tort (including 282 | negligence), contract, or otherwise, shall any Contributor, or anyone who 283 | distributes Covered Software as permitted above, be liable to You for any 284 | direct, indirect, special, incidental, or consequential damages of any 285 | character including, without limitation, damages for lost profits, loss of 286 | goodwill, work stoppage, computer failure or malfunction, or any and all 287 | other commercial damages or losses, even if such party shall have been 288 | informed of the possibility of such damages. This limitation of liability 289 | shall not apply to liability for death or personal injury resulting from 290 | such party's negligence to the extent applicable law prohibits such 291 | limitation. Some jurisdictions do not allow the exclusion or limitation of 292 | incidental or consequential damages, so this exclusion and limitation may 293 | not apply to You. 294 | 295 | 8. Litigation 296 | 297 | Any litigation relating to this License may be brought only in the courts 298 | of a jurisdiction where the defendant maintains its principal place of 299 | business and such litigation shall be governed by laws of that 300 | jurisdiction, without reference to its conflict-of-law provisions. Nothing 301 | in this Section shall prevent a party's ability to bring cross-claims or 302 | counter-claims. 303 | 304 | 9. Miscellaneous 305 | 306 | This License represents the complete agreement concerning the subject 307 | matter hereof. If any provision of this License is held to be 308 | unenforceable, such provision shall be reformed only to the extent 309 | necessary to make it enforceable. Any law or regulation which provides that 310 | the language of a contract shall be construed against the drafter shall not 311 | be used to construe this License against a Contributor. 312 | 313 | 314 | 10. Versions of the License 315 | 316 | 10.1. New Versions 317 | 318 | Mozilla Foundation is the license steward. Except as provided in Section 319 | 10.3, no one other than the license steward has the right to modify or 320 | publish new versions of this License. Each version will be given a 321 | distinguishing version number. 322 | 323 | 10.2. Effect of New Versions 324 | 325 | You may distribute the Covered Software under the terms of the version 326 | of the License under which You originally received the Covered Software, 327 | or under the terms of any subsequent version published by the license 328 | steward. 329 | 330 | 10.3. Modified Versions 331 | 332 | If you create software not governed by this License, and you want to 333 | create a new license for such software, you may create and use a 334 | modified version of this License if you rename the license and remove 335 | any references to the name of the license steward (except to note that 336 | such modified license differs from this License). 337 | 338 | 10.4. Distributing Source Code Form that is Incompatible With Secondary 339 | Licenses If You choose to distribute Source Code Form that is 340 | Incompatible With Secondary Licenses under the terms of this version of 341 | the License, the notice described in Exhibit B of this License must be 342 | attached. 343 | 344 | Exhibit A - Source Code Form License Notice 345 | 346 | This Source Code Form is subject to the 347 | terms of the Mozilla Public License, v. 348 | 2.0. If a copy of the MPL was not 349 | distributed with this file, You can 350 | obtain one at 351 | http://mozilla.org/MPL/2.0/. 352 | 353 | If it is not possible or desirable to put the notice in a particular file, 354 | then You may include the notice in a location (such as a LICENSE file in a 355 | relevant directory) where a recipient would be likely to look for such a 356 | notice. 357 | 358 | You may add additional accurate notices of copyright ownership. 359 | 360 | Exhibit B - "Incompatible With Secondary Licenses" Notice 361 | 362 | This Source Code Form is "Incompatible 363 | With Secondary Licenses", as defined by 364 | the Mozilla Public License, v. 2.0. -------------------------------------------------------------------------------- /.fluentci/deno.lock: -------------------------------------------------------------------------------- 1 | { 2 | "version": "3", 3 | "remote": { 4 | "https://cdn.jsdelivr.net/gh/tsirysndr/tar@v0.1.1/deps.ts": "096395daebc7ed8a18f0484e4ffcc3a7f70e50946735f7df9611a7fcfd8272cc", 5 | "https://cdn.jsdelivr.net/gh/tsirysndr/tar@v0.1.1/mod.ts": "e269d71c72ae68e82c1960e5db2a0c7419c97c9683ef717de0ab75d90f364713", 6 | "https://cdn.jsdelivr.net/gh/tsirysndr/tar@v0.1.1/src/interface.ts": "3d4371b7590e90af7b191b93f8681ea7add6f5dca0d26a4d171701de09707c4f", 7 | "https://cdn.jsdelivr.net/gh/tsirysndr/tar@v0.1.1/src/tar.ts": "9b02eaaa784b225ad7a23d2769cd492adf113ea7c11c02e3646849e98f4ae43b", 8 | "https://cdn.skypack.dev/-/lodash@v4.17.21-K6GEbP02mWFnLA45zAmi/dist=es2019,mode=imports/optimized/lodash.js": "10c4df47937ffc78548d136dd535a021df5f57182a653260d715c0690dd22978", 9 | "https://cdn.skypack.dev/lodash": "8280de0b3efd87f06ea0eb330d15b8de32c059556023b8c6524e9eb9e4844dc0", 10 | "https://deno.land/std@0.129.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74", 11 | "https://deno.land/std@0.129.0/_util/os.ts": "49b92edea1e82ba295ec946de8ffd956ed123e2948d9bd1d3e901b04e4307617", 12 | "https://deno.land/std@0.129.0/archive/tar.ts": "35ea1baddec7988cc4034765a2cee7613bc8074bd40940d3f5e98f63070a716a", 13 | "https://deno.land/std@0.129.0/async/abortable.ts": "a896ac6b0d4237bd2d2d248217cfa1f0d85ccda93cb25ebda55e33850e526be6", 14 | "https://deno.land/std@0.129.0/async/deadline.ts": "48ac998d7564969f3e6ec6b6f9bf0217ebd00239b1b2292feba61272d5dd58d0", 15 | "https://deno.land/std@0.129.0/async/debounce.ts": "564273ef242bcfcda19a439132f940db8694173abffc159ea34f07d18fc42620", 16 | "https://deno.land/std@0.129.0/async/deferred.ts": "bc18e28108252c9f67dfca2bbc4587c3cbf3aeb6e155f8c864ca8ecff992b98a", 17 | "https://deno.land/std@0.129.0/async/delay.ts": "cbbdf1c87d1aed8edc7bae13592fb3e27e3106e0748f089c263390d4f49e5f6c", 18 | "https://deno.land/std@0.129.0/async/mod.ts": "2240c6841157738414331f47dee09bb8c0482c5b1980b6e3234dd03515c8132f", 19 | "https://deno.land/std@0.129.0/async/mux_async_iterator.ts": "f4d1d259b0c694d381770ddaaa4b799a94843eba80c17f4a2ec2949168e52d1e", 20 | "https://deno.land/std@0.129.0/async/pool.ts": "97b0dd27c69544e374df857a40902e74e39532f226005543eabacb551e277082", 21 | "https://deno.land/std@0.129.0/async/tee.ts": "1341feb1f5b1a96f8628d0f8fc07d8c43d3813423f18a63bf1b4785568d21b1f", 22 | "https://deno.land/std@0.129.0/bytes/bytes_list.ts": "67eb118e0b7891d2f389dad4add35856f4ad5faab46318ff99653456c23b025d", 23 | "https://deno.land/std@0.129.0/bytes/equals.ts": "fc16dff2090cced02497f16483de123dfa91e591029f985029193dfaa9d894c9", 24 | "https://deno.land/std@0.129.0/bytes/mod.ts": "d3b455c0dbd4804644159d1e25946ade5ee385d2359894de49e2c6101b18b7a9", 25 | "https://deno.land/std@0.129.0/encoding/base64.ts": "c8c16b4adaa60d7a8eee047c73ece26844435e8f7f1328d74593dbb2dd58ea4f", 26 | "https://deno.land/std@0.129.0/encoding/base64url.ts": "55f9d13df02efac10c6f96169daa3e702606a64e8aa27c0295f645f198c27130", 27 | "https://deno.land/std@0.129.0/fmt/colors.ts": "30455035d6d728394781c10755351742dd731e3db6771b1843f9b9e490104d37", 28 | "https://deno.land/std@0.129.0/fmt/printf.ts": "e2c0f72146aed1efecf0c39ab928b26ae493a2278f670a871a0fbdcf36ff3379", 29 | "https://deno.land/std@0.129.0/fs/_util.ts": "0fb24eb4bfebc2c194fb1afdb42b9c3dda12e368f43e8f2321f84fc77d42cb0f", 30 | "https://deno.land/std@0.129.0/fs/ensure_dir.ts": "9dc109c27df4098b9fc12d949612ae5c9c7169507660dcf9ad90631833209d9d", 31 | "https://deno.land/std@0.129.0/fs/ensure_file.ts": "7d353e64fee3d4d1e7c6b6726a2a5e987ba402c15fb49566309042887349c545", 32 | "https://deno.land/std@0.129.0/io/buffer.ts": "bd0c4bf53db4b4be916ca5963e454bddfd3fcd45039041ea161dbf826817822b", 33 | "https://deno.land/std@0.129.0/io/files.ts": "d199ef64e918a256320ba8d8d44ae91de87c9077df8f8d6cca013f1b9fbbe285", 34 | "https://deno.land/std@0.129.0/io/readers.ts": "679471f3b9929b54393c9cd75b6bd178b4bc6d9aab5c0f1f9538f862cf4746fe", 35 | "https://deno.land/std@0.129.0/io/util.ts": "078da53bba767bec0d45f7da44411f6dbf269e51ef7fcfea5e3714e04681c674", 36 | "https://deno.land/std@0.129.0/node/_buffer.mjs": "f4a7df481d4eed06dc0151b833177d8ef74fc3a96dd4d2b073e690b6ced9474d", 37 | "https://deno.land/std@0.129.0/node/_core.ts": "568d277be2e086af996cbdd599fec569f5280e9a494335ca23ad392b130d7bb9", 38 | "https://deno.land/std@0.129.0/node/_events.mjs": "c0e3e0e290a8b81fee9d2973a529c8dcd5ebb4406782d1f91085274e2cb8490f", 39 | "https://deno.land/std@0.129.0/node/_fixed_queue.ts": "455b3c484de48e810b13bdf95cd1658ecb1ba6bcb8b9315ffe994efcde3ba5f5", 40 | "https://deno.land/std@0.129.0/node/_next_tick.ts": "64c361f6bca21df2a72dd77b84bd49d80d97a694dd3080703bc78f52146351d1", 41 | "https://deno.land/std@0.129.0/node/_process/exiting.ts": "bc9694769139ffc596f962087155a8bfef10101d03423b9dcbc51ce6e1f88fce", 42 | "https://deno.land/std@0.129.0/node/_util/_util_callbackify.ts": "79928ad80df3e469f7dcdb198118a7436d18a9f6c08bd7a4382332ad25a718cf", 43 | "https://deno.land/std@0.129.0/node/_utils.ts": "c2c352e83c4c96f5ff994b1c8246bff2abcb21bfc3f1c06162cb3af1d201e615", 44 | "https://deno.land/std@0.129.0/node/buffer.ts": "fbecbf3f237fa49bec96e97ecf56a7b92d48037b3d11219288e68943cc921600", 45 | "https://deno.land/std@0.129.0/node/events.ts": "a1d40fc0dbccc944379ef968b80ea08f9fce579e88b5057fdb64e4f0812476dd", 46 | "https://deno.land/std@0.129.0/node/internal/buffer.mjs": "6662fe7fe517329453545be34cea27a24f8ccd6d09afd4f609f11ade2b6dfca7", 47 | "https://deno.land/std@0.129.0/node/internal/crypto/keys.ts": "16ce7b15a9fc5e4e3dee8fde75dae12f3d722558d5a1a6e65a9b4f86d64a21e9", 48 | "https://deno.land/std@0.129.0/node/internal/crypto/util.mjs": "1de55a47fdbed6721b467a77ba48fdd1550c10b5eee77bbdb602eaffee365a5e", 49 | "https://deno.land/std@0.129.0/node/internal/error_codes.ts": "ac03c4eae33de3a69d6c98e8678003207eecf75a6900eb847e3fea3c8c9e6d8f", 50 | "https://deno.land/std@0.129.0/node/internal/errors.ts": "0d3a1eb03b654beb29b8354759a6902f45a840d4f957e9a3c632a24ce4c32632", 51 | "https://deno.land/std@0.129.0/node/internal/hide_stack_frames.ts": "a91962ec84610bc7ec86022c4593cdf688156a5910c07b5bcd71994225c13a03", 52 | "https://deno.land/std@0.129.0/node/internal/normalize_encoding.mjs": "3779ec8a7adf5d963b0224f9b85d1bc974a2ec2db0e858396b5d3c2c92138a0a", 53 | "https://deno.land/std@0.129.0/node/internal/util.mjs": "684653b962fae84fd2bc08997291b1a50bed09b95dcfa7d35e3c4143163e879a", 54 | "https://deno.land/std@0.129.0/node/internal/util/comparisons.ts": "680b55fe8bdf1613633bc469fa0440f43162c76dbe36af9aa2966310e1bb9f6e", 55 | "https://deno.land/std@0.129.0/node/internal/util/debuglog.ts": "99e91bdf26f6c67861031f684817e1705a5bc300e81346585b396f413387edfb", 56 | "https://deno.land/std@0.129.0/node/internal/util/inspect.mjs": "d1c2569c66a3dab45eec03208f22ad4351482527859c0011a28a6c797288a0aa", 57 | "https://deno.land/std@0.129.0/node/internal/util/types.ts": "b2dacb8f1f5d28a51c4da5c5b75172b7fcf694073ce95ca141323657e18b0c60", 58 | "https://deno.land/std@0.129.0/node/internal/validators.mjs": "a7e82eafb7deb85c332d5f8d9ffef052f46a42d4a121eada4a54232451acc49a", 59 | "https://deno.land/std@0.129.0/node/internal_binding/_libuv_winerror.ts": "801e05c2742ae6cd42a5f0fd555a255a7308a65732551e962e5345f55eedc519", 60 | "https://deno.land/std@0.129.0/node/internal_binding/_node.ts": "e4075ba8a37aef4eb5b592c8e3807c39cb49ca8653faf8e01a43421938076c1b", 61 | "https://deno.land/std@0.129.0/node/internal_binding/_utils.ts": "1c50883b5751a9ea1b38951e62ed63bacfdc9d69ea665292edfa28e1b1c5bd94", 62 | "https://deno.land/std@0.129.0/node/internal_binding/_winerror.ts": "8811d4be66f918c165370b619259c1f35e8c3e458b8539db64c704fbde0a7cd2", 63 | "https://deno.land/std@0.129.0/node/internal_binding/buffer.ts": "722c62b85f966e0777b2d98c021b60e75d7f2c2dabc43413ef37d60dbd13a5d9", 64 | "https://deno.land/std@0.129.0/node/internal_binding/constants.ts": "aff06aac49eda4234bd3a2b0b8e1fbfc67824e281c532ff9960831ab503014cc", 65 | "https://deno.land/std@0.129.0/node/internal_binding/string_decoder.ts": "5cb1863763d1e9b458bc21d6f976f16d9c18b3b3f57eaf0ade120aee38fba227", 66 | "https://deno.land/std@0.129.0/node/internal_binding/types.ts": "4c26fb74ba2e45de553c15014c916df6789529a93171e450d5afb016b4c765e7", 67 | "https://deno.land/std@0.129.0/node/internal_binding/util.ts": "90364292e2bd598ab5d105b48ca49817b6708f2d1d9cbaf08b2b3ab5ca4c90a7", 68 | "https://deno.land/std@0.129.0/node/internal_binding/uv.ts": "3821bc5e676d6955d68f581988c961d77dd28190aba5a9c59f16001a4deb34ba", 69 | "https://deno.land/std@0.129.0/node/util.ts": "7fd6933b37af89a8e64d73dc6ee1732455a59e7e6d0965311fbd73cd634ea630", 70 | "https://deno.land/std@0.129.0/node/util/types.mjs": "f9288198cacd374b41bae7e92a23179d3160f4c0eaf14e19be3a4e7057219a60", 71 | "https://deno.land/std@0.129.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3", 72 | "https://deno.land/std@0.129.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09", 73 | "https://deno.land/std@0.129.0/path/_util.ts": "c1e9686d0164e29f7d880b2158971d805b6e0efc3110d0b3e24e4b8af2190d2b", 74 | "https://deno.land/std@0.129.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633", 75 | "https://deno.land/std@0.129.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee", 76 | "https://deno.land/std@0.129.0/path/mod.ts": "4275129bb766f0e475ecc5246aa35689eeade419d72a48355203f31802640be7", 77 | "https://deno.land/std@0.129.0/path/posix.ts": "663e4a6fe30a145f56aa41a22d95114c4c5582d8b57d2d7c9ed27ad2c47636bb", 78 | "https://deno.land/std@0.129.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9", 79 | "https://deno.land/std@0.129.0/path/win32.ts": "e7bdf63e8d9982b4d8a01ef5689425c93310ece950e517476e22af10f41a136e", 80 | "https://deno.land/std@0.129.0/streams/conversion.ts": "712585bfa0172a97fb68dd46e784ae8ad59d11b88079d6a4ab098ff42e697d21", 81 | "https://deno.land/std@0.129.0/testing/_diff.ts": "9d849cd6877694152e01775b2d93f9d6b7aef7e24bfe3bfafc4d7a1ac8e9f392", 82 | "https://deno.land/std@0.129.0/testing/asserts.ts": "0a95d9e8076dd3e7f0eeb605a67c148078b4b11f4abcd5eef115b0361b0736a2", 83 | "https://deno.land/std@0.150.0/media_types/_util.ts": "ce9b4fc4ba1c447dafab619055e20fd88236ca6bdd7834a21f98bd193c3fbfa1", 84 | "https://deno.land/std@0.150.0/media_types/mod.ts": "2d4b6f32a087029272dc59e0a55ae3cc4d1b27b794ccf528e94b1925795b3118", 85 | "https://deno.land/std@0.150.0/media_types/vendor/mime-db.v1.52.0.ts": "724cee25fa40f1a52d3937d6b4fbbfdd7791ff55e1b7ac08d9319d5632c7f5af", 86 | "https://deno.land/std@0.191.0/fmt/colors.ts": "d67e3cd9f472535241a8e410d33423980bec45047e343577554d3356e1f0ef4e", 87 | "https://deno.land/std@0.191.0/testing/_diff.ts": "1a3c044aedf77647d6cac86b798c6417603361b66b54c53331b312caeb447aea", 88 | "https://deno.land/std@0.191.0/testing/_format.ts": "a69126e8a469009adf4cf2a50af889aca364c349797e63174884a52ff75cf4c7", 89 | "https://deno.land/std@0.191.0/testing/asserts.ts": "e16d98b4d73ffc4ed498d717307a12500ae4f2cbe668f1a215632d19fcffc22f", 90 | "https://deno.land/std@0.203.0/assert/assert.ts": "9a97dad6d98c238938e7540736b826440ad8c1c1e54430ca4c4e623e585607ee", 91 | "https://deno.land/std@0.203.0/assert/assertion_error.ts": "4d0bde9b374dfbcbe8ac23f54f567b77024fb67dbb1906a852d67fe050d42f56", 92 | "https://deno.land/std@0.203.0/path/_basename.ts": "057d420c9049821f983f784fd87fa73ac471901fb628920b67972b0f44319343", 93 | "https://deno.land/std@0.203.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", 94 | "https://deno.land/std@0.203.0/path/_dirname.ts": "355e297236b2218600aee7a5301b937204c62e12da9db4b0b044993d9e658395", 95 | "https://deno.land/std@0.203.0/path/_extname.ts": "eaaa5aae1acf1f03254d681bd6a8ce42a9cb5b7ff2213a9d4740e8ab31283664", 96 | "https://deno.land/std@0.203.0/path/_format.ts": "4a99270d6810f082e614309164fad75d6f1a483b68eed97c830a506cc589f8b4", 97 | "https://deno.land/std@0.203.0/path/_from_file_url.ts": "6eadfae2e6f63ad9ee46b26db4a1b16583055c0392acedfb50ed2fc694b6f581", 98 | "https://deno.land/std@0.203.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", 99 | "https://deno.land/std@0.203.0/path/_is_absolute.ts": "05dac10b5e93c63198b92e3687baa2be178df5321c527dc555266c0f4f51558c", 100 | "https://deno.land/std@0.203.0/path/_join.ts": "815f5e85b042285175b1492dd5781240ce126c23bd97bad6b8211fe7129c538e", 101 | "https://deno.land/std@0.203.0/path/_normalize.ts": "a19ec8706b2707f9dd974662a5cd89fad438e62ab1857e08b314a8eb49a34d81", 102 | "https://deno.land/std@0.203.0/path/_os.ts": "30b0c2875f360c9296dbe6b7f2d528f0f9c741cecad2e97f803f5219e91b40a2", 103 | "https://deno.land/std@0.203.0/path/_parse.ts": "0f9b0ff43682dd9964eb1c4398610c4e165d8db9d3ac9d594220217adf480cfa", 104 | "https://deno.land/std@0.203.0/path/_relative.ts": "27bdeffb5311a47d85be26d37ad1969979359f7636c5cd9fcf05dcd0d5099dc5", 105 | "https://deno.land/std@0.203.0/path/_resolve.ts": "7a3616f1093735ed327e758313b79c3c04ea921808ca5f19ddf240cb68d0adf6", 106 | "https://deno.land/std@0.203.0/path/_to_file_url.ts": "a141e4a525303e1a3a0c0571fd024552b5f3553a2af7d75d1ff3a503dcbb66d8", 107 | "https://deno.land/std@0.203.0/path/_to_namespaced_path.ts": "0d5f4caa2ed98ef7a8786286df6af804b50e38859ae897b5b5b4c8c5930a75c8", 108 | "https://deno.land/std@0.203.0/path/_util.ts": "4e191b1bac6b3bf0c31aab42e5ca2e01a86ab5a0d2e08b75acf8585047a86221", 109 | "https://deno.land/std@0.203.0/path/basename.ts": "bdfa5a624c6a45564dc6758ef2077f2822978a6dbe77b0a3514f7d1f81362930", 110 | "https://deno.land/std@0.203.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000", 111 | "https://deno.land/std@0.203.0/path/dirname.ts": "b6533f4ee4174a526dec50c279534df5345836dfdc15318400b08c62a62a39dd", 112 | "https://deno.land/std@0.203.0/path/extname.ts": "62c4b376300795342fe1e4746c0de518b4dc9c4b0b4617bfee62a2973a9555cf", 113 | "https://deno.land/std@0.203.0/path/format.ts": "110270b238514dd68455a4c54956215a1aff7e37e22e4427b7771cefe1920aa5", 114 | "https://deno.land/std@0.203.0/path/from_file_url.ts": "9f5cb58d58be14c775ec2e57fc70029ac8b17ed3bd7fe93e475b07280adde0ac", 115 | "https://deno.land/std@0.203.0/path/glob.ts": "593e2c3573883225c25c5a21aaa8e9382a696b8e175ea20a3b6a1471ad17aaed", 116 | "https://deno.land/std@0.203.0/path/is_absolute.ts": "0b92eb35a0a8780e9f16f16bb23655b67dace6a8e0d92d42039e518ee38103c1", 117 | "https://deno.land/std@0.203.0/path/join.ts": "31c5419f23d91655b08ec7aec403f4e4cd1a63d39e28f6e42642ea207c2734f8", 118 | "https://deno.land/std@0.203.0/path/mod.ts": "6e1efb0b13121463aedb53ea51dabf5639a3172ab58c89900bbb72b486872532", 119 | "https://deno.land/std@0.203.0/path/normalize.ts": "6ea523e0040979dd7ae2f1be5bf2083941881a252554c0f32566a18b03021955", 120 | "https://deno.land/std@0.203.0/path/parse.ts": "be8de342bb9e1924d78dc4d93c45215c152db7bf738ec32475560424b119b394", 121 | "https://deno.land/std@0.203.0/path/posix.ts": "0a1c1952d132323a88736d03e92bd236f3ed5f9f079e5823fae07c8d978ee61b", 122 | "https://deno.land/std@0.203.0/path/relative.ts": "8bedac226afd360afc45d451a6c29fabceaf32978526bcb38e0c852661f66c61", 123 | "https://deno.land/std@0.203.0/path/resolve.ts": "133161e4949fc97f9ca67988d51376b0f5eef8968a6372325ab84d39d30b80dc", 124 | "https://deno.land/std@0.203.0/path/separator.ts": "40a3e9a4ad10bef23bc2cd6c610291b6c502a06237c2c4cd034a15ca78dedc1f", 125 | "https://deno.land/std@0.203.0/path/to_file_url.ts": "00e6322373dd51ad109956b775e4e72e5f9fa68ce2c6b04e4af2a6eed3825d31", 126 | "https://deno.land/std@0.203.0/path/to_namespaced_path.ts": "1b1db3055c343ab389901adfbda34e82b7386bcd1c744d54f9c1496ee0fd0c3d", 127 | "https://deno.land/std@0.203.0/path/win32.ts": "8b3f80ef7a462511d5e8020ff490edcaa0a0d118f1b1e9da50e2916bdd73f9dd", 128 | "https://deno.land/std@0.205.0/assert/assert.ts": "9a97dad6d98c238938e7540736b826440ad8c1c1e54430ca4c4e623e585607ee", 129 | "https://deno.land/std@0.205.0/assert/assertion_error.ts": "4d0bde9b374dfbcbe8ac23f54f567b77024fb67dbb1906a852d67fe050d42f56", 130 | "https://deno.land/std@0.205.0/flags/mod.ts": "0948466fc437f017f00c0b972a422b3dc3317a790bcf326429d23182977eaf9f", 131 | "https://deno.land/std@0.52.0/fmt/colors.ts": "ec9d653672a9a3c7b6eafe53c5bc797364a2db2dcf766ab649c1155fea7a80b2", 132 | "https://deno.land/x/crc32@v0.2.0/mod.ts": "de7a3fa2d4ef24b96fc21e1cc4d2d65d1d2b1dcea92f63960e3e11bfa82df0fa", 133 | "https://deno.land/x/fluent_aws_codepipeline@v0.2.3/mod.ts": "79cc758901d20a3573d7e3cc2db9f0a5fe56833f4d9befcedc072b94d542eec7", 134 | "https://deno.land/x/fluent_aws_codepipeline@v0.2.3/src/buildspec.ts": "fb07cbbf9473586cea66c0c508412080c2d4ba4e7f4ea0985661afeed445710b", 135 | "https://deno.land/x/fluent_aws_codepipeline@v0.2.3/src/spec.ts": "c0ce4c6e2685e23a3abdeb9fc18012253199dae355b06189d8248b052301a63e", 136 | "https://deno.land/x/fluent_azure_pipelines@v0.2.0/mod.ts": "6f3c62419b96251dd1b5d8d6a172c0a8724a73b7feec786e540f51f0c8a0f0fd", 137 | "https://deno.land/x/fluent_azure_pipelines@v0.2.0/src/config.ts": "619f4c64dad9b510c5788d4939a8afe013cb7dfc993dfd32f2ff4d0a2140075e", 138 | "https://deno.land/x/fluent_azure_pipelines@v0.2.0/src/spec.ts": "cab6e4a6afb0f16e6c406cfab87264a963734720c468532c4f778228d1f1758d", 139 | "https://deno.land/x/fluent_circleci@v0.2.5/mod.ts": "6a885bf35dbe08a7e971aa105763d724dd2a09c237b6292c9cd5de540237af37", 140 | "https://deno.land/x/fluent_circleci@v0.2.5/src/config.ts": "d7e9902b4c2fddfa61ff6a509f3a09adee161fae9f93029dcbc8ec7a7bbd990b", 141 | "https://deno.land/x/fluent_circleci@v0.2.5/src/job.ts": "b6ffb66ef10cf0e26460a88e1614ef864b606571e8d72376eeb09254f66a9926", 142 | "https://deno.land/x/fluent_circleci@v0.2.5/src/spec.ts": "eda462e9ff535dbc7d3eb7e47253948d40ebaaf34d964e0931a6a25cdd823736", 143 | "https://deno.land/x/fluent_github_actions@v0.2.1/mod.ts": "dc62b622791da77bc27f68e33cba618983a0770a9a12dcc9e0f9a61161bb90e5", 144 | "https://deno.land/x/fluent_github_actions@v0.2.1/src/event.ts": "d44d42356a04aea7ba64ff9e9a12090f477605c27a940bbf80aba612e4e96d1e", 145 | "https://deno.land/x/fluent_github_actions@v0.2.1/src/job_spec.ts": "93aa5b8b79cd8baaf875901322c4c38c27d4458439a831cb0ad86401b207a3dc", 146 | "https://deno.land/x/fluent_github_actions@v0.2.1/src/step_spec.ts": "b399949d1fd9c45873cdda70d82c92e3d9d96ba9a1d5749f3010a1f242b20e35", 147 | "https://deno.land/x/fluent_github_actions@v0.2.1/src/workflow.ts": "c9e3b7b3a59f7edff958eae8f27a8542f2a24889ea27c8aa016d0c0b0ca416c6", 148 | "https://deno.land/x/fluent_github_actions@v0.2.1/src/workflow_spec.ts": "b5c696dc70ee3f777a565197c6a3a379d87d026e12d59942fef5b9dc72124c3a", 149 | "https://deno.land/x/fluent_gitlab_ci@v0.4.2/mod.ts": "3becefe569f5c9814dffa1b534794a42b948481753a5903fa1b48d5337206ced", 150 | "https://deno.land/x/fluent_gitlab_ci@v0.4.2/src/environment.ts": "f12ee4fb50e5100fccec29dc1d35aa430bfe8373e84286a8ab9f7b8e178f14e3", 151 | "https://deno.land/x/fluent_gitlab_ci@v0.4.2/src/gitlabci.ts": "ef36465c41412ae94b919cfcb80b99ec1c04536dbf42ad09cd73abf3ea4d52a6", 152 | "https://deno.land/x/fluent_gitlab_ci@v0.4.2/src/gitlabci_spec.ts": "37f4ecef3ea414f57c54a360bc0178f5fad21b4a9db59d29d1961cd368febaed", 153 | "https://deno.land/x/fluent_gitlab_ci@v0.4.2/src/index.ts": "b5e374a24e3bca1d6fead0861f2c1b1e09e087a17e59297263f681ee71c972fe", 154 | "https://deno.land/x/fluent_gitlab_ci@v0.4.2/src/job.ts": "65a5be7f5816846919907aab00530044b571570a54a8a0bc967f4269a2ce99b7", 155 | "https://deno.land/x/spinners@v1.1.2/mod.ts": "ed5b3562d4ea6c6887bc7e9844612b08a3bc3a3678ca77cc7dfdf461c362751e", 156 | "https://deno.land/x/spinners@v1.1.2/spinner-types.ts": "c67e6962a0c738aa57b4d3ad9fe06c8c0131f93360acbf95456f2ba200fd8826", 157 | "https://deno.land/x/spinners@v1.1.2/terminal-spinner.ts": "1cf0c38a423781734e2e538323c1992027830d741e90f0b81f532e5bc993d035", 158 | "https://deno.land/x/spinners@v1.1.2/util.ts": "7083203bedbda2e6144a14a7dd093747a7a01e73d95637c888bae8ac22a1c58b", 159 | "https://deno.land/x/xhr@0.3.0/mod.ts": "094aacd627fd9635cd942053bf8032b5223b909858fa9dc8ffa583752ff63b20", 160 | "https://deno.land/x/zod@v3.22.1/ZodError.ts": "4de18ff525e75a0315f2c12066b77b5c2ae18c7c15ef7df7e165d63536fdf2ea", 161 | "https://deno.land/x/zod@v3.22.1/errors.ts": "5285922d2be9700cc0c70c95e4858952b07ae193aa0224be3cbd5cd5567eabef", 162 | "https://deno.land/x/zod@v3.22.1/external.ts": "a6cfbd61e9e097d5f42f8a7ed6f92f93f51ff927d29c9fbaec04f03cbce130fe", 163 | "https://deno.land/x/zod@v3.22.1/helpers/enumUtil.ts": "54efc393cc9860e687d8b81ff52e980def00fa67377ad0bf8b3104f8a5bf698c", 164 | "https://deno.land/x/zod@v3.22.1/helpers/errorUtil.ts": "7a77328240be7b847af6de9189963bd9f79cab32bbc61502a9db4fe6683e2ea7", 165 | "https://deno.land/x/zod@v3.22.1/helpers/parseUtil.ts": "f791e6e65a0340d85ad37d26cd7a3ba67126cd9957eac2b7163162155283abb1", 166 | "https://deno.land/x/zod@v3.22.1/helpers/partialUtil.ts": "998c2fe79795257d4d1cf10361e74492f3b7d852f61057c7c08ac0a46488b7e7", 167 | "https://deno.land/x/zod@v3.22.1/helpers/typeAliases.ts": "0fda31a063c6736fc3cf9090dd94865c811dfff4f3cb8707b932bf937c6f2c3e", 168 | "https://deno.land/x/zod@v3.22.1/helpers/util.ts": "8baf19b19b2fca8424380367b90364b32503b6b71780269a6e3e67700bb02774", 169 | "https://deno.land/x/zod@v3.22.1/index.ts": "d27aabd973613985574bc31f39e45cb5d856aa122ef094a9f38a463b8ef1a268", 170 | "https://deno.land/x/zod@v3.22.1/locales/en.ts": "a7a25cd23563ccb5e0eed214d9b31846305ddbcdb9c5c8f508b108943366ab4c", 171 | "https://deno.land/x/zod@v3.22.1/mod.ts": "64e55237cb4410e17d968cd08975566059f27638ebb0b86048031b987ba251c4", 172 | "https://deno.land/x/zod@v3.22.1/types.ts": "4edc1823385f446532c8c9f676d84550c6dc54b17135e34508576647d9612d0e", 173 | "https://esm.sh/@dagger.io/dagger@0.9.3": "f954af5e24f31e7052eaa1198ca3cd33d234c10e3844d29ec111f9c4b8b949eb", 174 | "https://esm.sh/graphql-tag@2.12.6": "132ebb1ed959bb4dac146160b0cd0fa678c7b9e6bd04f349bf4cacbfb46d0b53", 175 | "https://esm.sh/nanoid@4.0.2": "eb872595ebf6390181971c3e477d1b0fe7ea8383d9b66ced7d09ac8f9c4cf2c7", 176 | "https://esm.sh/stringify-tree@1.1.1": "bb68a933167b8d80b88481df0beff172fc9b645db0c32fbe7dc2d822f61ebaea", 177 | "https://esm.sh/v128/cross-fetch@3.1.8/denonext/cross-fetch.mjs": "8fba9e7c3fbaf0d2168beb63ce0cd21b5bfbfbd77e2fcbf8d957d533a71222f6", 178 | "https://esm.sh/v128/graphql-request@6.1.0": "17f00c323eb825811ce14e2b0e88a0c873acb666c382ac963d1edeb03e01f372", 179 | "https://esm.sh/v128/graphql-request@6.1.0/denonext/graphql-request.mjs": "0b15f49d44489423ae6f06004725b6d050b6359da4969e6569bd6ad45065bd94", 180 | "https://esm.sh/v128/graphql@16.7.1/denonext/graphql.mjs": "418ad7c07b0f2d687f33b6275d3b5f317f4afbef1f462f318229f458dff45416", 181 | "https://esm.sh/v128/yaml@2.3.1": "8ef3aee065e93b03cebf8fd5a3418bc30131344b7f2b8c8ae27bf9f277416087", 182 | "https://esm.sh/v128/yaml@2.3.1/denonext/yaml.mjs": "71f677b4bfc69271af9d98db5194e354f9a1863955e208e26d32a9ef78bd89f5", 183 | "https://esm.sh/v131/yaml@2.3.1": "1fe2490feb3d9c6d2c71c64dbdbed90acd4164b00628b3c68a311b6731ca38b5", 184 | "https://esm.sh/v131/yaml@2.3.1/denonext/yaml.mjs": "71f677b4bfc69271af9d98db5194e354f9a1863955e208e26d32a9ef78bd89f5", 185 | "https://esm.sh/v135/@dagger.io/dagger@0.9.3/denonext/dagger.mjs": "998e8e63729621141c0a9b74128db8f81ab7446d1a5d4ff41a6a6b0944db4ddf", 186 | "https://esm.sh/v135/adm-zip@0.5.10/denonext/adm-zip.mjs": "9441de5c60a276046d55945f45775d674a319e8e5fd3a8ab7131d8d192d9abb3", 187 | "https://esm.sh/v135/adm-zip@0.5.12/denonext/adm-zip.mjs": "ee50b99aa1a4945229e9ca3e54d6ca17c3ab50a1de6f401eb16fee02d46be244", 188 | "https://esm.sh/v135/chownr@2.0.0/denonext/chownr.mjs": "d7282b2612a9f13c62084c76fc72cdfb20503bccce959178b77b6def14d3ffd2", 189 | "https://esm.sh/v135/cross-fetch@3.1.8/denonext/cross-fetch.mjs": "8fba9e7c3fbaf0d2168beb63ce0cd21b5bfbfbd77e2fcbf8d957d533a71222f6", 190 | "https://esm.sh/v135/cross-spawn@7.0.3/denonext/cross-spawn.mjs": "4d5a257de3627fb09c512b23fed30f1b393e29a2c13f8325e89720b8ca6673c1", 191 | "https://esm.sh/v135/env-paths@3.0.0/denonext/env-paths.mjs": "77984a05eb16450087f25060a070ed500ec546719d471143e16d976ca73ca956", 192 | "https://esm.sh/v135/execa@8.0.1/denonext/execa.mjs": "cfcca6be54deae22c8d7c4d8be8df397a9506a54d9af9171519b9eea8daea9a5", 193 | "https://esm.sh/v135/fs-minipass@2.1.0/denonext/fs-minipass.mjs": "4b5b69251541833f5a1035be0e98d46bd6d02843fd7d40720577baf6caca21ce", 194 | "https://esm.sh/v135/get-stream@8.0.1/denonext/get-stream.mjs": "b8ab640bf2638c1ae704a217b79e0a56e7a1f97bb48bbe40d723d5ea87eb0ecb", 195 | "https://esm.sh/v135/graphql-request@6.1.0/denonext/graphql-request.mjs": "c97af0ff1802c36ae6fdf544153140ef4d950bf164f0e5e839e71aa599ea1555", 196 | "https://esm.sh/v135/graphql-tag@2.12.6/denonext/graphql-tag.mjs": "ebaceefc216cba74424ddc55fde9e677f6e5a3e9d556a250faa1b53483574f03", 197 | "https://esm.sh/v135/graphql@16.8.1/denonext/graphql.mjs": "585b84022623b931e27a7a8134cd24ec50b33ea12fd18b43254527628a0fddac", 198 | "https://esm.sh/v135/human-signals@5.0.0/denonext/human-signals.mjs": "ab3130133ac5943273c909d7887e3c16b8374f66d72c38caeea2c44d659af023", 199 | "https://esm.sh/v135/is-stream@3.0.0/denonext/is-stream.mjs": "5c8b65f2fa051c4b18e88bbae11dac8bba9caf57752577d69bcea86d1f05c5b7", 200 | "https://esm.sh/v135/isexe@2.0.0/denonext/isexe.mjs": "4675d9d53a332f096efd344cb1418dbda8e6f2effc8a5c81edd43cdd56636be7", 201 | "https://esm.sh/v135/lodash.flatten@4.4.0/denonext/lodash.flatten.mjs": "8e86ab607deea15cc3c1acfb5eae278ecbc5b80f24167b4e8f4c56df3278cd55", 202 | "https://esm.sh/v135/merge-stream@2.0.0/denonext/merge-stream.mjs": "2c2af22401c294158d6bff659d157e3d2c028c218cc1bd2246534a45a4c03c61", 203 | "https://esm.sh/v135/mimic-fn@4.0.0/denonext/mimic-fn.mjs": "10bcf0f2f20cbbba0c289ef7bf4d2422639bbc1c36c247be876afd6fe2d67138", 204 | "https://esm.sh/v135/minipass@3.3.6/denonext/minipass.mjs": "195894c7a7f1fb71de48b4a41af182cd3ad0e357cadc0ad9d8b5340cda895cc0", 205 | "https://esm.sh/v135/minipass@5.0.0/denonext/minipass.mjs": "de0e049728f8c387b58c86439eb9d69a16b6a88756a6bc694e2fecbd7fd00401", 206 | "https://esm.sh/v135/minizlib@2.1.2/denonext/minizlib.mjs": "67abb7d83dacd0de153cce5d03ee3bfd68988c992306ff843370b68f038b43e0", 207 | "https://esm.sh/v135/mkdirp@1.0.4/denonext/mkdirp.mjs": "41bc43ec9478e772660e2b0edf998f27f0158388c94003b7292d8093e699eb7b", 208 | "https://esm.sh/v135/nanoid@4.0.2/denonext/nanoid.mjs": "4f26e89bc0867e6a838069435b3d75af305017d87ce5b51c9d6edc680954b52f", 209 | "https://esm.sh/v135/node-color-log@10.0.2/denonext/node-color-log.mjs": "2504391bd0ce1dd4c2bf0ed0b839b8a3ad84c028d9dd17cc58dccd2e14dacfde", 210 | "https://esm.sh/v135/node_fetch.js": "b11355358cf61343a3c30bd5942df60a3586d13e2c979b515164bfe851662798", 211 | "https://esm.sh/v135/npm-run-path@5.1.0/denonext/npm-run-path.mjs": "4772cda227b5c18f4293db7edf53998879c75d48e776533009ce1a8daa464bf5", 212 | "https://esm.sh/v135/onetime@6.0.0/denonext/onetime.mjs": "5326fe5207b076a7ebc96740b4c3dcec7a2522a1aa5985e3b4157c1b9cb1e2dd", 213 | "https://esm.sh/v135/original-fs@1.2.0/denonext/original-fs.mjs": "2b1098818e54d2c6748ff5b0dd9ea5f6a61b4b6d0f63fb625f21773d11cfc667", 214 | "https://esm.sh/v135/path-key@3.1.1/denonext/path-key.mjs": "add83c631278b7df9b33ae84e41142db88bb291295bcc27eb4e77a1cbdfa71d0", 215 | "https://esm.sh/v135/path-key@4.0.0/denonext/path-key.mjs": "2c2e3922bd0e6e414fa2752ff800bdc6b9208035ce797fa22e49b859f8259417", 216 | "https://esm.sh/v135/shebang-command@2.0.0/denonext/shebang-command.mjs": "245674cc2dffa2d06fcef0540b81040b626227485e5f41d76e77d386b30b18e0", 217 | "https://esm.sh/v135/shebang-regex@3.0.0/denonext/shebang-regex.mjs": "03983ba59dd2cba9402935e21b46d05f5249364cba9f5757aef23c6c2fea65b9", 218 | "https://esm.sh/v135/signal-exit@4.1.0/denonext/signal-exit.mjs": "c450b9024df3b59ded71e7b52aada1ac4b3856aad93e9d64bbc6ea3cdd181824", 219 | "https://esm.sh/v135/stringify-tree@1.1.1/denonext/stringify-tree.mjs": "6cacda15ffe7dc2e1343636549956877e1bd830be5bd56587f40f94ca7becda4", 220 | "https://esm.sh/v135/strip-final-newline@3.0.0/denonext/strip-final-newline.mjs": "139c0958b1fb9387d8ae5b95941682245a3f3d9ae531f5de9638c2e9109831e0", 221 | "https://esm.sh/v135/tar@6.2.0/denonext/tar.mjs": "e13b56d41286f4935cb29acae60a040148af6e2649326a70e04c5ca6fe5ef04d", 222 | "https://esm.sh/v135/tar@6.2.1/denonext/tar.mjs": "d0026ba9f9ab1ba2b89493af4717ee3b099c8cf06c7d5c16d7174c66647dd88b", 223 | "https://esm.sh/v135/tslib@2.6.2/denonext/tslib.mjs": "29782bcd3139f77ec063dc5a9385c0fff4a8d0a23b6765c73d9edeb169a04bf1", 224 | "https://esm.sh/v135/which@2.0.2/denonext/which.mjs": "360f7d0aa13233975c86f120e2b1aa9695252b16e287ccdc651d3123473a3482", 225 | "https://esm.sh/v135/yallist@4.0.0/denonext/yallist.mjs": "61f180d807dda50bac17028eda05d5722a3fecef6e98a9064e2353ea6864fd82", 226 | "https://esm.sh/v135/yaml@2.3.1/denonext/yaml.mjs": "71f677b4bfc69271af9d98db5194e354f9a1863955e208e26d32a9ef78bd89f5", 227 | "https://esm.sh/yaml@v2.3.1": "0b42df3dec58b0999df5639390c02346de67b8dae76717a156189855fb616858", 228 | "https://nix.fluentci.io/v0.5.3/deps.ts": "469c1f084eda8d2ee78135b0bf4f9490b80b36d8d0bdb88594167133a918da8e", 229 | "https://nix.fluentci.io/v0.5.3/src/dagger/steps.ts": "b766f4fa9624a032e7af884a5ca47bc666a529c4a472d38b74b55ca0d63cf81d", 230 | "https://sdk.fluentci.io/v0.3.0/deps.ts": "3a145e76b4345a9a7888f09b1b48cb54523ebfa43247a1abebc40a9e82d555f4", 231 | "https://sdk.fluentci.io/v0.3.0/mod.ts": "261ba81a4728f5def4e327a5cd80664ea8449515a2f4eea5f3f416acae39a1fa", 232 | "https://sdk.fluentci.io/v0.3.0/src/client.ts": "7f1df4b1fee62dd6f946fa9d15d47a37b938ffb4ac91faf3d39b44b83d4f5921", 233 | "https://sdk.fluentci.io/v0.3.0/src/connect.ts": "4aff111c403cf78672384a10214a9885e08319dde579ec458f98a7bb04874101", 234 | "https://sdk.fluentci.io/v0.3.0/src/context.ts": "2939ff58d0a79d7377d5553e725c9a2110a0013035a5a57abe9a9a5da975c4ce", 235 | "https://sdk.fluentci.io/v0.3.0/src/utils.ts": "5dcd6d83553930502069d067ff42bc44698e22c23426fdb78630c4b39769d308" 236 | } 237 | } 238 | -------------------------------------------------------------------------------- /deno.lock: -------------------------------------------------------------------------------- 1 | { 2 | "version": "4", 3 | "specifiers": { 4 | "jsr:@cliffy/ansi@1.0.0-rc.7": "1.0.0-rc.7", 5 | "jsr:@cliffy/command@1.0.0-rc.7": "1.0.0-rc.7", 6 | "jsr:@cliffy/flags@1.0.0-rc.7": "1.0.0-rc.7", 7 | "jsr:@cliffy/internal@1.0.0-rc.7": "1.0.0-rc.7", 8 | "jsr:@cliffy/keycode@1.0.0-rc.7": "1.0.0-rc.7", 9 | "jsr:@cliffy/prompt@1.0.0-rc.7": "1.0.0-rc.7", 10 | "jsr:@cliffy/table@1.0.0-rc.7": "1.0.0-rc.7", 11 | "jsr:@std/assert@~1.0.6": "1.0.6", 12 | "jsr:@std/encoding@~1.0.5": "1.0.5", 13 | "jsr:@std/fmt@*": "1.0.3", 14 | "jsr:@std/fmt@~1.0.2": "1.0.3", 15 | "jsr:@std/io@*": "0.224.9", 16 | "jsr:@std/io@~0.224.9": "0.224.9", 17 | "jsr:@std/path@~1.0.6": "1.0.6", 18 | "jsr:@std/semver@*": "1.0.3", 19 | "jsr:@std/text@~1.0.7": "1.0.7", 20 | "npm:dayjs@*": "1.11.12" 21 | }, 22 | "jsr": { 23 | "@cliffy/ansi@1.0.0-rc.7": { 24 | "integrity": "f71c921cce224c13d322e5cedba4f38e8f7354c7d855c9cb22729362a53f25aa", 25 | "dependencies": [ 26 | "jsr:@cliffy/internal", 27 | "jsr:@std/encoding", 28 | "jsr:@std/io@~0.224.9" 29 | ] 30 | }, 31 | "@cliffy/command@1.0.0-rc.7": { 32 | "integrity": "1288808d7a3cd18b86c24c2f920e47a6d954b7e23cadc35c8cbd78f8be41f0cd", 33 | "dependencies": [ 34 | "jsr:@cliffy/flags", 35 | "jsr:@cliffy/internal", 36 | "jsr:@cliffy/table", 37 | "jsr:@std/fmt@~1.0.2", 38 | "jsr:@std/text" 39 | ] 40 | }, 41 | "@cliffy/flags@1.0.0-rc.7": { 42 | "integrity": "318d9be98f6a6417b108e03dec427dea96cdd41a15beb21d2554ae6da450a781", 43 | "dependencies": [ 44 | "jsr:@std/text" 45 | ] 46 | }, 47 | "@cliffy/internal@1.0.0-rc.7": { 48 | "integrity": "10412636ab3e67517d448be9eaab1b70c88eba9be22617b5d146257a11cc9b17" 49 | }, 50 | "@cliffy/keycode@1.0.0-rc.7": { 51 | "integrity": "5b3f6c33994e81a76b79f108b1989642ac22705840da33781f7972d7dff05503" 52 | }, 53 | "@cliffy/prompt@1.0.0-rc.7": { 54 | "integrity": "a9cbd13acd8073558447cae8ca4cf593c09d23bcbe429cc63346920c21187b83", 55 | "dependencies": [ 56 | "jsr:@cliffy/ansi", 57 | "jsr:@cliffy/internal", 58 | "jsr:@cliffy/keycode", 59 | "jsr:@std/assert", 60 | "jsr:@std/fmt@~1.0.2", 61 | "jsr:@std/io@~0.224.9", 62 | "jsr:@std/path", 63 | "jsr:@std/text" 64 | ] 65 | }, 66 | "@cliffy/table@1.0.0-rc.7": { 67 | "integrity": "9fdd9776eda28a0b397981c400eeb1aa36da2371b43eefe12e6ff555290e3180", 68 | "dependencies": [ 69 | "jsr:@std/fmt@~1.0.2" 70 | ] 71 | }, 72 | "@std/assert@1.0.6": { 73 | "integrity": "1904c05806a25d94fe791d6d883b685c9e2dcd60e4f9fc30f4fc5cf010c72207" 74 | }, 75 | "@std/encoding@1.0.5": { 76 | "integrity": "ecf363d4fc25bd85bd915ff6733a7e79b67e0e7806334af15f4645c569fefc04" 77 | }, 78 | "@std/fmt@1.0.3": { 79 | "integrity": "97765c16aa32245ff4e2204ecf7d8562496a3cb8592340a80e7e554e0bb9149f" 80 | }, 81 | "@std/io@0.224.9": { 82 | "integrity": "4414664b6926f665102e73c969cfda06d2c4c59bd5d0c603fd4f1b1c840d6ee3" 83 | }, 84 | "@std/path@1.0.6": { 85 | "integrity": "ab2c55f902b380cf28e0eec501b4906e4c1960d13f00e11cfbcd21de15f18fed" 86 | }, 87 | "@std/semver@1.0.3": { 88 | "integrity": "7c139c6076a080eeaa4252c78b95ca5302818d7eafab0470d34cafd9930c13c8" 89 | }, 90 | "@std/text@1.0.7": { 91 | "integrity": "344a820af99fde81ae1d4f9ce586da3f47a58cda25ac4c4dd688166cf5ed97f1" 92 | } 93 | }, 94 | "npm": { 95 | "dayjs@1.11.12": { 96 | "integrity": "sha512-Rt2g+nTbLlDWZTwwrIXjy9MeiZmSDI375FvZs72ngxx8PDC6YXOeR3q5LAuPzjZQxhiWdRKac7RKV+YyQYfYIg==" 97 | } 98 | }, 99 | "redirects": { 100 | "https://deno.land/x/is_docker/mod.ts": "https://deno.land/x/is_docker@v2.0.0/mod.ts" 101 | }, 102 | "remote": { 103 | "https://cdn.jsdelivr.net/gh/bootoffav/deno-zip@main/compress.ts": "ca6cfbaa6007372f4fed2fef64ff14437c55f5beb9a8549ed63b79a387e94212", 104 | "https://cdn.jsdelivr.net/gh/bootoffav/deno-zip@main/decompress.ts": "7f768124b09d352dac2c5f818239514f0bad2fb849b887f0ce0ca688c58f8248", 105 | "https://cdn.jsdelivr.net/gh/bootoffav/deno-zip@main/deps.ts": "79548387594b3ae1efaaa870b5a507c4d6bedede13dbd5d4ad42f6cda0aeef86", 106 | "https://cdn.jsdelivr.net/gh/bootoffav/deno-zip@main/mod.ts": "28eecbc3e1e5adf564f4aa465e64268713a05653104bacdcb04561533f8caf57", 107 | "https://cdn.jsdelivr.net/gh/bootoffav/deno-zip@main/utils.ts": "43c323f2b79f9db1976c5739bbb1f9cced20e8077ca7e7e703f9d01d4330bd9d", 108 | "https://cdn.jsdelivr.net/gh/tsirysndr/deno-zip@main/compress.ts": "9f05a70dfa2f113329bff448c00016cf6e30f946c1e286fd2cb36f86d575662f", 109 | "https://cdn.jsdelivr.net/gh/tsirysndr/deno-zip@main/decompress.ts": "c7e6f49dc6fa3d70d9d73cfcdaf0b7deb9bdac90cc11ad89f6098278aacadbe9", 110 | "https://cdn.jsdelivr.net/gh/tsirysndr/deno-zip@main/deps.ts": "79548387594b3ae1efaaa870b5a507c4d6bedede13dbd5d4ad42f6cda0aeef86", 111 | "https://cdn.jsdelivr.net/gh/tsirysndr/deno-zip@main/mod.ts": "28eecbc3e1e5adf564f4aa465e64268713a05653104bacdcb04561533f8caf57", 112 | "https://cdn.jsdelivr.net/gh/tsirysndr/deno-zip@main/utils.ts": "43c323f2b79f9db1976c5739bbb1f9cced20e8077ca7e7e703f9d01d4330bd9d", 113 | "https://cdn.jsdelivr.net/gh/will-weiss/spinners@master/mod.ts": "ed5b3562d4ea6c6887bc7e9844612b08a3bc3a3678ca77cc7dfdf461c362751e", 114 | "https://cdn.jsdelivr.net/gh/will-weiss/spinners@master/spinner-types.ts": "c67e6962a0c738aa57b4d3ad9fe06c8c0131f93360acbf95456f2ba200fd8826", 115 | "https://cdn.jsdelivr.net/gh/will-weiss/spinners@master/terminal-spinner.ts": "aa2fcf87060caf79fbd26f741c2d8e0093f196b891aca9ffd0a709aba11a1620", 116 | "https://cdn.jsdelivr.net/gh/will-weiss/spinners@master/util.ts": "22c7cafa1d1138c0009ddafe6c3fd1e0c335a92b53bb3a42d9e4d38727108251", 117 | "https://cdn.skypack.dev/-/lodash@v4.17.21-K6GEbP02mWFnLA45zAmi/dist=es2019,mode=imports/optimized/lodash.js": "10c4df47937ffc78548d136dd535a021df5f57182a653260d715c0690dd22978", 118 | "https://cdn.skypack.dev/lodash": "8280de0b3efd87f06ea0eb330d15b8de32c059556023b8c6524e9eb9e4844dc0", 119 | "https://cli.pocketenv.io/": "1db311e63e4fc38de513f0b8e7f6e98bf363e0a69bbaaef962a4ee9ec9da8f90", 120 | "https://deno.land/std@0.106.0/path/_constants.ts": "1247fee4a79b70c89f23499691ef169b41b6ccf01887a0abd131009c5581b853", 121 | "https://deno.land/std@0.106.0/path/_interface.ts": "1fa73b02aaa24867e481a48492b44f2598cd9dfa513c7b34001437007d3642e4", 122 | "https://deno.land/std@0.106.0/path/_util.ts": "2e06a3b9e79beaf62687196bd4b60a4c391d862cfa007a20fc3a39f778ba073b", 123 | "https://deno.land/std@0.106.0/path/posix.ts": "b81974c768d298f8dcd2c720229639b3803ca4a241fa9a355c762fa2bc5ef0c1", 124 | "https://deno.land/std@0.133.0/_deno_unstable.ts": "23a1a36928f1b6d3b0170aaa67de09af12aa998525f608ff7331b9fb364cbde6", 125 | "https://deno.land/std@0.133.0/_util/assert.ts": "e94f2eb37cebd7f199952e242c77654e43333c1ac4c5c700e929ea3aa5489f74", 126 | "https://deno.land/std@0.133.0/_util/os.ts": "49b92edea1e82ba295ec946de8ffd956ed123e2948d9bd1d3e901b04e4307617", 127 | "https://deno.land/std@0.133.0/fs/_util.ts": "0fb24eb4bfebc2c194fb1afdb42b9c3dda12e368f43e8f2321f84fc77d42cb0f", 128 | "https://deno.land/std@0.133.0/fs/copy.ts": "9248d1492599957af8c693ceb10a432b09f0b0b61c60a4d6aff29b0c7d3a17b3", 129 | "https://deno.land/std@0.133.0/fs/empty_dir.ts": "7274d87160de34cbed0531e284df383045cf43543bbeadeb97feac598bd8f3c5", 130 | "https://deno.land/std@0.133.0/fs/ensure_dir.ts": "9dc109c27df4098b9fc12d949612ae5c9c7169507660dcf9ad90631833209d9d", 131 | "https://deno.land/std@0.133.0/fs/ensure_file.ts": "7d353e64fee3d4d1e7c6b6726a2a5e987ba402c15fb49566309042887349c545", 132 | "https://deno.land/std@0.133.0/fs/ensure_link.ts": "489e23df9fe3e6636048b5830ddf0f111eb29621eb85719255ad9bd645f3471b", 133 | "https://deno.land/std@0.133.0/fs/ensure_symlink.ts": "88dc83de1bc90ed883dd458c2d2eae3d5834a4617d12925734836e1f0803b274", 134 | "https://deno.land/std@0.133.0/fs/eol.ts": "b92f0b88036de507e7e6fbedbe8f666835ea9dcbf5ac85917fa1fadc919f83a5", 135 | "https://deno.land/std@0.133.0/fs/exists.ts": "cb734d872f8554ea40b8bff77ad33d4143c1187eac621a55bf37781a43c56f6d", 136 | "https://deno.land/std@0.133.0/fs/expand_glob.ts": "0c10130d67c9b02164b03df8e43c6d6defbf8e395cb69d09e84a8586e6d72ac3", 137 | "https://deno.land/std@0.133.0/fs/mod.ts": "4dc052c461c171abb5c25f6e0f218ab838a716230930b534ba351745864b7d6d", 138 | "https://deno.land/std@0.133.0/fs/move.ts": "0573cedcf583f09a9494f2dfccbf67de68a93629942d6b5e6e74a9e45d4e8a2e", 139 | "https://deno.land/std@0.133.0/fs/walk.ts": "117403ccd21fd322febe56ba06053b1ad5064c802170f19b1ea43214088fe95f", 140 | "https://deno.land/std@0.133.0/path/_constants.ts": "df1db3ffa6dd6d1252cc9617e5d72165cd2483df90e93833e13580687b6083c3", 141 | "https://deno.land/std@0.133.0/path/_interface.ts": "ee3b431a336b80cf445441109d089b70d87d5e248f4f90ff906820889ecf8d09", 142 | "https://deno.land/std@0.133.0/path/_util.ts": "c1e9686d0164e29f7d880b2158971d805b6e0efc3110d0b3e24e4b8af2190d2b", 143 | "https://deno.land/std@0.133.0/path/common.ts": "bee563630abd2d97f99d83c96c2fa0cca7cee103e8cb4e7699ec4d5db7bd2633", 144 | "https://deno.land/std@0.133.0/path/glob.ts": "cb5255638de1048973c3e69e420c77dc04f75755524cb3b2e160fe9277d939ee", 145 | "https://deno.land/std@0.133.0/path/mod.ts": "4275129bb766f0e475ecc5246aa35689eeade419d72a48355203f31802640be7", 146 | "https://deno.land/std@0.133.0/path/posix.ts": "663e4a6fe30a145f56aa41a22d95114c4c5582d8b57d2d7c9ed27ad2c47636bb", 147 | "https://deno.land/std@0.133.0/path/separator.ts": "fe1816cb765a8068afb3e8f13ad272351c85cbc739af56dacfc7d93d710fe0f9", 148 | "https://deno.land/std@0.133.0/path/win32.ts": "e7bdf63e8d9982b4d8a01ef5689425c93310ece950e517476e22af10f41a136e", 149 | "https://deno.land/std@0.189.0/fmt/colors.ts": "d67e3cd9f472535241a8e410d33423980bec45047e343577554d3356e1f0ef4e", 150 | "https://deno.land/std@0.189.0/streams/write_all.ts": "aec90152978581ea62d56bb53a5cbf487e6a89c902f87c5969681ffbdf32b998", 151 | "https://deno.land/std@0.192.0/fmt/colors.ts": "d67e3cd9f472535241a8e410d33423980bec45047e343577554d3356e1f0ef4e", 152 | "https://deno.land/std@0.196.0/_util/os.ts": "d932f56d41e4f6a6093d56044e29ce637f8dcc43c5a90af43504a889cf1775e3", 153 | "https://deno.land/std@0.196.0/assert/assert.ts": "9a97dad6d98c238938e7540736b826440ad8c1c1e54430ca4c4e623e585607ee", 154 | "https://deno.land/std@0.196.0/assert/assertion_error.ts": "4d0bde9b374dfbcbe8ac23f54f567b77024fb67dbb1906a852d67fe050d42f56", 155 | "https://deno.land/std@0.196.0/console/_data.json": "cf2cc9d039a192b3adbfe64627167c7e6212704c888c25c769fc8f1709e1e1b8", 156 | "https://deno.land/std@0.196.0/console/_rle.ts": "56668d5c44f964f1b4ff93f21c9896df42d6ee4394e814db52d6d13f5bb247c7", 157 | "https://deno.land/std@0.196.0/console/unicode_width.ts": "10661c0f2eeab802d16b8b85ed8825bbc573991bbfb6affed32dc1ff994f54f9", 158 | "https://deno.land/std@0.196.0/encoding/base64.ts": "144ae6234c1fbe5b68666c711dc15b1e9ee2aef6d42b3b4345bf9a6c91d70d0d", 159 | "https://deno.land/std@0.196.0/fmt/colors.ts": "a7eecffdf3d1d54db890723b303847b6e0a1ab4b528ba6958b8f2e754cf1b3bc", 160 | "https://deno.land/std@0.196.0/path/_constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", 161 | "https://deno.land/std@0.196.0/path/_interface.ts": "6471159dfbbc357e03882c2266d21ef9afdb1e4aa771b0545e90db58a0ba314b", 162 | "https://deno.land/std@0.196.0/path/_util.ts": "d7abb1e0dea065f427b89156e28cdeb32b045870acdf865833ba808a73b576d0", 163 | "https://deno.land/std@0.196.0/path/common.ts": "ee7505ab01fd22de3963b64e46cff31f40de34f9f8de1fff6a1bd2fe79380000", 164 | "https://deno.land/std@0.196.0/path/glob.ts": "d479e0a695621c94d3fd7fe7abd4f9499caf32a8de13f25073451c6ef420a4e1", 165 | "https://deno.land/std@0.196.0/path/mod.ts": "f065032a7189404fdac3ad1a1551a9ac84751d2f25c431e101787846c86c79ef", 166 | "https://deno.land/std@0.196.0/path/posix.ts": "8b7c67ac338714b30c816079303d0285dd24af6b284f7ad63da5b27372a2c94d", 167 | "https://deno.land/std@0.196.0/path/separator.ts": "0fb679739d0d1d7bf45b68dacfb4ec7563597a902edbaf3c59b50d5bcadd93b1", 168 | "https://deno.land/std@0.196.0/path/win32.ts": "4fca292f8d116fd6d62f243b8a61bd3d6835a9f0ede762ba5c01afe7c3c0aa12", 169 | "https://deno.land/std@0.204.0/assert/assert.ts": "9a97dad6d98c238938e7540736b826440ad8c1c1e54430ca4c4e623e585607ee", 170 | "https://deno.land/std@0.204.0/assert/assertion_error.ts": "4d0bde9b374dfbcbe8ac23f54f567b77024fb67dbb1906a852d67fe050d42f56", 171 | "https://deno.land/std@0.204.0/path/_common/assert_path.ts": "061e4d093d4ba5aebceb2c4da3318bfe3289e868570e9d3a8e327d91c2958946", 172 | "https://deno.land/std@0.204.0/path/_common/constants.ts": "e49961f6f4f48039c0dfed3c3f93e963ca3d92791c9d478ac5b43183413136e0", 173 | "https://deno.land/std@0.204.0/path/_common/normalize.ts": "2ba7fb4cc9fafb0f38028f434179579ce61d4d9e51296fad22b701c3d3cd7397", 174 | "https://deno.land/std@0.204.0/path/_common/normalize_string.ts": "88c472f28ae49525f9fe82de8c8816d93442d46a30d6bb5063b07ff8a89ff589", 175 | "https://deno.land/std@0.204.0/path/_os.ts": "30b0c2875f360c9296dbe6b7f2d528f0f9c741cecad2e97f803f5219e91b40a2", 176 | "https://deno.land/std@0.204.0/path/join.ts": "98d3d76c819af4a11a81d5ba2dbb319f1ce9d63fc2b615597d4bcfddd4a89a09", 177 | "https://deno.land/std@0.204.0/path/posix/_util.ts": "ecf49560fedd7dd376c6156cc5565cad97c1abe9824f4417adebc7acc36c93e5", 178 | "https://deno.land/std@0.204.0/path/posix/join.ts": "0c0d84bdc344876930126640011ec1b888e6facf74153ffad9ef26813aa2a076", 179 | "https://deno.land/std@0.204.0/path/posix/normalize.ts": "11de90a94ab7148cc46e5a288f7d732aade1d616bc8c862f5560fa18ff987b4b", 180 | "https://deno.land/std@0.204.0/path/windows/_util.ts": "f32b9444554c8863b9b4814025c700492a2b57ff2369d015360970a1b1099d54", 181 | "https://deno.land/std@0.204.0/path/windows/join.ts": "e6600bf88edeeef4e2276e155b8de1d5dec0435fd526ba2dc4d37986b2882f16", 182 | "https://deno.land/std@0.204.0/path/windows/normalize.ts": "9deebbf40c81ef540b7b945d4ccd7a6a2c5a5992f791e6d3377043031e164e69", 183 | "https://deno.land/std@0.212.0/semver/_constants.ts": "90879e4ea94a34c49c8ecea3d9c06e13e61ecb7caca80c8f289139440ca9835a", 184 | "https://deno.land/std@0.212.0/semver/_shared.ts": "8d44684775cde4a64bd6bdb99b51f3bc59ed65f10af78ca136cc2eab3f6716f1", 185 | "https://deno.land/std@0.212.0/semver/comparator_format.ts": "96feeab7ffb45df3e7087bf8a84da3401816be5687007e1afd5581dd8043623a", 186 | "https://deno.land/std@0.212.0/semver/comparator_intersects.ts": "a271f3e1caae857e4b8574f43bc926cf7ba906ade0c2d3bd97fcda98be74fbb0", 187 | "https://deno.land/std@0.212.0/semver/comparator_max.ts": "2038cded7cce886e2c81926acb97f625908707f2d66864b603493b9674e2bd58", 188 | "https://deno.land/std@0.212.0/semver/comparator_min.ts": "453d3e449aaee4d59acc9b36fe77eddfcb0c4097ffe7efe11eb2a04a64cc520d", 189 | "https://deno.land/std@0.212.0/semver/compare.ts": "e507146fd997d33ae5abc2675e8b24a1ea84b50ddc9918cb8ddc1b1911c97011", 190 | "https://deno.land/std@0.212.0/semver/compare_build.ts": "e37c2d24bc138b3fdaeb55cf85b1c94e7cf9120f16f64dff0e24659f1ba79de6", 191 | "https://deno.land/std@0.212.0/semver/constants.ts": "a815db7a80bbea2469a1a30cd14aa61d6a58d5c84d44cb0b17febe485563d26c", 192 | "https://deno.land/std@0.212.0/semver/difference.ts": "be4f01b7745406408a16b708185a48c1c652cc87e0244b12a5ca75c5585db668", 193 | "https://deno.land/std@0.212.0/semver/eq.ts": "ae97d41e4068e2dbc151a2fce35bdc9815dcd71cc297a54c9623831c8a4737b9", 194 | "https://deno.land/std@0.212.0/semver/format.ts": "2d0b8690bc0659a5756aa339d0d31385c3783a0bbd7d8d25c210cd6b5e4224f8", 195 | "https://deno.land/std@0.212.0/semver/format_range.ts": "935425c6594c51220cbc5af88209f9b4452cbc3d86db99fb0c1be0fbb958cab6", 196 | "https://deno.land/std@0.212.0/semver/gt.ts": "bdbfe1f77c9c61f7f9aaf5ab2871a65c800bc546db124eead512b06f14faecc1", 197 | "https://deno.land/std@0.212.0/semver/gte.ts": "cf43eafbaa6db6fb9f1b057d81d3a8d2725099e4ee8db824c84a57fb69c8a982", 198 | "https://deno.land/std@0.212.0/semver/gtr.ts": "196618d1bdee2f1b9125338f36a9b57c637780b5c4ca1d834dfb8a170c152a4c", 199 | "https://deno.land/std@0.212.0/semver/increment.ts": "427a043be71d6481e45c1a3939b955e800924d70779cb297b872d9cbf9f0e46d", 200 | "https://deno.land/std@0.212.0/semver/is_comparator.ts": "895e7ecff33d23d7a465074a76b2341eda430f84c4817199f7492c5393e2e54f", 201 | "https://deno.land/std@0.212.0/semver/is_semver.ts": "57914027d6141e593eb04418aaabbfd6f4562a1c53c6c33a1743fa50ada8d849", 202 | "https://deno.land/std@0.212.0/semver/is_semver_range.ts": "c65a83c48a623958039628d61e03e3455f87236c4445e43e52afc0c474547ab2", 203 | "https://deno.land/std@0.212.0/semver/lt.ts": "70fecfbad1dd6b7d42f7589efc81fa039688f15a42bc6b86fb3f0fd1e758ef65", 204 | "https://deno.land/std@0.212.0/semver/lte.ts": "2b59c8d54eb1ddb76ddc373ae2243532a049585e628b479cfb0bb29268bf04bb", 205 | "https://deno.land/std@0.212.0/semver/ltr.ts": "9131cd311acd643ad1ea3c815378373409433f2cb0f9efe3cd910bcf50dadda1", 206 | "https://deno.land/std@0.212.0/semver/max_satisfying.ts": "5440018944e076cc7ad5805896c18132c4f65c6e404a4c72a5a8fcd900a66bb4", 207 | "https://deno.land/std@0.212.0/semver/min_satisfying.ts": "767d8ba8d15c5f891be050ad22b13070575a35c5e5e28d0397730de07b121906", 208 | "https://deno.land/std@0.212.0/semver/mod.ts": "ad2c7fea66f690abcce9fa3c9612ad617d577bca73dde0b849ff8727133953fb", 209 | "https://deno.land/std@0.212.0/semver/neq.ts": "ac2bfcca1a616a1303079fbd1afcf205877ac1e0ca7f2bb3f77595a777bbaef5", 210 | "https://deno.land/std@0.212.0/semver/outside.ts": "a61fa278c204b3e985b6f49be39f7bcb604d3b3134bcb8b9d507ebf75c64b89a", 211 | "https://deno.land/std@0.212.0/semver/parse.ts": "2ba215c9aa3c71be753570724cfad75cc81972f0026dc81836ea3d1986112066", 212 | "https://deno.land/std@0.212.0/semver/parse_comparator.ts": "0dca4bee9695ae30a7f0c4829b0b1b8c287f1b40fdb513e38527343bc331e375", 213 | "https://deno.land/std@0.212.0/semver/parse_range.ts": "3d3f9fc251f4acf7e28781271bd139f436994ad4e4625f30439792af2eab9613", 214 | "https://deno.land/std@0.212.0/semver/range_format.ts": "a7b447090c5bb47f876ec0511d17bb3eb116ef04e8c990c28ae309abd3f6ddba", 215 | "https://deno.land/std@0.212.0/semver/range_intersects.ts": "904adb2b2f135f159d4783e1c220af86c77624938b3bc08cd59bfb4b7b0cf047", 216 | "https://deno.land/std@0.212.0/semver/range_max.ts": "10f354f65a13d4b01be45786a3395c926f2e1dabfeca18d430e315a1c38170eb", 217 | "https://deno.land/std@0.212.0/semver/range_min.ts": "b2ab6b539981689119ca36bb4d329aed795204f2c246bb9a48c55da19b05d196", 218 | "https://deno.land/std@0.212.0/semver/reverse_sort.ts": "6e10806559a2b35415188fc984752dfe2f4ac60b3513e879b28c7b964f9c77cb", 219 | "https://deno.land/std@0.212.0/semver/rsort.ts": "d6dea7ddd078446cd5f75e4d471a4fe006fcc69d05170ce4c27637216bfadb6e", 220 | "https://deno.land/std@0.212.0/semver/sort.ts": "b97c4f392cf688e27d304dc437b1a4d7278fbf5d2554ad6e51f64db6cc405c09", 221 | "https://deno.land/std@0.212.0/semver/test_comparator.ts": "24741dd4fda32c7b712d1509894e37f17b7dc6d62d79612d0f29b68aa61e6494", 222 | "https://deno.land/std@0.212.0/semver/test_range.ts": "43e2f830a5ee6cebe2af98e0125e542111e8513a720819df83e3da3605d192ad", 223 | "https://deno.land/std@0.212.0/semver/types.ts": "bcc7dbd6c96110db5eac98c56c7d57b6ee9b9e929779467cbc24f934632e9feb", 224 | "https://deno.land/std@0.52.0/fmt/colors.ts": "ec9d653672a9a3c7b6eafe53c5bc797364a2db2dcf766ab649c1155fea7a80b2", 225 | "https://deno.land/x/cliffy@v1.0.0-rc.3/_utils/distance.ts": "02af166952c7c358ac83beae397aa2fbca4ad630aecfcd38d92edb1ea429f004", 226 | "https://deno.land/x/cliffy@v1.0.0-rc.3/ansi/ansi_escapes.ts": "193b3c3a4e520274bd8322ca4cab1c3ce38070bed1898cb2ade12a585dddd7c9", 227 | "https://deno.land/x/cliffy@v1.0.0-rc.3/ansi/chain.ts": "eca61b1b64cad7b9799490c12c7aa5538d0f63ac65a73ddb6acac8b35f0a5323", 228 | "https://deno.land/x/cliffy@v1.0.0-rc.3/ansi/cursor_position.ts": "caa008d29f7a904908bda514f9839bfbb7a93f2d5f5580501675b646d26a87ff", 229 | "https://deno.land/x/cliffy@v1.0.0-rc.3/ansi/deps.ts": "f48ae5d066684793f4a203524db2a9fd61f514527934b458006f3e57363c0215", 230 | "https://deno.land/x/cliffy@v1.0.0-rc.3/ansi/tty.ts": "155aacdcb7dc00f3f95352616a2415c622ffb88db51c5934e5d2e8341eab010b", 231 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/_argument_types.ts": "ab269dacea2030f865a07c2a1e953ec437a64419a05bad1f1ddaab3f99752ead", 232 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/_errors.ts": "12d513ff401020287a344e0830e1297ce1c80c077ecb91e0ac5db44d04a6019c", 233 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/_spread.ts": "0cc6eb70a6df97b5d7d26008822d39f3e8a1232ee0a27f395aa19e68de738245", 234 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/_type_utils.ts": "820004a59bc858e355b11f80e5b3ff1be2c87e66f31f53f253610170795602f0", 235 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/_utils.ts": "3c88ff4f36eba298beb07de08068fdce5e5cb7b9d82c8a319f09596d8279be64", 236 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/command.ts": "ae690745759524082776b7f271f66d5b93933170b1b132f888bd4ac12e9fdd7d", 237 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/completions/_bash_completions_generator.ts": "0c6cb1df4d378d22f001155781d97a9c3519fd10c48187a198fef2cc63b0f84a", 238 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/completions/_fish_completions_generator.ts": "8ba4455f7f76a756e05c3db4ce35332b2951af65a2891f2750b530e06880f495", 239 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/completions/_zsh_completions_generator.ts": "c74525feaf570fe8c14433c30d192622c25603f1fc64694ef69f2a218b41f230", 240 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/completions/bash.ts": "53fe78994eb2359110dc4fa79235bdd86800a38c1d6b1c4fe673c81756f3a0e2", 241 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/completions/complete.ts": "58df61caa5e6220ff2768636a69337923ad9d4b8c1932aeb27165081c4d07d8b", 242 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/completions/completions_command.ts": "506f97f1c6b0b1c3e9956e5069070028b818942310600d4157f64c9b644d3c49", 243 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/completions/fish.ts": "6f0b44b4067740b2931c9ec8863b6619b1d3410fea0c5a3988525a4c53059197", 244 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/completions/mod.ts": "8dda715ca25f3f66d5ec232b76d7c9a96dd4c64b5029feff91738cc0c9586fb1", 245 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/completions/zsh.ts": "f1263c3946975e090d4aadc8681db811d86b52a8ae680f246e03248025885c21", 246 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/deprecated.ts": "bbe6670f1d645b773d04b725b8b8e7814c862c9f1afba460c4d599ffe9d4983c", 247 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/deps.ts": "7473ebd5625bf901becd7ff80afdde3b8a50ae5d1bbfa2f43805cfacf4559d5a", 248 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/help/_help_generator.ts": "532dd4a928baab8b45ce46bb6d20e2ebacfdf3da141ce9d12da796652b1de478", 249 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/help/help_command.ts": "fbbf0c0827dd21d3cec7bcc68c00c20b55f53e2b621032891b9d23ac4191231c", 250 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/help/mod.ts": "8369b292761dcc9ddaf41f2d34bfb06fb6800b69efe80da4fc9752c3b890275b", 251 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/mod.ts": "4b708df1b97152522bee0e3828f06abbbc1d2250168910e5cf454950d7b7404b", 252 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/type.ts": "f588f5d9635b79100044e62aced4b00e510e75b83801f9b089c40c2d98674de2", 253 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/types.ts": "bc9ff7459b9cc1079eeb95ff101690a51b4b4afa4af5623340076ee361d08dbb", 254 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/types/action_list.ts": "33c98d449617c7a563a535c9ceb3741bde9f6363353fd492f90a74570c611c27", 255 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/types/boolean.ts": "3879ec16092b4b5b1a0acb8675f8c9250c0b8a972e1e4c7adfba8335bd2263ed", 256 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/types/child_command.ts": "f1fca390c7fbfa7a713ca15ef55c2c7656bcbb394d50e8ef54085bdf6dc22559", 257 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/types/command.ts": "325d0382e383b725fd8d0ef34ebaeae082c5b76a1f6f2e843fee5dbb1a4fe3ac", 258 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/types/enum.ts": "8a7cd2898e03089234083bb78c8b1d9b7172254c53c32d4710321638165a48ec", 259 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/types/file.ts": "8618f16ac9015c8589cbd946b3de1988cc4899b90ea251f3325c93c46745140e", 260 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/types/integer.ts": "29864725fd48738579d18123d7ee78fed37515e6dc62146c7544c98a82f1778d", 261 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/types/number.ts": "aeba96e6f470309317a16b308c82e0e4138a830ec79c9877e4622c682012bc1f", 262 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/types/string.ts": "e4dadb08a11795474871c7967beab954593813bb53d9f69ea5f9b734e43dc0e0", 263 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/upgrade/_check_version.ts": "6cfa7dc26bc0dc46381500e8d4b130fb224f4c5456152dada15bd3793edca89b", 264 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/upgrade/mod.ts": "4eff69c489467be17dea27fb95a795396111ee385d170ac0cbcc82f0ea38156c", 265 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/upgrade/provider.ts": "c23253334097dc4b8a147ccdeb3aa44f5a95aa953a6386cb5396f830d95d77a5", 266 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/upgrade/provider/deno_land.ts": "24f8d82e38c51e09be989f30f8ad21f9dd41ac1bb1973b443a13883e8ba06d6d", 267 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/upgrade/provider/github.ts": "99e1b133dd446c6aa79f69e69c46eb8bc1c968dd331c2a7d4064514a317c7b59", 268 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/upgrade/provider/nest_land.ts": "0e07936cea04fa41ac9297f32d87f39152ea873970c54cb5b4934b12fee1885e", 269 | "https://deno.land/x/cliffy@v1.0.0-rc.3/command/upgrade/upgrade_command.ts": "3640a287d914190241ea1e636774b1b4b0e1828fa75119971dd5304784061e05", 270 | "https://deno.land/x/cliffy@v1.0.0-rc.3/flags/_errors.ts": "f1fbb6bfa009e7950508c9d491cfb4a5551027d9f453389606adb3f2327d048f", 271 | "https://deno.land/x/cliffy@v1.0.0-rc.3/flags/_utils.ts": "340d3ecab43cde9489187e1f176504d2c58485df6652d1cdd907c0e9c3ce4cc2", 272 | "https://deno.land/x/cliffy@v1.0.0-rc.3/flags/_validate_flags.ts": "e60b9038c0136ab7e6bd1baf0e993a07bf23f18afbfb6e12c59adf665a622957", 273 | "https://deno.land/x/cliffy@v1.0.0-rc.3/flags/deprecated.ts": "a72a35de3cc7314e5ebea605ca23d08385b218ef171c32a3f135fb4318b08126", 274 | "https://deno.land/x/cliffy@v1.0.0-rc.3/flags/flags.ts": "3e62c4a9756b5705aada29e7e94847001356b3a83cd18ad56f4207387a71cf51", 275 | "https://deno.land/x/cliffy@v1.0.0-rc.3/flags/types.ts": "9e2f75edff2217d972fc711a21676a59dfd88378da2f1ace440ea84c07db1dcc", 276 | "https://deno.land/x/cliffy@v1.0.0-rc.3/flags/types/boolean.ts": "4c026dd66ec9c5436860dc6d0241427bdb8d8e07337ad71b33c08193428a2236", 277 | "https://deno.land/x/cliffy@v1.0.0-rc.3/flags/types/integer.ts": "b60d4d590f309ddddf066782d43e4dc3799f0e7d08e5ede7dc62a5ee94b9a6d9", 278 | "https://deno.land/x/cliffy@v1.0.0-rc.3/flags/types/number.ts": "610936e2d29de7c8c304b65489a75ebae17b005c6122c24e791fbed12444d51e", 279 | "https://deno.land/x/cliffy@v1.0.0-rc.3/flags/types/string.ts": "e89b6a5ce322f65a894edecdc48b44956ec246a1d881f03e97bbda90dd8638c5", 280 | "https://deno.land/x/cliffy@v1.0.0-rc.3/keycode/_key_codes.ts": "917f0a2da0dbace08cf29bcfdaaa2257da9fe7e705fff8867d86ed69dfb08cfe", 281 | "https://deno.land/x/cliffy@v1.0.0-rc.3/keycode/key_code.ts": "730fa675ca12fc2a99ba718aa8dbebb1f2c89afd47484e30ef3cb705ddfca367", 282 | "https://deno.land/x/cliffy@v1.0.0-rc.3/keycode/mod.ts": "981b828bddada634e62a2a067b9d1592986180c4e920eb55e0a43cc085eb98ab", 283 | "https://deno.land/x/cliffy@v1.0.0-rc.3/prompt/_figures.ts": "e22413ddd51bb271b6b861a058742e83aaa3f62c14e8162cb73ae6f047062f51", 284 | "https://deno.land/x/cliffy@v1.0.0-rc.3/prompt/_generic_input.ts": "870dad97077582439cee26cb19aec123b4850376331338abdc64a91224733cdc", 285 | "https://deno.land/x/cliffy@v1.0.0-rc.3/prompt/_generic_list.ts": "8b0bea4521b1e2f62c564e0d3764a63264043694f4228bb0bc0b63ce129ef33b", 286 | "https://deno.land/x/cliffy@v1.0.0-rc.3/prompt/_generic_prompt.ts": "4c9d9cdeda749620a3f5332524df13d083e2d59b1ed90a003f43cd0991a75a10", 287 | "https://deno.land/x/cliffy@v1.0.0-rc.3/prompt/_generic_suggestions.ts": "5e6ee1190b4dd5af261ae2ff0196dec7f1988ea9c41c6288cfaece293703002c", 288 | "https://deno.land/x/cliffy@v1.0.0-rc.3/prompt/_utils.ts": "498ae639d7666599d612b615ee85de9103b3c3a913d5196f6b265072674258c7", 289 | "https://deno.land/x/cliffy@v1.0.0-rc.3/prompt/checkbox.ts": "9cfd71f1e278d0ef76054be103d956b66995593902c149380d01b1a1647025f3", 290 | "https://deno.land/x/cliffy@v1.0.0-rc.3/prompt/confirm.ts": "ff892331f6de281079421fe2f57f1d56acb38f28bc48678f87a3fc11ef4a5f7c", 291 | "https://deno.land/x/cliffy@v1.0.0-rc.3/prompt/deps.ts": "2560142f070bb2668e2e8a74683c799461648b9aad01bbf36b3cad3851d712e6", 292 | "https://deno.land/x/cliffy@v1.0.0-rc.3/prompt/input.ts": "81821244f895cc4db32c2511c17e21fb48fd7606e300605aeb2a231ab1680544", 293 | "https://deno.land/x/cliffy@v1.0.0-rc.3/prompt/list.ts": "e5d3e1a6d931b9736d03eec2425fb7b4d2b8d1461a84e210b4787edda414dca4", 294 | "https://deno.land/x/cliffy@v1.0.0-rc.3/prompt/mod.ts": "f8789193742daf3aba93b543a2ea099383284d60fcccc03567102e28c0d61927", 295 | "https://deno.land/x/cliffy@v1.0.0-rc.3/prompt/number.ts": "5421bf1b6411a6f02c44da4e867f19e02315450769e0feacab3c1c88cc1b06d6", 296 | "https://deno.land/x/cliffy@v1.0.0-rc.3/prompt/prompt.ts": "f10e1c8a0c2ca093a485f7f1156342210b27a8cffc96fe0b4cff60007cabab30", 297 | "https://deno.land/x/cliffy@v1.0.0-rc.3/prompt/secret.ts": "cece271c7ce01e12b249c31c2f9cea9e53b6e6be7621a478dac902bd8f288b61", 298 | "https://deno.land/x/cliffy@v1.0.0-rc.3/prompt/select.ts": "c10902aeaca02a55d9b846934958dd166ee39c741faebdaa9800689e402186cf", 299 | "https://deno.land/x/cliffy@v1.0.0-rc.3/prompt/toggle.ts": "028f80de31750e7b5479727a64b4878f090ecd783fe3bb0d286e2e1c29f0eee3", 300 | "https://deno.land/x/cliffy@v1.0.0-rc.3/table/_layout.ts": "e4a518da28333de95ad791208b9930025987c8b93d5f8b7f30b377b3e26b24e1", 301 | "https://deno.land/x/cliffy@v1.0.0-rc.3/table/_utils.ts": "fd48d1a524a42e72aa3ad2eec858a92f5a00728d306c7e8436fba6c34314fee6", 302 | "https://deno.land/x/cliffy@v1.0.0-rc.3/table/border.ts": "5c6e9ef5078c6930169aacb668b274bdbb498461c724a7693ac9270fe9d3f5d5", 303 | "https://deno.land/x/cliffy@v1.0.0-rc.3/table/cell.ts": "1ffabd43b6b7fddfac9625cb0d015532e144702a9bfed03b358b79375115d06b", 304 | "https://deno.land/x/cliffy@v1.0.0-rc.3/table/column.ts": "cf14009f2cb14bad156f879946186c1893acdc6a2fee6845db152edddb6a2714", 305 | "https://deno.land/x/cliffy@v1.0.0-rc.3/table/consume_words.ts": "456e75755fdf6966abdefb8b783df2855e2a8bad6ddbdf21bd748547c5fc1d4b", 306 | "https://deno.land/x/cliffy@v1.0.0-rc.3/table/deps.ts": "1226c4d39d53edc81d7c3e661fb8a79f2e704937c276c60355cd4947a0fe9153", 307 | "https://deno.land/x/cliffy@v1.0.0-rc.3/table/mod.ts": "40f148428acbfffa270f7077c403b3893797d9e454a74ccb41a8434367351326", 308 | "https://deno.land/x/cliffy@v1.0.0-rc.3/table/row.ts": "79eb1468aafdd951e5963898cdafe0752d4ab4c519d5f847f3d8ecb8fe857d4f", 309 | "https://deno.land/x/cliffy@v1.0.0-rc.3/table/table.ts": "298671e72e61f1ab18b42ae36643181993f79e29b39dc411fdc6ffd53aa04684", 310 | "https://deno.land/x/dir@1.5.2/cache_dir/mod.ts": "8a82889db79c547fbbd3536c9c964047657b19fb59365c5fa59afc46082f9fe5", 311 | "https://deno.land/x/dir@1.5.2/config_dir/mod.ts": "d16ca6f949c3e42ed23f942261d2482f340dd6c73542740f57c89abeaa83ea3f", 312 | "https://deno.land/x/dir@1.5.2/data_dir/mod.ts": "7d17c6d9e775974245e0456c8f83f751c41c792c06020d12ca1ca69a0ce4e671", 313 | "https://deno.land/x/dir@1.5.2/data_local_dir/mod.ts": "91eb1c4bfadfbeda30171007bac6d85aadacd43224a5ed721bbe56bc64e9eb66", 314 | "https://deno.land/x/dir@1.5.2/download_dir/mod.ts": "5e7e57b5b680f3117e635b4d05622edc276670d9d7cd43ee6626807f8b372770", 315 | "https://deno.land/x/dir@1.5.2/home_dir/mod.ts": "6128b52da60124f78a4fc176cd4687a073e9b0331803dd602dfb685fa4fe4ae1", 316 | "https://deno.land/x/dir@1.5.2/mod.ts": "95e1519b7b629c995025652342b36fbf64a6a9a0bd7822b0c4573a22f42f0529", 317 | "https://deno.land/x/dir@1.5.2/tmp_dir/mod.ts": "c89c792d454fa1e3b2882f34faa87e9b92fc2866118b348d9984d68d33773c58", 318 | "https://deno.land/x/docker_names@v1.1.0/adjectives.ts": "bb774e14f9217d9b247eff73427925006809cf11fb79023b0f349abadfd162bb", 319 | "https://deno.land/x/docker_names@v1.1.0/generator.ts": "bf92ca7538de84646f98ad8b989db0abe35cfd7ca5257ca1f5d498f9e6758394", 320 | "https://deno.land/x/docker_names@v1.1.0/mod.ts": "196aefa58be04be1e7c6e9cba1d48db77534d1c7e0c74cb044cb9414932f68ef", 321 | "https://deno.land/x/docker_names@v1.1.0/personalities.ts": "20c5a965cee41929bf2f019cba6d460530d6346f7d9ee8de829e6e9e600d00df", 322 | "https://deno.land/x/docker_names@v1.1.0/rand.ts": "1418683fa1af75aecb3df55aa34d24cc0828f01cd9bf4a28539fefc85d36ceea", 323 | "https://deno.land/x/is_docker@v2.0.0/mod.ts": "4c8753346f4afbb6c251d7984a609aa84055559cf713fba828939a5d39c95cd0", 324 | "https://deno.land/x/is_wsl@v1.1.0/mod.ts": "30996b09376652df7a4d495320e918154906ab94325745c1399e13e658dca5da", 325 | "https://deno.land/x/logger@v1.1.3/date.ts": "09041dc83c9cddb489b875f45b07336dd894c23b9dd5b47235b94180571a2efa", 326 | "https://deno.land/x/logger@v1.1.3/deps.ts": "1b09212250f8023edd69efb798874ca19bf90c4ed7cdcc1a292dc16c5bb2cf6d", 327 | "https://deno.land/x/logger@v1.1.3/eol.ts": "493acd048c546fd48bcd26365d4dadf3db81ce32c4611ca5b0b19e6de9f9826a", 328 | "https://deno.land/x/logger@v1.1.3/fs.ts": "7d1c7261e9f15d25c6c09df43169a4665bd9da7e2413534aa294f4b184f3fa4e", 329 | "https://deno.land/x/logger@v1.1.3/interface.ts": "7bca0b861b894e914508aab1afdd7e42e598695a50a3efe9db54be8ba4ab3b0e", 330 | "https://deno.land/x/logger@v1.1.3/logger.ts": "fc7a84305b4b8e711b5d7d51ab3cef796900effffd3e85c730291aa339efbb98", 331 | "https://deno.land/x/logger@v1.1.3/stdout.ts": "364b6ca8c016c9e67d457d12aa028a448e4b8af7a78965e42de824fb969a9ccb", 332 | "https://deno.land/x/logger@v1.1.3/types.ts": "8835d0d56f500112f92b36d8f241f95bccef93f73de203f7cd86de3ab4383d80", 333 | "https://deno.land/x/logger@v1.1.3/writable.ts": "bb60ba4a798a10ac1649e30598c0c346055c0dcacb8f1e9452e4f66ea6680a45", 334 | "https://deno.land/x/logger@v1.1.3/writer.ts": "539ff3a1bdefef897ca1d13d387ee4d84d6491f460020454e9158076f5e09221", 335 | "https://deno.land/x/open@v0.0.6/index.ts": "c7484a7bf2628236f33bbe354520e651811faf1a7cbc3c3f80958ce81b4c42ef", 336 | "https://deno.land/x/spinners@v1.1.2/mod.ts": "ed5b3562d4ea6c6887bc7e9844612b08a3bc3a3678ca77cc7dfdf461c362751e", 337 | "https://deno.land/x/spinners@v1.1.2/spinner-types.ts": "c67e6962a0c738aa57b4d3ad9fe06c8c0131f93360acbf95456f2ba200fd8826", 338 | "https://deno.land/x/spinners@v1.1.2/terminal-spinner.ts": "1cf0c38a423781734e2e538323c1992027830d741e90f0b81f532e5bc993d035", 339 | "https://deno.land/x/spinners@v1.1.2/util.ts": "7083203bedbda2e6144a14a7dd093747a7a01e73d95637c888bae8ac22a1c58b", 340 | "https://deno.land/x/zip@v1.2.5/compress.ts": "43d9f4440960d15a85aec58f5d365acc25530d3d4186b2f5f896c090ecac20e8", 341 | "https://deno.land/x/zip@v1.2.5/decompress.ts": "0bce3d453726f686274fab3f6c19b72b5e74223a00d89c176b1de49a5dd5528d", 342 | "https://deno.land/x/zip@v1.2.5/deps.ts": "79548387594b3ae1efaaa870b5a507c4d6bedede13dbd5d4ad42f6cda0aeef86", 343 | "https://deno.land/x/zip@v1.2.5/mod.ts": "28eecbc3e1e5adf564f4aa465e64268713a05653104bacdcb04561533f8caf57", 344 | "https://deno.land/x/zip@v1.2.5/utils.ts": "43c323f2b79f9db1976c5739bbb1f9cced20e8077ca7e7e703f9d01d4330bd9d" 345 | } 346 | } 347 | --------------------------------------------------------------------------------