package.test.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import assert from "node:assert/strict";
  2. import { spawnSync } from "node:child_process";
  3. import { readFile } from "node:fs/promises";
  4. import test from "node:test";
  5. interface PackageContract {
  6. version?: string;
  7. private?: boolean;
  8. bin?: Record<string, string>;
  9. files?: string[];
  10. scripts?: Record<string, string>;
  11. }
  12. test("npm package contract exposes the prebuilt private CLI", async () => {
  13. const [packageText, launcher, compiledCli, compiledConfig] = await Promise.all([
  14. readFile(new URL("../package.json", import.meta.url), "utf8"),
  15. readFile(new URL("../bin/codex-app-server-bridge.js", import.meta.url), "utf8"),
  16. readFile(new URL("../dist/cli.js", import.meta.url), "utf8"),
  17. readFile(new URL("../dist/config.js", import.meta.url), "utf8"),
  18. ]);
  19. const packageJson = JSON.parse(packageText) as PackageContract;
  20. assert.equal(packageJson.private, true);
  21. assert.equal(packageJson.version, "0.1.1");
  22. assert.deepEqual(packageJson.bin, {
  23. "codex-app-server-bridge": "bin/codex-app-server-bridge.js",
  24. });
  25. assert.deepEqual(packageJson.files, [
  26. "bin/",
  27. "dist/cli.js",
  28. "dist/config.js",
  29. "README.md",
  30. "LICENSE",
  31. ]);
  32. assert.equal(packageJson.scripts?.compile, "tsc --project tsconfig.build.json");
  33. assert.equal(packageJson.scripts?.build, undefined);
  34. for (const lifecycle of ["prepack", "prepare", "preinstall", "install", "postinstall"]) {
  35. assert.equal(packageJson.scripts?.[lifecycle], undefined);
  36. }
  37. assert.match(packageJson.scripts?.test ?? "", /npm run compile/);
  38. assert.equal(
  39. packageJson.scripts?.["verify:runtime"],
  40. "node scripts/verify-generated-runtime.mjs",
  41. );
  42. assert.equal(
  43. packageJson.scripts?.["verify:git-package"],
  44. "node scripts/verify-git-package.mjs",
  45. );
  46. assert.match(packageJson.scripts?.["pack:verified"] ?? "", /npm run verify:runtime/);
  47. assert.match(packageJson.scripts?.["pack:verified"] ?? "", /npm pack --ignore-scripts/);
  48. assert.match(launcher, /^#!\/usr\/bin\/env node\n/);
  49. assert.match(compiledCli, /export async function runBridge/);
  50. assert.match(compiledConfig, /export function parseEndpoint/);
  51. });
  52. test("Git ignore rules admit only the compiled bridge runtime", () => {
  53. const repository = new URL("..", import.meta.url);
  54. const checkIgnored = (path: string) => spawnSync(
  55. "git",
  56. ["check-ignore", "--no-index", "--quiet", path],
  57. { cwd: repository, encoding: "utf8" },
  58. ).status;
  59. assert.equal(checkIgnored("dist/cli.js"), 1);
  60. assert.equal(checkIgnored("dist/config.js"), 1);
  61. assert.equal(checkIgnored("dist/test/bridge.test.js"), 0);
  62. assert.equal(checkIgnored("dist/other-output.js"), 0);
  63. });
  64. test("packed-artifact verifier rejects a missing tarball argument", () => {
  65. const verifier = new URL("../scripts/verify-packed-package.mjs", import.meta.url);
  66. const result = spawnSync(process.execPath, [verifier.pathname], { encoding: "utf8" });
  67. assert.notEqual(result.status, 0);
  68. assert.match(result.stderr, /Packed-package verification failed: usage:/);
  69. });