@shivaedev/quality 0.26.0 → 0.27.1
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.
- package/CHANGELOG.md +22 -0
- package/README.md +10 -3
- package/dist/biome/run.d.ts.map +1 -1
- package/dist/biome/run.js +15 -2
- package/dist/biome/run.js.map +1 -1
- package/dist/cli/args.d.ts +3 -1
- package/dist/cli/args.d.ts.map +1 -1
- package/dist/cli/args.js +3 -0
- package/dist/cli/args.js.map +1 -1
- package/dist/cli/messages.d.ts +1 -1
- package/dist/cli/messages.d.ts.map +1 -1
- package/dist/cli/messages.js +3 -1
- package/dist/cli/messages.js.map +1 -1
- package/dist/cli/program.d.ts.map +1 -1
- package/dist/cli/program.js +3 -0
- package/dist/cli/program.js.map +1 -1
- package/dist/domEnvironment.config.d.ts +4 -0
- package/dist/domEnvironment.config.d.ts.map +1 -0
- package/dist/domEnvironment.config.js +17 -0
- package/dist/domEnvironment.config.js.map +1 -0
- package/dist/hooks/install.d.ts.map +1 -1
- package/dist/hooks/install.js +9 -8
- package/dist/hooks/install.js.map +1 -1
- package/dist/hooks/shim.d.ts.map +1 -1
- package/dist/hooks/shim.js +11 -1
- package/dist/hooks/shim.js.map +1 -1
- package/dist/hooks/status.d.ts +6 -0
- package/dist/hooks/status.d.ts.map +1 -0
- package/dist/hooks/status.js +45 -0
- package/dist/hooks/status.js.map +1 -0
- package/dist/hooks/uninstall.d.ts.map +1 -1
- package/dist/hooks/uninstall.js +6 -0
- package/dist/hooks/uninstall.js.map +1 -1
- package/dist/inventory/collect.d.ts.map +1 -1
- package/dist/inventory/collect.js +3 -0
- package/dist/inventory/collect.js.map +1 -1
- package/dist/inventory/shadcnAlias.d.ts +2 -0
- package/dist/inventory/shadcnAlias.d.ts.map +1 -0
- package/dist/inventory/shadcnAlias.js +73 -0
- package/dist/inventory/shadcnAlias.js.map +1 -0
- package/dist/inventory/shadcnFolders.d.ts +4 -0
- package/dist/inventory/shadcnFolders.d.ts.map +1 -0
- package/dist/inventory/shadcnFolders.js +25 -0
- package/dist/inventory/shadcnFolders.js.map +1 -0
- package/dist/naming/migrationFile.d.ts +4 -0
- package/dist/naming/migrationFile.d.ts.map +1 -0
- package/dist/naming/migrationFile.js +8 -0
- package/dist/naming/migrationFile.js.map +1 -0
- package/dist/rules/files/folderNames.d.ts.map +1 -1
- package/dist/rules/files/folderNames.js +1 -2
- package/dist/rules/files/folderNames.js.map +1 -1
- package/dist/rules/files/namedAfterExport.d.ts.map +1 -1
- package/dist/rules/files/namedAfterExport.js +4 -1
- package/dist/rules/files/namedAfterExport.js.map +1 -1
- package/dist/rules/files/otherNames.js +1 -1
- package/dist/rules/files/otherNames.js.map +1 -1
- package/dist/testProjects.d.ts +4 -1
- package/dist/testProjects.d.ts.map +1 -1
- package/dist/testProjects.js +23 -3
- package/dist/testProjects.js.map +1 -1
- package/docs/debt-and-hooks.md +4 -2
- package/package.json +6 -2
- package/src/biome/run.ts +16 -2
- package/src/cli/args.ts +4 -0
- package/src/cli/messages.ts +3 -1
- package/src/cli/program.ts +3 -0
- package/src/domEnvironment.config.ts +13 -0
- package/src/hooks/install.ts +11 -12
- package/src/hooks/shim.ts +11 -1
- package/src/hooks/status.ts +50 -0
- package/src/hooks/uninstall.ts +6 -0
- package/src/inventory/collect.ts +3 -0
- package/src/inventory/shadcnAlias.ts +88 -0
- package/src/inventory/shadcnFolders.ts +30 -0
- package/src/naming/migrationFile.ts +9 -0
- package/src/rules/files/folderNames.ts +1 -3
- package/src/rules/files/namedAfterExport.ts +4 -1
- package/src/rules/files/otherNames.ts +1 -1
- package/src/testProjects.ts +27 -3
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { dirname, isAbsolute, join, resolve } from "node:path";
|
|
2
|
+
import ts from "typescript";
|
|
3
|
+
const PROBE = "__quality_shadcn__.tsx";
|
|
4
|
+
function capture(pattern, alias) {
|
|
5
|
+
const star = pattern.indexOf("*");
|
|
6
|
+
if (star === -1) {
|
|
7
|
+
return pattern === alias ? "" : undefined;
|
|
8
|
+
}
|
|
9
|
+
const prefix = pattern.slice(0, star);
|
|
10
|
+
const suffix = pattern.slice(star + 1);
|
|
11
|
+
return alias.startsWith(prefix) && alias.endsWith(suffix)
|
|
12
|
+
? alias.slice(prefix.length, suffix.length === 0 ? undefined : -suffix.length)
|
|
13
|
+
: undefined;
|
|
14
|
+
}
|
|
15
|
+
function pathTarget(alias, options, directory) {
|
|
16
|
+
const pathsBase = Reflect.get(options, "pathsBasePath");
|
|
17
|
+
const base = options.baseUrl ?? (typeof pathsBase === "string" ? pathsBase : directory);
|
|
18
|
+
const patterns = Object.entries(options.paths ?? {}).toSorted(([left], [right]) => right.indexOf("*") - left.indexOf("*"));
|
|
19
|
+
const exact = options.paths?.[alias]?.[0];
|
|
20
|
+
if (exact !== undefined) {
|
|
21
|
+
return resolve(base, exact);
|
|
22
|
+
}
|
|
23
|
+
for (const [pattern, targets] of patterns) {
|
|
24
|
+
const captured = capture(pattern, alias);
|
|
25
|
+
const target = targets[0];
|
|
26
|
+
if (captured !== undefined && target !== undefined) {
|
|
27
|
+
return resolve(base, target.replace("*", captured));
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
32
|
+
export function shadcnAlias(directory, alias) {
|
|
33
|
+
if (alias.startsWith(".") || isAbsolute(alias)) {
|
|
34
|
+
return resolve(directory, alias);
|
|
35
|
+
}
|
|
36
|
+
const config = ts.findConfigFile(directory, ts.sys.fileExists);
|
|
37
|
+
const parsed = config === undefined
|
|
38
|
+
? undefined
|
|
39
|
+
: ts.getParsedCommandLineOfConfigFile(config, {}, {
|
|
40
|
+
...ts.sys,
|
|
41
|
+
onUnRecoverableConfigFileDiagnostic: () => undefined,
|
|
42
|
+
});
|
|
43
|
+
if (parsed?.errors.length) {
|
|
44
|
+
throw new Error(ts.formatDiagnostics(parsed.errors, {
|
|
45
|
+
getCanonicalFileName: (file) => file,
|
|
46
|
+
getCurrentDirectory: () => directory,
|
|
47
|
+
getNewLine: () => "\n",
|
|
48
|
+
}));
|
|
49
|
+
}
|
|
50
|
+
const options = parsed?.options ?? {};
|
|
51
|
+
const target = pathTarget(alias, options, config === undefined ? directory : dirname(config));
|
|
52
|
+
if (target !== undefined) {
|
|
53
|
+
return target;
|
|
54
|
+
}
|
|
55
|
+
if (!alias.startsWith("#")) {
|
|
56
|
+
throw new Error(`Cannot resolve shadcn UI alias "${alias}" from ${directory}. Check tsconfig paths.`);
|
|
57
|
+
}
|
|
58
|
+
// A synthetic child lets TypeScript resolve directory aliases through package imports without requiring a stock component to exist.
|
|
59
|
+
const resolved = ts.resolveModuleName(`${alias}/${PROBE}`, join(directory, "components.tsx"), {
|
|
60
|
+
...options,
|
|
61
|
+
customConditions: ["source", ...(options.customConditions ?? [])],
|
|
62
|
+
moduleResolution: ts.ModuleResolutionKind.Bundler,
|
|
63
|
+
}, {
|
|
64
|
+
...ts.sys,
|
|
65
|
+
directoryExists: () => true,
|
|
66
|
+
fileExists: (file) => file.endsWith(`/${PROBE}`) || ts.sys.fileExists(file),
|
|
67
|
+
}).resolvedModule;
|
|
68
|
+
if (resolved === undefined) {
|
|
69
|
+
throw new Error(`Cannot resolve shadcn UI alias "${alias}" from ${directory}. Check tsconfig paths or package imports.`);
|
|
70
|
+
}
|
|
71
|
+
return dirname(resolved.resolvedFileName);
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=shadcnAlias.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shadcnAlias.js","sourceRoot":"","sources":["../../src/inventory/shadcnAlias.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,KAAK,GAAG,wBAAwB,CAAC;AAEvC,SAAS,OAAO,CAAC,OAAe,EAAE,KAAa;IAC9C,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,OAAO,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC3C,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IACvC,OAAO,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC;QACxD,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC;QAC9E,CAAC,CAAC,SAAS,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CAAC,KAAa,EAAE,OAA2B,EAAE,SAAiB;IAChF,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,IAAI,CAAC,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;IACxF,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3H,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IACD,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,QAAQ,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,QAAQ,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACpD,OAAO,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC;QACrD,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,SAAiB,EAAE,KAAa;IAC3D,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAChD,OAAO,OAAO,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,MAAM,GAAG,EAAE,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC/D,MAAM,MAAM,GACX,MAAM,KAAK,SAAS;QACnB,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,EAAE,CAAC,gCAAgC,CACnC,MAAM,EACN,EAAE,EACF;YACC,GAAG,EAAE,CAAC,GAAG;YACT,mCAAmC,EAAE,GAAG,EAAE,CAAC,SAAS;SACpD,CACD,CAAC;IACL,IAAI,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CACd,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,EAAE;YACnC,oBAAoB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI;YACpC,mBAAmB,EAAE,GAAG,EAAE,CAAC,SAAS;YACpC,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI;SACtB,CAAC,CACF,CAAC;IACH,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;IACtC,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAC9F,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC;IACf,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,UAAU,SAAS,yBAAyB,CAAC,CAAC;IACvG,CAAC;IACD,oIAAoI;IACpI,MAAM,QAAQ,GAAG,EAAE,CAAC,iBAAiB,CACpC,GAAG,KAAK,IAAI,KAAK,EAAE,EACnB,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,EACjC;QACC,GAAG,OAAO;QACV,gBAAgB,EAAE,CAAC,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;QACjE,gBAAgB,EAAE,EAAE,CAAC,oBAAoB,CAAC,OAAO;KACjD,EACD;QACC,GAAG,EAAE,CAAC,GAAG;QACT,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI;QAC3B,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;KAC3E,CACD,CAAC,cAAc,CAAC;IACjB,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,mCAAmC,KAAK,UAAU,SAAS,4CAA4C,CAAC,CAAC;IAC1H,CAAC;IACD,OAAO,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { Effect, type FileSystem } from "effect";
|
|
2
|
+
import { FilesystemFailure } from "./filesystem.ts";
|
|
3
|
+
export declare const shadcnFolders: (root: string) => Effect.Effect<readonly string[], FilesystemFailure, FileSystem.FileSystem>;
|
|
4
|
+
//# sourceMappingURL=shadcnFolders.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shadcnFolders.d.ts","sourceRoot":"","sources":["../../src/inventory/shadcnFolders.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,KAAK,UAAU,EAAU,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAoB,MAAM,iBAAiB,CAAC;AAOtE,eAAO,MAAM,aAAa,8FAoBxB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { basename, dirname, relative } from "node:path";
|
|
2
|
+
import { Effect, Schema } from "effect";
|
|
3
|
+
import { FilesystemFailure, readRequiredText } from "./filesystem.js";
|
|
4
|
+
import { posix } from "./ignoreScope.js";
|
|
5
|
+
import { shadcnAlias } from "./shadcnAlias.js";
|
|
6
|
+
import { walk } from "./walk.js";
|
|
7
|
+
const Components = Schema.fromJsonString(Schema.Struct({ aliases: Schema.Struct({ ui: Schema.NonEmptyString }) }));
|
|
8
|
+
export const shadcnFolders = Effect.fn("Inventory.shadcnFolders")(function* (root) {
|
|
9
|
+
const paths = (yield* walk(root)).filter((path) => basename(path) === "components.json");
|
|
10
|
+
return yield* Effect.forEach(paths, (path) => Effect.gen(function* () {
|
|
11
|
+
const text = yield* readRequiredText(path);
|
|
12
|
+
return yield* Effect.try({
|
|
13
|
+
catch: (cause) => new FilesystemFailure({ message: `cannot resolve ${path}: ${String(cause)}`, path }),
|
|
14
|
+
try: () => {
|
|
15
|
+
const { aliases } = Schema.decodeUnknownSync(Components)(text);
|
|
16
|
+
const folder = posix(relative(root, shadcnAlias(dirname(path), aliases.ui)));
|
|
17
|
+
if (folder === "" || folder === ".." || folder.startsWith("../")) {
|
|
18
|
+
throw new Error("the shadcn UI folder must be inside the repository and cannot be its root");
|
|
19
|
+
}
|
|
20
|
+
return folder;
|
|
21
|
+
},
|
|
22
|
+
});
|
|
23
|
+
}));
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=shadcnFolders.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"shadcnFolders.js","sourceRoot":"","sources":["../../src/inventory/shadcnFolders.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,EAAE,MAAM,EAAmB,MAAM,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,UAAU,GAAG,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,cAAc,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AAEnH,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC,EAAE,CAAC,yBAAyB,CAAC,CAAC,QAAQ,CAAC,EAC1E,IAAY;IAEZ,MAAM,KAAK,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,iBAAiB,CAAC,CAAC;IACzF,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,EAAE,CAC5C,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACnB,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;QAC3C,OAAO,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;YACxB,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,iBAAiB,CAAC,EAAE,OAAO,EAAE,kBAAkB,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC;YACtG,GAAG,EAAE,GAAG,EAAE;gBACT,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC/D,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBAC7E,IAAI,MAAM,KAAK,EAAE,IAAI,MAAM,KAAK,IAAI,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;oBAClE,MAAM,IAAI,KAAK,CAAC,2EAA2E,CAAC,CAAC;gBAC9F,CAAC;gBACD,OAAO,MAAM,CAAC;YACf,CAAC;SACD,CAAC,CAAC;IACJ,CAAC,CAAC,CACF,CAAC;AACH,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrationFile.d.ts","sourceRoot":"","sources":["../../src/naming/migrationFile.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,oBAAoB,0BAA0B,CAAC;AAC5D,eAAO,MAAM,sBAAsB,QAAkD,CAAC;AAEtF,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGrD"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { posix } from "node:path";
|
|
2
|
+
export const MIGRATIONS_DIRECTORY = "src/server/migrations";
|
|
3
|
+
export const MIGRATION_FILE_PATTERN = /^[0-9]{4}_[a-z][a-z0-9]*(?:_[a-z0-9]+)*\.ts$/u;
|
|
4
|
+
export function isMigrationFile(path) {
|
|
5
|
+
const directory = posix.dirname(path);
|
|
6
|
+
return (directory === MIGRATIONS_DIRECTORY || directory.endsWith(`/${MIGRATIONS_DIRECTORY}`)) && MIGRATION_FILE_PATTERN.test(posix.basename(path));
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=migrationFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"migrationFile.js","sourceRoot":"","sources":["../../src/naming/migrationFile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAElC,MAAM,CAAC,MAAM,oBAAoB,GAAG,uBAAuB,CAAC;AAC5D,MAAM,CAAC,MAAM,sBAAsB,GAAG,+CAA+C,CAAC;AAEtF,MAAM,UAAU,eAAe,CAAC,IAAY;IAC3C,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,OAAO,CAAC,SAAS,KAAK,oBAAoB,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC,IAAI,sBAAsB,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;AACpJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"folderNames.d.ts","sourceRoot":"","sources":["../../../src/rules/files/folderNames.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"folderNames.d.ts","sourceRoot":"","sources":["../../../src/rules/files/folderNames.ts"],"names":[],"mappings":"AAuEA,eAAO,MAAM,WAAW;;;EAkBtB,CAAC"}
|
|
@@ -4,12 +4,11 @@ import ignore, {} from "ignore";
|
|
|
4
4
|
import { packageLayout } from "#naming/packageLayout.ts";
|
|
5
5
|
import { KEBAB, PASCAL } from "#naming/words.ts";
|
|
6
6
|
import { defineRule } from "#rule.ts";
|
|
7
|
-
const DEFAULT_TOOL_OWNED = ["migrations/"];
|
|
8
7
|
const SNAKE = /^[a-z0-9]+(?:_[a-z0-9]+)*$/u;
|
|
9
8
|
const CODE = /\.[cm]?[jt]sx?$/u;
|
|
10
9
|
const FolderNamesOptions = Schema.Struct({
|
|
11
10
|
content: Schema.Array(Schema.String).pipe(Schema.withDecodingDefaultKey(Effect.succeed([]))),
|
|
12
|
-
toolOwned: Schema.Array(Schema.String).pipe(Schema.withDecodingDefaultKey(Effect.succeed(
|
|
11
|
+
toolOwned: Schema.Array(Schema.String).pipe(Schema.withDecodingDefaultKey(Effect.succeed([]))),
|
|
13
12
|
});
|
|
14
13
|
function foldersIn(files) {
|
|
15
14
|
const folders = new Set();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"folderNames.js","sourceRoot":"","sources":["../../../src/rules/files/folderNames.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,MAAM,EAAE,EAAe,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAgB,MAAM,UAAU,CAAC;AAEpD,MAAM,
|
|
1
|
+
{"version":3,"file":"folderNames.js","sourceRoot":"","sources":["../../../src/rules/files/folderNames.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"namedAfterExport.d.ts","sourceRoot":"","sources":["../../../src/rules/files/namedAfterExport.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"namedAfterExport.d.ts","sourceRoot":"","sources":["../../../src/rules/files/namedAfterExport.ts"],"names":[],"mappings":"AAqFA,eAAO,MAAM,gBAAgB;;EAY3B,CAAC"}
|
|
@@ -3,6 +3,7 @@ import { Effect, Schema } from "effect";
|
|
|
3
3
|
import ignore from "ignore";
|
|
4
4
|
import { exportFits } from "#naming/exportFits.ts";
|
|
5
5
|
import { mainExport } from "#naming/mainExport.ts";
|
|
6
|
+
import { isMigrationFile } from "#naming/migrationFile.ts";
|
|
6
7
|
import { ownExports } from "#naming/ownExports.ts";
|
|
7
8
|
import { packageLayout } from "#naming/packageLayout.ts";
|
|
8
9
|
import { CAMEL, KEBAB, sameWord, wordsOf } from "#naming/words.ts";
|
|
@@ -75,7 +76,9 @@ export const namedAfterExport = defineRule({
|
|
|
75
76
|
check: async ({ files, options, readText, sources }) => {
|
|
76
77
|
const layout = await packageLayout({ files, readText });
|
|
77
78
|
const toolOwned = ignore().add([...options.toolOwned]);
|
|
78
|
-
return sources
|
|
79
|
+
return sources
|
|
80
|
+
.filter((file) => !(TEST.test(file.path) || isMigrationFile(file.path) || toolOwned.ignores(file.path)))
|
|
81
|
+
.flatMap((file) => findingsOf(file, layout));
|
|
79
82
|
},
|
|
80
83
|
description: "A file is named after its main export, with its folders as the prefix; a file of several exports is a camelCase topic file, and a script is kebab-case. Rename the file or the export; nothing renames them for you.",
|
|
81
84
|
id: "files/named-after-export",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"namedAfterExport.js","sourceRoot":"","sources":["../../../src/rules/files/namedAfterExport.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"namedAfterExport.js","sourceRoot":"","sources":["../../../src/rules/files/namedAfterExport.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,7 @@ import ignore, {} from "ignore";
|
|
|
4
4
|
import { CAMEL, KEBAB } from "#naming/words.ts";
|
|
5
5
|
import { defineRule } from "#rule.ts";
|
|
6
6
|
import { stylesheetImporters } from "./stylesheetImporters.js";
|
|
7
|
-
const DEFAULT_TOOL_OWNED = [".*", "package.json", "tsconfig*.json", "biome.json", "biome.jsonc", "*.config.*"
|
|
7
|
+
const DEFAULT_TOOL_OWNED = [".*", "package.json", "tsconfig*.json", "biome.json", "biome.jsonc", "*.config.*"];
|
|
8
8
|
const CONVENTIONAL = new Set(["AGENTS", "CHANGELOG", "CLAUDE", "CONTRIBUTING", "LICENSE", "README", "SECURITY", "SKILL"]);
|
|
9
9
|
const KEBAB_KINDS = new Set([
|
|
10
10
|
"avif",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"otherNames.js","sourceRoot":"","sources":["../../../src/rules/files/otherNames.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,MAAM,EAAE,EAAe,MAAM,QAAQ,CAAC;AAC7C,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAgB,MAAM,UAAU,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,MAAM,kBAAkB,GAAsB,CAAC,IAAI,EAAE,cAAc,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"otherNames.js","sourceRoot":"","sources":["../../../src/rules/files/otherNames.ts"],"names":[],"mappings":"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"}
|
package/dist/testProjects.d.ts
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
1
|
import { type TestUserConfig } from "vitest/config";
|
|
2
|
-
export
|
|
2
|
+
export interface TestProjectsOptions {
|
|
3
|
+
readonly coverage?: boolean | NonNullable<TestUserConfig["coverage"]>;
|
|
4
|
+
}
|
|
5
|
+
export declare function testProjects({ coverage }?: TestProjectsOptions): TestUserConfig;
|
|
3
6
|
//# sourceMappingURL=testProjects.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testProjects.d.ts","sourceRoot":"","sources":["../src/testProjects.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"testProjects.d.ts","sourceRoot":"","sources":["../src/testProjects.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0C,KAAK,cAAc,EAAE,MAAM,eAAe,CAAC;AAe5F,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,GAAG,WAAW,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC;CACtE;AAED,wBAAgB,YAAY,CAAC,EAAE,QAAgB,EAAE,GAAE,mBAAwB,GAAG,cAAc,CAgC3F"}
|
package/dist/testProjects.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import { fileURLToPath } from "node:url";
|
|
1
2
|
import { Config, ConfigProvider, Effect } from "effect";
|
|
2
|
-
import { defaultExclude } from "vitest/config";
|
|
3
|
+
import { coverageConfigDefaults, defaultExclude } from "vitest/config";
|
|
3
4
|
const EXTENSION = "?(c|m)[jt]s?(x)";
|
|
4
5
|
const TYPECHECK_ALONE = `**/typecheck.test.${EXTENSION}`;
|
|
5
6
|
function named(environment) {
|
|
@@ -8,13 +9,32 @@ function named(environment) {
|
|
|
8
9
|
function excluding(...patterns) {
|
|
9
10
|
return [...defaultExclude, named("typecheck"), TYPECHECK_ALONE, ...patterns];
|
|
10
11
|
}
|
|
11
|
-
export function testProjects() {
|
|
12
|
+
export function testProjects({ coverage = false } = {}) {
|
|
12
13
|
const ci = Effect.runSync(Config.String("CI").pipe(Config.withDefault("")).parse(ConfigProvider.fromEnv()));
|
|
13
14
|
return {
|
|
15
|
+
...(coverage === false
|
|
16
|
+
? {}
|
|
17
|
+
: {
|
|
18
|
+
coverage: {
|
|
19
|
+
enabled: true,
|
|
20
|
+
exclude: [...coverageConfigDefaults.exclude, "**/*.d.ts", "**/*.test.*", "**/*.spec.*", "**/test-support/**"],
|
|
21
|
+
include: ["src/**/*.{ts,tsx}"],
|
|
22
|
+
provider: "v8",
|
|
23
|
+
...(coverage === true ? {} : coverage),
|
|
24
|
+
},
|
|
25
|
+
}),
|
|
14
26
|
project: ["unit", "dom"],
|
|
15
27
|
projects: [
|
|
16
28
|
{ extends: true, test: { environment: "node", exclude: excluding(named("dom"), named("slow")), include: [named()], name: "unit" } },
|
|
17
|
-
{
|
|
29
|
+
{
|
|
30
|
+
extends: true,
|
|
31
|
+
test: {
|
|
32
|
+
environment: fileURLToPath(import.meta.resolve("#domEnvironment.config.ts")),
|
|
33
|
+
exclude: excluding(named("slow")),
|
|
34
|
+
include: [named("dom")],
|
|
35
|
+
name: "dom",
|
|
36
|
+
},
|
|
37
|
+
},
|
|
18
38
|
{ extends: true, test: { environment: "node", exclude: excluding(), include: [named("slow")], name: "slow" } },
|
|
19
39
|
],
|
|
20
40
|
silent: ci ? false : "passed-only",
|
package/dist/testProjects.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testProjects.js","sourceRoot":"","sources":["../src/testProjects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxD,OAAO,EAAE,cAAc,EAAuB,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"testProjects.js","sourceRoot":"","sources":["../src/testProjects.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACxD,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAuB,MAAM,eAAe,CAAC;AAG5F,MAAM,SAAS,GAAG,iBAAiB,CAAC;AAEpC,MAAM,eAAe,GAAG,qBAAqB,SAAS,EAAE,CAAC;AAEzD,SAAS,KAAK,CAAC,WAAyB;IACvC,OAAO,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,qBAAqB,SAAS,EAAE,CAAC,CAAC,CAAC,QAAQ,WAAW,iBAAiB,SAAS,EAAE,CAAC;AACvH,CAAC;AAED,SAAS,SAAS,CAAC,GAAG,QAA2B;IAChD,OAAO,CAAC,GAAG,cAAc,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE,eAAe,EAAE,GAAG,QAAQ,CAAC,CAAC;AAC9E,CAAC;AAMD,MAAM,UAAU,YAAY,CAAC,EAAE,QAAQ,GAAG,KAAK,EAAE,GAAwB,EAAE;IAC1E,MAAM,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IAC5G,OAAO;QACN,GAAG,CAAC,QAAQ,KAAK,KAAK;YACrB,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC;gBACA,QAAQ,EAAE;oBACT,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,CAAC,GAAG,sBAAsB,CAAC,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,oBAAoB,CAAC;oBAC7G,OAAO,EAAE,CAAC,mBAAmB,CAAC;oBAC9B,QAAQ,EAAE,IAAI;oBACd,GAAG,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC;iBACtC;aACD,CAAC;QACJ,OAAO,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;QACxB,QAAQ,EAAE;YACT,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;YACnI;gBACC,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE;oBACL,WAAW,EAAE,aAAa,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;oBAC5E,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBACjC,OAAO,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBACvB,IAAI,EAAE,KAAK;iBACX;aACD;YACD,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE;SAC9G;QACD,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa;QAClC,+IAA+I;QAC/I,WAAW,EAAE,MAAM;KACnB,CAAC;AACH,CAAC"}
|
package/docs/debt-and-hooks.md
CHANGED
|
@@ -76,6 +76,8 @@ help: fix what the output above reports, then commit again; `quality hooks pre-c
|
|
|
76
76
|
|
|
77
77
|
The hook is a short script in the repository's common git directory, `.git/hooks/pre-commit`, which every worktree of the repository shares. It changes to the root of the worktree that commits, then to the config's folder in it, and runs that worktree's quality with that worktree's config, so a branch that changes the checks commits under its own rules. It runs quality the way `hooks install` ran: when that was a file inside the repository, such as a workspace's own source, it runs `node` with the same Node options on that file; otherwise it runs `node_modules/.bin/quality` in the config's folder. When that file does not exist, as in a new worktree whose dependencies are not installed yet, the hook blocks the commit and says to install them. A config file not named `quality.config.ts` is passed with `--config`.
|
|
78
78
|
|
|
79
|
-
`hooks install`
|
|
79
|
+
`hooks install` sets repository-local `core.hooksPath` to the common git directory's `hooks` folder and prints that path. It never changes global or system git configuration. At commit time, the hook reads global `core.hooksPath` and runs its executable `pre-commit` hook from the committing worktree's root, before Quality's checks. Relative global paths resolve from that root; a global path pointing to Quality's own hook is not chained. Quality still runs when the global hook fails, and either failure blocks the commit. Installation reports whether there is an executable global hook to chain.
|
|
80
80
|
|
|
81
|
-
|
|
81
|
+
`quality hooks status` reports whether git's effective hooks path runs an executable Quality pre-commit hook, and exits 1 with an installation hint when it does not. It also reports global chaining when Quality is active.
|
|
82
|
+
|
|
83
|
+
A pre-commit hook that quality did not write is kept: `hooks install` warns, says how to call quality from it, and exits 0 without setting the hooks path. `--force` replaces it. `quality hooks uninstall` removes quality's hook and keeps any other. It removes the repository-local hooks path only when that setting still points to Quality's hooks directory, letting global hooks take effect again.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@shivaedev/quality",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.27.1",
|
|
4
4
|
"description": "Repository quality gate with typed rules, a baseline of existing debt and a registry of reasoned exceptions",
|
|
5
5
|
"homepage": "https://github.com/ShivaeDev/platform/tree/main/packages/quality#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -32,8 +32,12 @@
|
|
|
32
32
|
"./tsconfig/base.json": "./tsconfig/base.json",
|
|
33
33
|
"./tsconfig/package.json": "./tsconfig/package.json",
|
|
34
34
|
"./package.json": "./package.json",
|
|
35
|
+
"./domEnvironment.config.ts": null,
|
|
35
36
|
"./imports/isTooling.ts": null,
|
|
36
|
-
"./rules/imports/bundleInputs.ts": null
|
|
37
|
+
"./rules/imports/bundleInputs.ts": null,
|
|
38
|
+
"./inventory/shadcnFolders.ts": null,
|
|
39
|
+
"./inventory/shadcnAlias.ts": null,
|
|
40
|
+
"./naming/migrationFile.ts": null
|
|
37
41
|
},
|
|
38
42
|
"bin": {
|
|
39
43
|
"quality": "./dist/cli.js"
|
package/src/biome/run.ts
CHANGED
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
import { execFile } from "node:child_process";
|
|
2
2
|
import { createRequire } from "node:module";
|
|
3
3
|
import process from "node:process";
|
|
4
|
+
import { NodeFileSystem } from "@effect/platform-node";
|
|
5
|
+
import { Effect } from "effect";
|
|
4
6
|
import type { ExceptionDeclaration } from "#exceptions/declaration.ts";
|
|
7
|
+
import { shadcnFolders } from "#inventory/shadcnFolders.ts";
|
|
5
8
|
import { withExceptionConfig } from "./exceptionConfig.ts";
|
|
6
9
|
|
|
7
10
|
export interface BiomeRun {
|
|
@@ -12,10 +15,21 @@ export interface BiomeRun {
|
|
|
12
15
|
|
|
13
16
|
const BIN = createRequire(import.meta.url).resolve("@biomejs/biome/bin/biome");
|
|
14
17
|
|
|
15
|
-
export function runBiome(root: string, args: readonly string[], exceptions: readonly ExceptionDeclaration[] = []): Promise<BiomeRun> {
|
|
18
|
+
export async function runBiome(root: string, args: readonly string[], exceptions: readonly ExceptionDeclaration[] = []): Promise<BiomeRun> {
|
|
19
|
+
const folders = await Effect.runPromise(shadcnFolders(root).pipe(Effect.provide(NodeFileSystem.layer)));
|
|
20
|
+
const toolOwned: readonly ExceptionDeclaration[] =
|
|
21
|
+
folders.length === 0
|
|
22
|
+
? []
|
|
23
|
+
: [
|
|
24
|
+
{
|
|
25
|
+
files: ["**", ...folders.map((folder) => `!${folder}`)],
|
|
26
|
+
reason: "components.json assigns these folders to the shadcn CLI.",
|
|
27
|
+
rules: ["biome/files/includes"],
|
|
28
|
+
},
|
|
29
|
+
];
|
|
16
30
|
return withExceptionConfig(
|
|
17
31
|
root,
|
|
18
|
-
exceptions,
|
|
32
|
+
[...exceptions, ...toolOwned],
|
|
19
33
|
(configArgs) =>
|
|
20
34
|
new Promise((resolve, reject) => {
|
|
21
35
|
execFile(process.execPath, [BIN, ...args, ...configArgs, "--colors=off"], { cwd: root, maxBuffer: 2 ** 30 }, (error, stdout, stderr) => {
|
package/src/cli/args.ts
CHANGED
|
@@ -12,6 +12,7 @@ export type Command =
|
|
|
12
12
|
| { readonly _tag: "BaselineMigrate"; readonly config: string | undefined; readonly from: string | undefined }
|
|
13
13
|
| { readonly _tag: "HooksInstall"; readonly config: string | undefined; readonly force: boolean }
|
|
14
14
|
| { readonly _tag: "HooksUninstall" }
|
|
15
|
+
| { readonly _tag: "HooksStatus" }
|
|
15
16
|
| { readonly _tag: "HooksPreCommit"; readonly config: string | undefined }
|
|
16
17
|
| { readonly _tag: "Help" };
|
|
17
18
|
|
|
@@ -52,6 +53,7 @@ const ACCEPTS: Readonly<Record<string, readonly Option[]>> = {
|
|
|
52
53
|
fix: [],
|
|
53
54
|
"hooks install": ["force"],
|
|
54
55
|
"hooks pre-commit": [],
|
|
56
|
+
"hooks status": [],
|
|
55
57
|
"hooks uninstall": [],
|
|
56
58
|
lint: [],
|
|
57
59
|
};
|
|
@@ -85,6 +87,8 @@ function commandFor(name: string, values: Values): Parsed {
|
|
|
85
87
|
return parsed({ _tag: "HooksInstall", config, force: values.force === true });
|
|
86
88
|
case "hooks uninstall":
|
|
87
89
|
return parsed({ _tag: "HooksUninstall" });
|
|
90
|
+
case "hooks status":
|
|
91
|
+
return parsed({ _tag: "HooksStatus" });
|
|
88
92
|
case "hooks pre-commit":
|
|
89
93
|
return parsed({ _tag: "HooksPreCommit", config });
|
|
90
94
|
default:
|
package/src/cli/messages.ts
CHANGED
|
@@ -8,6 +8,7 @@ export const USAGE = `Usage:
|
|
|
8
8
|
quality baseline migrate [--config <file>] [--from <file>]
|
|
9
9
|
quality hooks install [--config <file>] [--force]
|
|
10
10
|
quality hooks uninstall
|
|
11
|
+
quality hooks status
|
|
11
12
|
quality hooks pre-commit [--config <file>]
|
|
12
13
|
|
|
13
14
|
lint Run every rule. Exits 1 on an error-level violation, a file over its baseline, a stale registry entry
|
|
@@ -21,6 +22,7 @@ baseline migrate Move a baseline from the earlier JSON format (--from, quality/
|
|
|
21
22
|
hooks install Install the git pre-commit hook, shared by every worktree, that runs hooks pre-commit. Keeps a hook that is not quality's
|
|
22
23
|
unless --force replaces it.
|
|
23
24
|
hooks uninstall Remove quality's pre-commit hook. Keeps a hook that is not quality's.
|
|
25
|
+
hooks status Check that git's effective hooks path runs Quality's pre-commit hook and report global chaining.
|
|
24
26
|
hooks pre-commit What the hook runs: lint, then package.json scripts typecheck and quality:commit when present.
|
|
25
27
|
|
|
26
28
|
--config <file> Config file; its directory is the repository root. Without this option, uses ./quality.config.ts when present, otherwise defaults.
|
|
@@ -30,5 +32,5 @@ Exit codes: 0 passed, 1 failed the gate, 2 could not run.`;
|
|
|
30
32
|
export const SUBCOMMANDS: Readonly<Record<string, string>> = {
|
|
31
33
|
baseline: "baseline takes write, prune, tighten or migrate.",
|
|
32
34
|
exceptions: "exceptions takes migrate.",
|
|
33
|
-
hooks: "hooks takes install, uninstall or pre-commit.",
|
|
35
|
+
hooks: "hooks takes install, uninstall, status or pre-commit.",
|
|
34
36
|
};
|
package/src/cli/program.ts
CHANGED
|
@@ -10,6 +10,7 @@ import { SetupFailure } from "#failure.ts";
|
|
|
10
10
|
import type { Launch } from "#hooks/command.ts";
|
|
11
11
|
import { installHook } from "#hooks/install.ts";
|
|
12
12
|
import { preCommitHook } from "#hooks/preCommit.ts";
|
|
13
|
+
import { hookStatus } from "#hooks/status.ts";
|
|
13
14
|
import { uninstallHook } from "#hooks/uninstall.ts";
|
|
14
15
|
|
|
15
16
|
export interface Invocation {
|
|
@@ -44,6 +45,8 @@ export const program = Effect.fn("Cli.program")(function* (args: readonly string
|
|
|
44
45
|
return yield* installHook({ config: command.config, cwd, force: command.force, launch });
|
|
45
46
|
case "HooksUninstall":
|
|
46
47
|
return yield* uninstallHook(cwd);
|
|
48
|
+
case "HooksStatus":
|
|
49
|
+
return yield* hookStatus(cwd);
|
|
47
50
|
case "HooksPreCommit":
|
|
48
51
|
return yield* preCommitHook(cwd, command.config);
|
|
49
52
|
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createRequire } from "node:module";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import process from "node:process";
|
|
4
|
+
import { pathToFileURL } from "node:url";
|
|
5
|
+
import type { Environment } from "vitest/runtime";
|
|
6
|
+
|
|
7
|
+
// Resolve the DOM plugin from the consumer; depending on test-story would cycle through its Quality tooling.
|
|
8
|
+
const consumer = createRequire(join(process.cwd(), "package.json"));
|
|
9
|
+
const { default: environment }: { readonly default: Environment } = await import(
|
|
10
|
+
pathToFileURL(consumer.resolve("@shivaedev/test-story/domEnvironment.config.ts")).href
|
|
11
|
+
);
|
|
12
|
+
|
|
13
|
+
export default environment;
|
package/src/hooks/install.ts
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
|
-
import { basename, dirname, join, relative
|
|
1
|
+
import { basename, dirname, join, relative } from "node:path";
|
|
2
2
|
import { Console, Effect, FileSystem } from "effect";
|
|
3
3
|
import { CONFIG_FILE } from "#config/file.ts";
|
|
4
4
|
import { loadConfig } from "#config/load.ts";
|
|
5
5
|
import { SetupFailure } from "#failure.ts";
|
|
6
|
+
import { gitOrFail } from "#git/command.ts";
|
|
6
7
|
import { readOptionalText } from "#inventory/filesystem.ts";
|
|
7
8
|
import { commandWords, hookCommand, type Launch, shellWords } from "./command.ts";
|
|
8
|
-
import {
|
|
9
|
+
import { hookLocation } from "./location.ts";
|
|
9
10
|
import { hookShim, isHookShim } from "./shim.ts";
|
|
11
|
+
import { globalHookStatus } from "./status.ts";
|
|
10
12
|
|
|
11
13
|
export interface HookInstall {
|
|
12
14
|
readonly config: string | undefined;
|
|
@@ -33,14 +35,6 @@ const write = Effect.fnUntraced(function* (file: string, text: string) {
|
|
|
33
35
|
);
|
|
34
36
|
});
|
|
35
37
|
|
|
36
|
-
function elsewhere(location: HookLocation): Effect.Effect<void> {
|
|
37
|
-
return location.hooksPath === undefined || resolve(location.toplevel, location.hooksPath) === dirname(location.file)
|
|
38
|
-
? Effect.void
|
|
39
|
-
: Console.error(
|
|
40
|
-
`note: core.hooksPath is ${location.hooksPath}, so git runs the pre-commit hook there; ${location.file} runs only when that hook calls it.`,
|
|
41
|
-
);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
38
|
export const installHook = Effect.fn("Hooks.installHook")(function* (install: HookInstall) {
|
|
45
39
|
const config = yield* loadConfig(install.cwd, install.config);
|
|
46
40
|
const location = yield* hookLocation(config.root);
|
|
@@ -58,12 +52,17 @@ export const installHook = Effect.fn("Hooks.installHook")(function* (install: Ho
|
|
|
58
52
|
yield* Console.error(
|
|
59
53
|
`quality: kept ${location.file}: it is not quality's pre-commit hook, so quality does not check commits.\nhelp: call \`${call}\` from that hook, or replace it with \`quality hooks install --force\`.`,
|
|
60
54
|
);
|
|
61
|
-
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (existing === shim) {
|
|
62
58
|
yield* Console.log(`quality: the pre-commit hook at ${location.file} is up to date.`);
|
|
63
59
|
} else {
|
|
64
60
|
yield* write(location.file, shim);
|
|
65
61
|
const done = foreign ? `replaced ${location.file}, which was not quality's hook` : `installed the pre-commit hook at ${location.file}`;
|
|
66
62
|
yield* Console.log(`quality: ${done}; each commit runs \`${words}\`.`);
|
|
67
63
|
}
|
|
68
|
-
|
|
64
|
+
const hooks = dirname(location.file);
|
|
65
|
+
yield* gitOrFail(config.root, ["config", "--local", "core.hooksPath", hooks]);
|
|
66
|
+
yield* Console.log(`quality: set repository-local core.hooksPath to ${hooks}.`);
|
|
67
|
+
yield* globalHookStatus(location);
|
|
69
68
|
});
|
package/src/hooks/shim.ts
CHANGED
|
@@ -16,13 +16,23 @@ export function hookShim(directory: string, command: HookCommand): string {
|
|
|
16
16
|
OWNER,
|
|
17
17
|
'top="$(git rev-parse --show-toplevel)" || exit 2',
|
|
18
18
|
'if [ -n "$GIT_DIR" ] && [ -z "$GIT_WORK_TREE" ]; then export GIT_WORK_TREE="$top"; fi',
|
|
19
|
+
'cd "$top" || exit 2',
|
|
20
|
+
"status=0",
|
|
21
|
+
'global_path="$(git config --global --includes --type=path --get core.hooksPath)"',
|
|
22
|
+
'if [ -n "$global_path" ]; then',
|
|
23
|
+
'\tglobal_hook="$global_path/pre-commit"',
|
|
24
|
+
'\tif [ -x "$global_hook" ] && ! [ "$global_hook" -ef "$0" ]; then',
|
|
25
|
+
'\t\t"$global_hook" "$@" || status=$?',
|
|
26
|
+
"\tfi",
|
|
27
|
+
"fi",
|
|
19
28
|
`cd "$top"${folder} || exit 2`,
|
|
20
29
|
`quality=${shellWords([command.launcher])}`,
|
|
21
30
|
'if [ ! -e "$quality" ]; then',
|
|
22
31
|
'\tprintf \'quality: cannot check this commit: %s/%s does not exist.\\nhelp: install the dependencies of this worktree, then commit again.\\n\' "$PWD" "$quality" >&2',
|
|
23
32
|
"\texit 2",
|
|
24
33
|
"fi",
|
|
25
|
-
|
|
34
|
+
`${exec.join(" ")} || status=$?`,
|
|
35
|
+
'exit "$status"',
|
|
26
36
|
"",
|
|
27
37
|
].join("\n");
|
|
28
38
|
}
|