@o3co/create-auth-policy-verifier 0.3.1 → 0.4.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,213 +0,0 @@
1
- // SPDX-FileCopyrightText: 2026 1o1 Co. Ltd.
2
- // SPDX-License-Identifier: Apache-2.0
3
- import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync } from "node:fs";
4
- import { tmpdir } from "node:os";
5
- import { join } from "node:path";
6
- import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
7
- import { isValidDirName, isValidProjectName, main, scaffold } from "../index.mjs";
8
- describe("scaffold", () => {
9
- let tempDir;
10
- beforeEach(() => {
11
- tempDir = mkdtempSync(join(tmpdir(), "create-policy-verifier-test-"));
12
- });
13
- afterEach(() => {
14
- rmSync(tempDir, { recursive: true, force: true });
15
- });
16
- it("copies template files to target directory", () => {
17
- const targetDir = join(tempDir, "verifier");
18
- scaffold(targetDir, "verifier");
19
- expect(existsSync(join(targetDir, "package.json"))).toBe(true);
20
- expect(existsSync(join(targetDir, "tsconfig.json"))).toBe(true);
21
- expect(existsSync(join(targetDir, "src", "main.mts"))).toBe(true);
22
- expect(existsSync(join(targetDir, "config", "application.conf"))).toBe(true);
23
- });
24
- it("rewrites package.json name to project name", () => {
25
- const targetDir = join(tempDir, "verifier");
26
- scaffold(targetDir, "verifier");
27
- const pkg = JSON.parse(readFileSync(join(targetDir, "package.json"), "utf-8"));
28
- expect(pkg.name).toBe("verifier");
29
- });
30
- it("replaces all workspace:* dependencies with caret versions", () => {
31
- const targetDir = join(tempDir, "verifier");
32
- scaffold(targetDir, "verifier");
33
- const pkg = JSON.parse(readFileSync(join(targetDir, "package.json"), "utf-8"));
34
- for (const section of ["dependencies", "devDependencies", "peerDependencies"]) {
35
- const deps = pkg[section];
36
- if (!deps)
37
- continue;
38
- for (const [name, version] of Object.entries(deps)) {
39
- expect(version, `${section}.${name} should not be workspace:*`).not.toBe("workspace:*");
40
- }
41
- }
42
- });
43
- it("removes private field from package.json", () => {
44
- const targetDir = join(tempDir, "verifier");
45
- scaffold(targetDir, "verifier");
46
- const pkg = JSON.parse(readFileSync(join(targetDir, "package.json"), "utf-8"));
47
- expect(pkg.private).toBeUndefined();
48
- });
49
- it("writes scoped project name verbatim into package.json", () => {
50
- const targetDir = join(tempDir, "auth.policy-verifier");
51
- scaffold(targetDir, "@piratis-blossoms/auth.policy-verifier");
52
- const pkg = JSON.parse(readFileSync(join(targetDir, "package.json"), "utf-8"));
53
- expect(pkg.name).toBe("@piratis-blossoms/auth.policy-verifier");
54
- });
55
- });
56
- describe("isValidProjectName", () => {
57
- it.each([
58
- ["my-verifier"],
59
- ["auth.policy-verifier"],
60
- ["a"],
61
- ["foo_bar~baz.1"],
62
- ["@piratis-blossoms/auth.policy-verifier"],
63
- ["@foo-bar/baz_qux~1"],
64
- ])("accepts %s", (name) => {
65
- expect(isValidProjectName(name)).toBe(true);
66
- });
67
- it.each([
68
- [""],
69
- ["."],
70
- [".."],
71
- ["UPPER"],
72
- ["with space"],
73
- ["with/slash"],
74
- ["with\\back"],
75
- ["@"],
76
- ["@/"],
77
- ["@scope"],
78
- ["@/pkg"],
79
- ["@scope/"],
80
- ["@scope//pkg"],
81
- ["@SCOPE/pkg"],
82
- ["a".repeat(215)],
83
- ])("rejects %s", (name) => {
84
- expect(isValidProjectName(name)).toBe(false);
85
- });
86
- });
87
- describe("isValidDirName", () => {
88
- it.each([
89
- ["my-verifier"],
90
- ["auth.policy-verifier"],
91
- ["a"],
92
- ["foo_bar~baz.1"],
93
- ])("accepts %s", (name) => {
94
- expect(isValidDirName(name)).toBe(true);
95
- });
96
- it.each([
97
- [""],
98
- ["."],
99
- [".."],
100
- ["@scope/pkg"],
101
- ["with/slash"],
102
- ["with\\back"],
103
- ["@piratis-blossoms"],
104
- ["UPPER"],
105
- ["a".repeat(215)],
106
- ])("rejects %s", (name) => {
107
- expect(isValidDirName(name)).toBe(false);
108
- });
109
- });
110
- describe("main (argv parsing and directory derivation)", () => {
111
- let cwdBackup;
112
- let workdir;
113
- let argvBackup;
114
- beforeEach(() => {
115
- cwdBackup = process.cwd();
116
- workdir = mkdtempSync(join(tmpdir(), "create-policy-verifier-main-"));
117
- process.chdir(workdir);
118
- argvBackup = process.argv;
119
- });
120
- afterEach(() => {
121
- process.chdir(cwdBackup);
122
- process.argv = argvBackup;
123
- rmSync(workdir, { recursive: true, force: true });
124
- });
125
- const runMain = (args) => {
126
- process.argv = ["node", "cli", ...args];
127
- const exitSpy = vi.spyOn(process, "exit").mockImplementation(((code) => {
128
- throw new Error(`__exit__:${code ?? 0}`);
129
- }));
130
- const errSpy = vi.spyOn(console, "error").mockImplementation(() => { });
131
- const logSpy = vi.spyOn(console, "log").mockImplementation(() => { });
132
- let exitCode = 0;
133
- try {
134
- main();
135
- }
136
- catch (e) {
137
- const m = /__exit__:(\d+)/.exec(e.message);
138
- exitCode = m ? Number(m[1]) : null;
139
- }
140
- const stderr = errSpy.mock.calls.map((c) => c.join(" ")).join("\n");
141
- exitSpy.mockRestore();
142
- errSpy.mockRestore();
143
- logSpy.mockRestore();
144
- return { exitCode, stderr };
145
- };
146
- it("unscoped name: dir = name, pkg.name = name", () => {
147
- const r = runMain(["my-verifier"]);
148
- expect(r.exitCode).toBe(0);
149
- const pkg = JSON.parse(readFileSync(join(workdir, "my-verifier", "package.json"), "utf-8"));
150
- expect(pkg.name).toBe("my-verifier");
151
- });
152
- it("scoped name: dir = pkg part, pkg.name = full scoped", () => {
153
- const r = runMain(["@piratis-blossoms/auth.policy-verifier"]);
154
- expect(r.exitCode).toBe(0);
155
- const pkg = JSON.parse(readFileSync(join(workdir, "auth.policy-verifier", "package.json"), "utf-8"));
156
- expect(pkg.name).toBe("@piratis-blossoms/auth.policy-verifier");
157
- });
158
- it("scoped name with --dir <val>: dir = val, pkg.name = full scoped", () => {
159
- const r = runMain(["@piratis-blossoms/auth.policy-verifier", "--dir", "verifier"]);
160
- expect(r.exitCode).toBe(0);
161
- const pkg = JSON.parse(readFileSync(join(workdir, "verifier", "package.json"), "utf-8"));
162
- expect(pkg.name).toBe("@piratis-blossoms/auth.policy-verifier");
163
- });
164
- it("scoped name with --dir=<val>: dir = val, pkg.name = full scoped", () => {
165
- const r = runMain(["@piratis-blossoms/auth.policy-verifier", "--dir=verifier2"]);
166
- expect(r.exitCode).toBe(0);
167
- const pkg = JSON.parse(readFileSync(join(workdir, "verifier2", "package.json"), "utf-8"));
168
- expect(pkg.name).toBe("@piratis-blossoms/auth.policy-verifier");
169
- });
170
- it("unscoped name with --dir <val>: dir = val, pkg.name = unscoped", () => {
171
- const r = runMain(["my-verifier", "--dir", "custom"]);
172
- expect(r.exitCode).toBe(0);
173
- const pkg = JSON.parse(readFileSync(join(workdir, "custom", "package.json"), "utf-8"));
174
- expect(pkg.name).toBe("my-verifier");
175
- });
176
- it("flags before positional: --dir custom my-verifier", () => {
177
- const r = runMain(["--dir", "custom", "my-verifier"]);
178
- expect(r.exitCode).toBe(0);
179
- const pkg = JSON.parse(readFileSync(join(workdir, "custom", "package.json"), "utf-8"));
180
- expect(pkg.name).toBe("my-verifier");
181
- });
182
- it.each([
183
- { case: "no args", args: [] },
184
- { case: "two positionals", args: ["foo", "bar"] },
185
- { case: "dot", args: ["."] },
186
- { case: "dotdot", args: [".."] },
187
- { case: "backslash in name", args: ["back\\slash"] },
188
- { case: "empty scope", args: ["@/pkg"] },
189
- { case: "empty pkg", args: ["@scope/"] },
190
- { case: "double slash", args: ["@scope//pkg"] },
191
- { case: "name too long", args: ["a".repeat(215)] },
192
- { case: "--dir invalid (dot)", args: ["foo", "--dir", "."] },
193
- { case: "--dir invalid (slash)", args: ["foo", "--dir", "a/b"] },
194
- { case: "--dir invalid (at)", args: ["foo", "--dir", "@foo"] },
195
- { case: "--dir invalid (back)", args: ["foo", "--dir", "a\\b"] },
196
- { case: "--dir empty space form", args: ["foo", "--dir", ""] },
197
- { case: "--dir empty equals form", args: ["foo", "--dir="] },
198
- { case: "--dir missing value", args: ["foo", "--dir"] },
199
- { case: "--dir duplicated", args: ["foo", "--dir", "a", "--dir", "b"] },
200
- { case: "unknown flag", args: ["foo", "--unknown"] },
201
- { case: "literal double-dash", args: ["foo", "--"] },
202
- ])("rejects: $case", ({ args }) => {
203
- const r = runMain(args);
204
- expect(r.exitCode).toBe(1);
205
- expect(r.stderr.length).toBeGreaterThan(0);
206
- });
207
- it("target directory already exists", () => {
208
- mkdirSync(join(workdir, "foo"));
209
- const r = runMain(["foo"]);
210
- expect(r.exitCode).toBe(1);
211
- expect(r.stderr.length).toBeGreaterThan(0);
212
- });
213
- });