bingo-systems 0.5.5 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"createReadingFileSystem.d.ts","sourceRoot":"","sources":["../../src/files/createReadingFileSystem.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,wBAAgB,uBAAuB,IAAI,iBAAiB,CAM3D"}
1
+ {"version":3,"file":"createReadingFileSystem.d.ts","sourceRoot":"","sources":["../../src/files/createReadingFileSystem.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C,wBAAgB,uBAAuB,IAAI,iBAAiB,CAQ3D"}
@@ -1,8 +1,16 @@
1
1
  import * as fs from "node:fs/promises";
2
2
  export function createReadingFileSystem() {
3
3
  return {
4
+ glob: async (patterns) => await collect(fs.glob(patterns)),
4
5
  readDirectory: async (filePath) => await fs.readdir(filePath),
5
6
  readFile: async (filePath) => (await fs.readFile(filePath)).toString(),
6
7
  };
7
8
  }
9
+ async function collect(matches) {
10
+ const collected = [];
11
+ for await (const match of matches) {
12
+ collected.push(match);
13
+ }
14
+ return collected;
15
+ }
8
16
  //# sourceMappingURL=createReadingFileSystem.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createReadingFileSystem.js","sourceRoot":"","sources":["../../src/files/createReadingFileSystem.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAIvC,MAAM,UAAU,uBAAuB;IACtC,OAAO;QACN,aAAa,EAAE,KAAK,EAAE,QAAgB,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;QACrE,QAAQ,EAAE,KAAK,EAAE,QAAgB,EAAE,EAAE,CACpC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;KACzC,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"createReadingFileSystem.js","sourceRoot":"","sources":["../../src/files/createReadingFileSystem.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAIvC,MAAM,UAAU,uBAAuB;IACtC,OAAO;QACN,IAAI,EAAE,KAAK,EAAE,QAA2B,EAAE,EAAE,CAC3C,MAAM,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,aAAa,EAAE,KAAK,EAAE,QAAgB,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC;QACrE,QAAQ,EAAE,KAAK,EAAE,QAAgB,EAAE,EAAE,CACpC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;KACzC,CAAC;AACH,CAAC;AAED,KAAK,UAAU,OAAO,CAAC,OAA8B;IACpD,MAAM,SAAS,GAAa,EAAE,CAAC;IAE/B,IAAI,KAAK,EAAE,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QACnC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,SAAS,CAAC;AAClB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=createReadingFileSystem.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createReadingFileSystem.test.d.ts","sourceRoot":"","sources":["../../src/files/createReadingFileSystem.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,58 @@
1
+ import { Readable } from "node:stream";
2
+ import { describe, expect, it, vi } from "vitest";
3
+ import { createReadingFileSystem } from "./createReadingFileSystem.js";
4
+ const mockGlob = vi.fn();
5
+ const mockReaddir = vi.fn();
6
+ const mockReadFile = vi.fn();
7
+ vi.mock("node:fs/promises", () => ({
8
+ get glob() {
9
+ return mockGlob;
10
+ },
11
+ get readdir() {
12
+ return mockReaddir;
13
+ },
14
+ get readFile() {
15
+ return mockReadFile;
16
+ },
17
+ }));
18
+ describe("createReadingFileSystem", () => {
19
+ describe("glob", () => {
20
+ it("resolves with the matched paths when given one pattern", async () => {
21
+ const matches = [".github/workflows/ci.yml"];
22
+ mockGlob.mockReturnValueOnce(Readable.from(matches));
23
+ const system = createReadingFileSystem();
24
+ const actual = await system.glob(".github/**/*.yml");
25
+ expect(actual).toEqual(matches);
26
+ expect(mockGlob).toHaveBeenCalledWith(".github/**/*.yml");
27
+ });
28
+ it("resolves with the matched paths when given multiple patterns", async () => {
29
+ const patterns = [".github/**/*.yml", "src/**/*.ts"];
30
+ const matches = [".github/workflows/ci.yml", "src/index.ts"];
31
+ mockGlob.mockReturnValueOnce(Readable.from(matches));
32
+ const system = createReadingFileSystem();
33
+ const actual = await system.glob(patterns);
34
+ expect(actual).toEqual(matches);
35
+ expect(mockGlob).toHaveBeenCalledWith(patterns);
36
+ });
37
+ });
38
+ describe("readDirectory", () => {
39
+ it("resolves with the directory's children", async () => {
40
+ const children = ["index.ts"];
41
+ mockReaddir.mockResolvedValueOnce(children);
42
+ const system = createReadingFileSystem();
43
+ const actual = await system.readDirectory("src");
44
+ expect(actual).toBe(children);
45
+ expect(mockReaddir).toHaveBeenCalledWith("src");
46
+ });
47
+ });
48
+ describe("readFile", () => {
49
+ it("resolves with the file's contents as text", async () => {
50
+ mockReadFile.mockResolvedValueOnce(Buffer.from("abc123"));
51
+ const system = createReadingFileSystem();
52
+ const actual = await system.readFile("src/index.ts");
53
+ expect(actual).toBe("abc123");
54
+ expect(mockReadFile).toHaveBeenCalledWith("src/index.ts");
55
+ });
56
+ });
57
+ });
58
+ //# sourceMappingURL=createReadingFileSystem.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createReadingFileSystem.test.js","sourceRoot":"","sources":["../../src/files/createReadingFileSystem.test.ts"],"names":[],"mappings":"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"}
@@ -2,6 +2,7 @@ import { CreatedFileMetadata } from "bingo-fs";
2
2
  export declare function createWritingFileSystem(): {
3
3
  writeDirectory: (directoryPath: string) => Promise<undefined>;
4
4
  writeFile: (filePath: string, contents: string, options?: CreatedFileMetadata) => Promise<void>;
5
+ glob: import("./types.js").Glob;
5
6
  readDirectory: import("./types.js").ReadDirectory;
6
7
  readFile: import("./types.js").ReadFile;
7
8
  };
@@ -1 +1 @@
1
- {"version":3,"file":"createWritingFileSystem.d.ts","sourceRoot":"","sources":["../../src/files/createWritingFileSystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAK/C,wBAAgB,uBAAuB;oCAGC,MAAM;0BAGjC,MAAM,YACN,MAAM,YACN,mBAAmB;;;EAoB/B"}
1
+ {"version":3,"file":"createWritingFileSystem.d.ts","sourceRoot":"","sources":["../../src/files/createWritingFileSystem.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAK/C,wBAAgB,uBAAuB;oCAGC,MAAM;0BAGjC,MAAM,YACN,MAAM,YACN,mBAAmB;;;;EAoB/B"}
@@ -1,3 +1,9 @@
1
+ /**
2
+ * Finds the paths matching one or more glob patterns.
3
+ * @param patterns Glob pattern(s) to match paths against.
4
+ * @returns Promise for the matching paths, relative to the current directory.
5
+ */
6
+ export type Glob = (patterns: string | string[]) => Promise<string[]>;
1
7
  /**
2
8
  * Reads the names of a directory's children.
3
9
  * @param directoryPath Path to the directory on disk.
@@ -14,6 +20,10 @@ export type ReadFile = (filePath: string) => Promise<string>;
14
20
  * APIs to read from a file system.
15
21
  */
16
22
  export interface ReadingFileSystem {
23
+ /**
24
+ * Finds the paths matching one or more glob patterns.
25
+ */
26
+ glob: Glob;
17
27
  /**
18
28
  * Reads the names of a directory's children.
19
29
  */
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/files/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AAEzE;;;;GAIG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC;;OAEG;IACH,aAAa,EAAE,aAAa,CAAC;IAE7B;;OAEG;IACH,QAAQ,EAAE,QAAQ,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEtE;;;;;;GAMG;AACH,MAAM,MAAM,SAAS,GAAG,CACvB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,gBAAgB,KACtB,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB;IAC3D;;OAEG;IACH,cAAc,EAAE,cAAc,CAAC;IAE/B;;OAEG;IACH,SAAS,EAAE,SAAS,CAAC;CACrB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/files/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,EAAE,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AAEtE;;;;GAIG;AACH,MAAM,MAAM,aAAa,GAAG,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;AAEzE;;;;GAIG;AACH,MAAM,MAAM,QAAQ,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;AAE7D;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC;;OAEG;IACH,IAAI,EAAE,IAAI,CAAC;IAEX;;OAEG;IACH,aAAa,EAAE,aAAa,CAAC;IAE7B;;OAEG;IACH,QAAQ,EAAE,QAAQ,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEtE;;;;;;GAMG;AACH,MAAM,MAAM,SAAS,GAAG,CACvB,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,EAChB,OAAO,CAAC,EAAE,gBAAgB,KACtB,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAkB,SAAQ,iBAAiB;IAC3D;;OAEG;IACH,cAAc,EAAE,cAAc,CAAC;IAE/B;;OAEG;IACH,SAAS,EAAE,SAAS,CAAC;CACrB"}
@@ -1 +1 @@
1
- {"version":3,"file":"createSystemRunner.d.ts","sourceRoot":"","sources":["../../src/runner/createSystemRunner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,wBAAgB,kBAAkB,CAAC,SAAS,SAAM,GAAG,YAAY,CAIhE"}
1
+ {"version":3,"file":"createSystemRunner.d.ts","sourceRoot":"","sources":["../../src/runner/createSystemRunner.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,wBAAgB,kBAAkB,CAAC,SAAS,SAAM,GAAG,YAAY,CAQhE"}
@@ -1,6 +1,11 @@
1
1
  import { execa, parseCommandString } from "execa";
2
+ import { getColorsEnv } from "./getColorsEnv.js";
2
3
  export function createSystemRunner(directory = ".") {
3
- const executor = execa({ cwd: directory, reject: false });
4
+ const executor = execa({
5
+ cwd: directory,
6
+ env: getColorsEnv(),
7
+ reject: false,
8
+ });
4
9
  return (command) => executor `${parseCommandString(command)}`;
5
10
  }
6
11
  //# sourceMappingURL=createSystemRunner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"createSystemRunner.js","sourceRoot":"","sources":["../../src/runner/createSystemRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAIlD,MAAM,UAAU,kBAAkB,CAAC,SAAS,GAAG,GAAG;IACjD,MAAM,QAAQ,GAAG,KAAK,CAAC,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;IAE1D,OAAO,CAAC,OAAe,EAAE,EAAE,CAAC,QAAQ,CAAA,GAAG,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;AACtE,CAAC"}
1
+ {"version":3,"file":"createSystemRunner.js","sourceRoot":"","sources":["../../src/runner/createSystemRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,kBAAkB,EAAE,MAAM,OAAO,CAAC;AAElD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAGjD,MAAM,UAAU,kBAAkB,CAAC,SAAS,GAAG,GAAG;IACjD,MAAM,QAAQ,GAAG,KAAK,CAAC;QACtB,GAAG,EAAE,SAAS;QACd,GAAG,EAAE,YAAY,EAAE;QACnB,MAAM,EAAE,KAAK;KACb,CAAC,CAAC;IAEH,OAAO,CAAC,OAAe,EAAE,EAAE,CAAC,QAAQ,CAAA,GAAG,kBAAkB,CAAC,OAAO,CAAC,EAAE,CAAC;AACtE,CAAC"}
@@ -1,5 +1,11 @@
1
1
  import { describe, expect, it, vi } from "vitest";
2
2
  import { createSystemRunner } from "./createSystemRunner.js";
3
+ const mockGetColorsEnv = vi.fn();
4
+ vi.mock("./getColorsEnv.js", () => ({
5
+ get getColorsEnv() {
6
+ return mockGetColorsEnv;
7
+ },
8
+ }));
3
9
  const mockExecutor = vi.fn();
4
10
  const mockExeca = vi.fn().mockReturnValue(mockExecutor);
5
11
  vi.mock("execa", async () => ({
@@ -16,6 +22,13 @@ describe("createSystemRunner", () => {
16
22
  expect(mockExeca.mock.calls).toEqual([[{ cwd, reject: false }]]);
17
23
  expect(mockExecutor.mock.calls).toEqual([[["", ""], ["abc"]]]);
18
24
  });
25
+ it("executes the command with a colors env when the terminal supports colors", async () => {
26
+ const env = { FORCE_COLOR: "3" };
27
+ mockGetColorsEnv.mockReturnValueOnce(env);
28
+ const runner = createSystemRunner();
29
+ await runner("abc");
30
+ expect(mockExeca.mock.calls).toEqual([[{ cwd: ".", env, reject: false }]]);
31
+ });
19
32
  it("executes the command as a parsed command string when it includes spaces", async () => {
20
33
  const runner = createSystemRunner();
21
34
  await runner("a bc d");
@@ -1 +1 @@
1
- {"version":3,"file":"createSystemRunner.test.js","sourceRoot":"","sources":["../../src/runner/createSystemRunner.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAElD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAC7B,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;AAExD,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAC7B,GAAG,CAAC,MAAM,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,KAAK;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;CACD,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,GAAG,GAAG,cAAc,CAAC;QAC3B,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAEvC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;QAEpB,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;QAEpC,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEvB,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QACtE,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;YACvC;gBACC,CAAC,EAAE,EAAE,EAAE,CAAC;gBACR,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC;aAChB;SACD,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"createSystemRunner.test.js","sourceRoot":"","sources":["../../src/runner/createSystemRunner.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAElD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAE7D,MAAM,gBAAgB,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAEjC,EAAE,CAAC,IAAI,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,IAAI,YAAY;QACf,OAAO,gBAAgB,CAAC;IACzB,CAAC;CACD,CAAC,CAAC,CAAC;AAEJ,MAAM,YAAY,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;AAC7B,MAAM,SAAS,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;AAExD,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAC7B,GAAG,CAAC,MAAM,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IACnC,IAAI,KAAK;QACR,OAAO,SAAS,CAAC;IAClB,CAAC;CACD,CAAC,CAAC,CAAC;AAEJ,QAAQ,CAAC,oBAAoB,EAAE,GAAG,EAAE;IACnC,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;QAC3E,MAAM,GAAG,GAAG,cAAc,CAAC;QAC3B,MAAM,MAAM,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAEvC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;QAEpB,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QACjE,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0EAA0E,EAAE,KAAK,IAAI,EAAE;QACzF,MAAM,GAAG,GAAG,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;QACjC,gBAAgB,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;QAEpC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;QAEpB,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yEAAyE,EAAE,KAAK,IAAI,EAAE;QACxF,MAAM,MAAM,GAAG,kBAAkB,EAAE,CAAC;QAEpC,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEvB,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;QACtE,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;YACvC;gBACC,CAAC,EAAE,EAAE,EAAE,CAAC;gBACR,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC;aAChB;SACD,CAAC,CAAC;IACJ,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ interface ColorsStream {
2
+ hasColors(count: number): boolean;
3
+ isTTY: boolean;
4
+ }
5
+ export declare function getColorsEnv(stdout?: ColorsStream): {
6
+ FORCE_COLOR: string;
7
+ } | undefined;
8
+ export {};
9
+ //# sourceMappingURL=getColorsEnv.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getColorsEnv.d.ts","sourceRoot":"","sources":["../../src/runner/getColorsEnv.ts"],"names":[],"mappings":"AAAA,UAAU,YAAY;IACrB,SAAS,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC;IAClC,KAAK,EAAE,OAAO,CAAC;CACf;AAED,wBAAgB,YAAY,CAAC,MAAM,GAAE,YAA6B;;cAkBjE"}
@@ -0,0 +1,16 @@
1
+ export function getColorsEnv(stdout = process.stdout) {
2
+ if (!stdout.isTTY) {
3
+ return undefined;
4
+ }
5
+ if (stdout.hasColors(2 ** 24)) {
6
+ return { FORCE_COLOR: "3" };
7
+ }
8
+ if (stdout.hasColors(2 ** 8)) {
9
+ return { FORCE_COLOR: "2" };
10
+ }
11
+ if (stdout.hasColors(16)) {
12
+ return { FORCE_COLOR: "1" };
13
+ }
14
+ return undefined;
15
+ }
16
+ //# sourceMappingURL=getColorsEnv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getColorsEnv.js","sourceRoot":"","sources":["../../src/runner/getColorsEnv.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,YAAY,CAAC,SAAuB,OAAO,CAAC,MAAM;IACjE,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,SAAS,CAAC;IAClB,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/B,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAC9B,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,SAAS,CAAC;AAClB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=getColorsEnv.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getColorsEnv.test.d.ts","sourceRoot":"","sources":["../../src/runner/getColorsEnv.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,31 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { getColorsEnv } from "./getColorsEnv.js";
3
+ function createStdout(isTTY, maxColors = 0) {
4
+ return {
5
+ hasColors: (count) => count <= maxColors,
6
+ isTTY,
7
+ };
8
+ }
9
+ describe(getColorsEnv, () => {
10
+ it("returns undefined when stdout is not a TTY", () => {
11
+ const actual = getColorsEnv(createStdout(false, 2 ** 24));
12
+ expect(actual).toBeUndefined();
13
+ });
14
+ it("returns undefined when the TTY does not support colors", () => {
15
+ const actual = getColorsEnv(createStdout(true));
16
+ expect(actual).toBeUndefined();
17
+ });
18
+ it("returns level 1 when the TTY supports only basic colors", () => {
19
+ const actual = getColorsEnv(createStdout(true, 16));
20
+ expect(actual).toEqual({ FORCE_COLOR: "1" });
21
+ });
22
+ it("returns level 2 when the TTY supports 256 colors", () => {
23
+ const actual = getColorsEnv(createStdout(true, 2 ** 8));
24
+ expect(actual).toEqual({ FORCE_COLOR: "2" });
25
+ });
26
+ it("returns level 3 when the TTY supports 16 million colors", () => {
27
+ const actual = getColorsEnv(createStdout(true, 2 ** 24));
28
+ expect(actual).toEqual({ FORCE_COLOR: "3" });
29
+ });
30
+ });
31
+ //# sourceMappingURL=getColorsEnv.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getColorsEnv.test.js","sourceRoot":"","sources":["../../src/runner/getColorsEnv.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAE9C,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEjD,SAAS,YAAY,CAAC,KAAc,EAAE,SAAS,GAAG,CAAC;IAClD,OAAO;QACN,SAAS,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,KAAK,IAAI,SAAS;QAChD,KAAK;KACL,CAAC;AACH,CAAC;AAED,QAAQ,CAAC,YAAY,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,4CAA4C,EAAE,GAAG,EAAE;QACrD,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAE1D,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QACjE,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;QAEhD,MAAM,CAAC,MAAM,CAAC,CAAC,aAAa,EAAE,CAAC;IAChC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QAClE,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;QAEpD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC3D,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAExD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QAClE,MAAM,MAAM,GAAG,YAAY,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QAEzD,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bingo-systems",
3
- "version": "0.5.5",
3
+ "version": "0.6.0",
4
4
  "description": "File, network, and shell wrapper APIs used by Bingo. 🧰",
5
5
  "homepage": "https://www.create.bingo/build/packages/bingo-systems",
6
6
  "repository": {
@@ -28,7 +28,7 @@
28
28
  "@types/node": "24.10.1"
29
29
  },
30
30
  "engines": {
31
- "node": ">=18"
31
+ "node": ">=22"
32
32
  },
33
33
  "scripts": {
34
34
  "build": "tsc"