Skip to content

Instantly share code, notes, and snippets.

@andyjessop
Last active September 30, 2024 14:31
Show Gist options
  • Save andyjessop/9a4f4e32d12635b47ff8b798ef74eb2c to your computer and use it in GitHub Desktop.
Save andyjessop/9a4f4e32d12635b47ff8b798ef74eb2c to your computer and use it in GitHub Desktop.
Ideas for a modular Wrangler
// /packages/wrangler/versions/versions.test.ts
import { versions } from './versions';
it("should output things", async () => {
const { completed, dir, logs, mock, seed, stop } = versions({
fixture: "./tests/fixtures/",
env: {
/* extra environment variables */
},
}).run({
remote: false, // must have mocks saved in ./.mocks/[hash]
});
// programmatic seeding
seed({...});
mock({...});
// asserting output
expect(logs.output.has("some output")).toBe(true);
expect(logs.output.has("some error")).toBe(true);
expect(logs.stdout.has("some output")).toBe(true);
expect(logs.stderr.has("some error")).toBe(true);
// using dir to access tmp files
expect(existsSync(path.join(dir, "wrangler.toml")));
// stopping a long-lived process
await logs.output.waitFor("some output");
stop();
await completed;
});
// /packages/wrangler/versions/versions.ts
// versions mini-wranlger
// has own package.json with own e2e/integration/unit tests - let turbo handle partial task execution
// mini-wranlgers are composable in /packages/wrangler/index.ts
/*
// /packages/wrangler/shared/shared.ts
export const shared = new Wrangler();
shared.defineConfig({
// ...sharedConfig
})
// /packages/wrangler/wrangler.ts
export const wrangler = new Wrangler([
shared, //de-deuplicates shared
versions
]);
*/
export const versions = new Wrangler([shared]);
versions
.defineConfig({} as VersionsConfig)
.defineNamespace("wrangler versions", {
metadata: {
description: `🫧 List, view, upload and deploy Versions of your Worker to Cloudflare`,
status: "open-beta",
owner: "Workers: Authoring and Testing",
},
})
.defineCommand("wrangler versions list", {
args: {
name: {
describe: "Name of the worker",
type: "string",
requiresArg: true,
},
json: {
describe: "Display output as clean JSON",
type: "boolean",
default: false,
},
},
metadata: {
description: "List the 10 most recent Versions of your Worker [beta]", // TODO(now): remove [beta]
owner: "Workers: Authoring and Testing",
status: "open-beta",
},
behaviour: {},
async handler({
config,
dir,
logger,
api,
}: {
config: Config<VersionsConfig /* & anything defined by shared */>; // Config provides get/set and is format-agnostic
dir: string;
logger: Logger;
api: Api<{ versions: VersionsApi /* anything defined by shared */ }>;
}) {
const flags = config.get("compatabilityFlags");
const versions = await api.versions.getAll();
logger.info("All versions retrieved");
// ...steps how?
},
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment