@qualety/plugin-kit 0.1.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.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 NavehBrenner
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/dist/ast.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ import { Node, type ObjectLiteralExpression, SourceFile } from "ts-morph";
2
+ export declare function objectInit(literal: ObjectLiteralExpression, name: string): Node | undefined;
3
+ export declare function isPluginLiteral(node: Node): node is ObjectLiteralExpression;
4
+ export declare function pluginLiterals(sourceFile: SourceFile): ObjectLiteralExpression[];
5
+ export declare function unwrapRule(node: Node): ObjectLiteralExpression | undefined;
6
+ export declare function entryValue(prop: Node): Node | undefined;
7
+ export declare function ruleCreate(rule: ObjectLiteralExpression): Node | undefined;
8
+ export declare function resolveBinding(name: string, fromFile: SourceFile, sources: ReadonlyMap<string, unknown>): Node | undefined;
9
+ //# sourceMappingURL=ast.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast.d.ts","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,KAAK,uBAAuB,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAK1E,wBAAgB,UAAU,CAAC,OAAO,EAAE,uBAAuB,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAM3F;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,uBAAuB,CAkB3E;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,UAAU,GAAG,uBAAuB,EAAE,CAQhF;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,uBAAuB,GAAG,SAAS,CAa1E;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,GAAG,SAAS,CAQvD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,uBAAuB,GAAG,IAAI,GAAG,SAAS,CAY1E;AAED,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,UAAU,EACpB,OAAO,EAAE,WAAW,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,IAAI,GAAG,SAAS,CAMlB"}
package/dist/ast.js ADDED
@@ -0,0 +1,150 @@
1
+ import { dirname, extname, join, resolve } from "node:path";
2
+ import { Node, SourceFile } from "ts-morph";
3
+ const TS_EXTS = [".ts", ".tsx", ".mts", ".cts"];
4
+ const SWAP_EXTS = new Set([".js", ".jsx", ".mjs", ".cjs", ...TS_EXTS]);
5
+ export function objectInit(literal, name) {
6
+ const prop = literal.getProperty(name);
7
+ if (!Node.isPropertyAssignment(prop)) {
8
+ return undefined;
9
+ }
10
+ return prop.getInitializer();
11
+ }
12
+ export function isPluginLiteral(node) {
13
+ if (!Node.isObjectLiteralExpression(node)) {
14
+ return false;
15
+ }
16
+ const nameInit = objectInit(node, "name");
17
+ if (nameInit === undefined ||
18
+ !(Node.isStringLiteral(nameInit) ||
19
+ Node.isNoSubstitutionTemplateLiteral(nameInit) ||
20
+ Node.isIdentifier(nameInit))) {
21
+ return false;
22
+ }
23
+ const rules = objectInit(node, "rules");
24
+ const provides = objectInit(node, "provides");
25
+ return Node.isObjectLiteralExpression(rules) || Node.isObjectLiteralExpression(provides);
26
+ }
27
+ export function pluginLiterals(sourceFile) {
28
+ const found = [];
29
+ sourceFile.forEachDescendant((node) => {
30
+ if (isPluginLiteral(node)) {
31
+ found.push(node);
32
+ }
33
+ });
34
+ return found;
35
+ }
36
+ export function unwrapRule(node) {
37
+ if (Node.isObjectLiteralExpression(node)) {
38
+ return node;
39
+ }
40
+ if (!Node.isCallExpression(node)) {
41
+ return undefined;
42
+ }
43
+ const expr = node.getExpression();
44
+ if (!Node.isIdentifier(expr) || expr.getText() !== "defineRule") {
45
+ return undefined;
46
+ }
47
+ const arg = node.getArguments()[0];
48
+ return arg !== undefined && Node.isObjectLiteralExpression(arg) ? arg : undefined;
49
+ }
50
+ export function entryValue(prop) {
51
+ if (Node.isPropertyAssignment(prop)) {
52
+ return prop.getInitializer();
53
+ }
54
+ if (Node.isShorthandPropertyAssignment(prop)) {
55
+ return prop.getNameNode();
56
+ }
57
+ return undefined;
58
+ }
59
+ export function ruleCreate(rule) {
60
+ const prop = rule.getProperty("create");
61
+ if (Node.isMethodDeclaration(prop)) {
62
+ return prop;
63
+ }
64
+ if (Node.isShorthandPropertyAssignment(prop)) {
65
+ return prop.getNameNode();
66
+ }
67
+ if (!Node.isPropertyAssignment(prop)) {
68
+ return undefined;
69
+ }
70
+ return prop.getInitializer();
71
+ }
72
+ export function resolveBinding(name, fromFile, sources) {
73
+ const local = localBinding(fromFile, name);
74
+ if (local !== undefined) {
75
+ return local;
76
+ }
77
+ return importedBinding(fromFile, name, sources);
78
+ }
79
+ function localBinding(sourceFile, name) {
80
+ for (const stmt of sourceFile.getVariableStatements()) {
81
+ for (const decl of stmt.getDeclarations()) {
82
+ if (decl.getName() === name) {
83
+ return decl.getInitializer();
84
+ }
85
+ }
86
+ }
87
+ for (const fn of sourceFile.getFunctions()) {
88
+ if (fn.getName() === name) {
89
+ return fn;
90
+ }
91
+ }
92
+ return undefined;
93
+ }
94
+ function importedBinding(sourceFile, name, sources) {
95
+ for (const decl of sourceFile.getImportDeclarations()) {
96
+ const found = namedImportTarget(decl, name, sourceFile, sources);
97
+ if (found !== undefined) {
98
+ return found;
99
+ }
100
+ }
101
+ return undefined;
102
+ }
103
+ function namedImportTarget(decl, name, sourceFile, sources) {
104
+ if (!Node.isImportDeclaration(decl)) {
105
+ return undefined;
106
+ }
107
+ for (const named of decl.getNamedImports()) {
108
+ const local = named.getAliasNode()?.getText() ?? named.getName();
109
+ if (local !== name) {
110
+ continue;
111
+ }
112
+ const specifier = decl.getModuleSpecifierValue();
113
+ if (!specifier.startsWith(".")) {
114
+ return undefined;
115
+ }
116
+ return exportFromSpecifier(sourceFile.getFilePath(), specifier, named.getName(), sources);
117
+ }
118
+ return undefined;
119
+ }
120
+ function exportFromSpecifier(fromFile, specifier, exportName, sources) {
121
+ const resolved = resolve(dirname(fromFile), specifier);
122
+ const ext = extname(resolved);
123
+ const stem = SWAP_EXTS.has(ext) ? resolved.slice(0, -ext.length) : resolved;
124
+ const hits = [
125
+ resolved,
126
+ ...TS_EXTS.map((tsExt) => stem + tsExt),
127
+ ...TS_EXTS.map((tsExt) => join(resolved, `index${tsExt}`)),
128
+ ];
129
+ let target;
130
+ for (const hit of hits) {
131
+ if (sources.has(hit)) {
132
+ target = hit;
133
+ break;
134
+ }
135
+ const normalized = resolve(hit);
136
+ if (sources.has(normalized)) {
137
+ target = normalized;
138
+ break;
139
+ }
140
+ }
141
+ if (target === undefined) {
142
+ return undefined;
143
+ }
144
+ const unit = sources.get(target);
145
+ if (!(unit instanceof SourceFile)) {
146
+ return undefined;
147
+ }
148
+ return localBinding(unit, exportName);
149
+ }
150
+ //# sourceMappingURL=ast.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast.js","sourceRoot":"","sources":["../src/ast.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { Plugin } from "qualety";
2
+ declare const plugin: Plugin;
3
+ export default plugin;
4
+ export { plugin };
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAItC,QAAA,MAAM,MAAM,EAAE,MAcb,CAAC;eAEa,MAAM;AACrB,OAAO,EAAE,MAAM,EAAE,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,20 @@
1
+ import { noSpawnInCreate } from "./no-spawn-in-create.js";
2
+ import { preferDefineRule } from "./prefer-define-rule.js";
3
+ const plugin = {
4
+ name: "plugin-kit",
5
+ rules: {
6
+ "no-spawn-in-create": noSpawnInCreate,
7
+ "prefer-define-rule": preferDefineRule,
8
+ },
9
+ configs: {
10
+ recommended: {
11
+ rules: {
12
+ "plugin-kit/no-spawn-in-create": "error",
13
+ "plugin-kit/prefer-define-rule": "error",
14
+ },
15
+ },
16
+ },
17
+ };
18
+ export default plugin;
19
+ export { plugin };
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,MAAM,MAAM,GAAW;IACrB,IAAI,EAAE,YAAY;IAClB,KAAK,EAAE;QACL,oBAAoB,EAAE,eAAe;QACrC,oBAAoB,EAAE,gBAAgB;KACvC;IACD,OAAO,EAAE;QACP,WAAW,EAAE;YACX,KAAK,EAAE;gBACL,+BAA+B,EAAE,OAAO;gBACxC,+BAA+B,EAAE,OAAO;aACzC;SACF;KACF;CACF,CAAC;AAEF,eAAe,MAAM,CAAC;AACtB,OAAO,EAAE,MAAM,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { type RuleContext } from "qualety";
2
+ export declare const noSpawnInCreate: {
3
+ meta: import("qualety").RuleMeta & {
4
+ requires?: readonly ["typescript"] | undefined;
5
+ };
6
+ create(context: RuleContext<readonly ["typescript"]>): void | import("qualety").RuleListener;
7
+ };
8
+ //# sourceMappingURL=no-spawn-in-create.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-spawn-in-create.d.ts","sourceRoot":"","sources":["../src/no-spawn-in-create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAwBvD,eAAO,MAAM,eAAe;;;;;CAgB1B,CAAC"}
@@ -0,0 +1,171 @@
1
+ import { defineRule } from "qualety";
2
+ import { Node, SourceFile } from "ts-morph";
3
+ import { entryValue, objectInit, pluginLiterals, resolveBinding, ruleCreate, unwrapRule, } from "./ast.js";
4
+ const SUGGESTION = "Move process work into provides.build (or a provider plugin); rules only consume artifacts.";
5
+ const SPAWN_NAMES = new Set([
6
+ "spawn",
7
+ "spawnSync",
8
+ "exec",
9
+ "execSync",
10
+ "execFile",
11
+ "execFileSync",
12
+ "fork",
13
+ ]);
14
+ export const noSpawnInCreate = defineRule({
15
+ meta: {
16
+ requires: ["typescript"],
17
+ docs: {
18
+ description: "Do not spawn processes from a rule create function; providers own binaries via provides.build.",
19
+ },
20
+ },
21
+ create: (context) => {
22
+ const sources = context.getArtifact("typescript").sources;
23
+ for (const unit of sources.values()) {
24
+ if (unit instanceof SourceFile) {
25
+ scanFile(unit, sources, context);
26
+ }
27
+ }
28
+ },
29
+ });
30
+ function scanFile(sourceFile, sources, context) {
31
+ for (const plugin of pluginLiterals(sourceFile)) {
32
+ const rules = objectInit(plugin, "rules");
33
+ if (!Node.isObjectLiteralExpression(rules)) {
34
+ continue;
35
+ }
36
+ for (const prop of rules.getProperties()) {
37
+ const value = entryValue(prop);
38
+ const create = value === undefined ? undefined : createFromValue(value, sourceFile, sources, new Set());
39
+ if (create !== undefined) {
40
+ scanCreate(create, context);
41
+ }
42
+ }
43
+ }
44
+ }
45
+ function createFromValue(value, sourceFile, sources, seen) {
46
+ if (seen.has(value)) {
47
+ return undefined;
48
+ }
49
+ seen.add(value);
50
+ if (Node.isIdentifier(value)) {
51
+ const bound = resolveBinding(value.getText(), sourceFile, sources);
52
+ return bound === undefined
53
+ ? undefined
54
+ : createFromValue(bound, bound.getSourceFile(), sources, seen);
55
+ }
56
+ const rule = unwrapRule(value);
57
+ if (rule === undefined) {
58
+ return undefined;
59
+ }
60
+ const create = ruleCreate(rule);
61
+ if (create === undefined) {
62
+ return undefined;
63
+ }
64
+ if (Node.isIdentifier(create)) {
65
+ return resolveBinding(create.getText(), create.getSourceFile(), sources);
66
+ }
67
+ return create;
68
+ }
69
+ function scanCreate(create, context) {
70
+ const sourceFile = create.getSourceFile();
71
+ const file = sourceFile.getFilePath();
72
+ const locals = fileFunctions(sourceFile);
73
+ const reached = new Set();
74
+ const queue = [create];
75
+ while (queue.length > 0) {
76
+ const current = queue.pop();
77
+ if (current === undefined || reached.has(current)) {
78
+ continue;
79
+ }
80
+ reached.add(current);
81
+ current.forEachDescendant((node) => {
82
+ if (!Node.isCallExpression(node)) {
83
+ return;
84
+ }
85
+ const expr = node.getExpression();
86
+ const api = spawnApi(expr, sourceFile);
87
+ if (api !== undefined) {
88
+ context.report({
89
+ severity: "error",
90
+ file,
91
+ range: {
92
+ start: node.getSourceFile().getLineAndColumnAtPos(node.getStart()),
93
+ end: node.getSourceFile().getLineAndColumnAtPos(node.getEnd()),
94
+ },
95
+ message: `Do not call ${api} inside a rule create function.`,
96
+ suggestion: SUGGESTION,
97
+ });
98
+ return;
99
+ }
100
+ if (Node.isIdentifier(expr)) {
101
+ const target = locals.get(expr.getText());
102
+ if (target !== undefined) {
103
+ queue.push(target);
104
+ }
105
+ }
106
+ });
107
+ }
108
+ }
109
+ function fileFunctions(sourceFile) {
110
+ const map = new Map();
111
+ for (const fn of sourceFile.getFunctions()) {
112
+ const name = fn.getName();
113
+ if (name !== undefined) {
114
+ map.set(name, fn);
115
+ }
116
+ }
117
+ for (const stmt of sourceFile.getVariableStatements()) {
118
+ for (const decl of stmt.getDeclarations()) {
119
+ const init = decl.getInitializer();
120
+ if (init !== undefined &&
121
+ (Node.isFunctionDeclaration(init) ||
122
+ Node.isFunctionExpression(init) ||
123
+ Node.isArrowFunction(init) ||
124
+ Node.isMethodDeclaration(init))) {
125
+ map.set(decl.getName(), init);
126
+ }
127
+ }
128
+ }
129
+ return map;
130
+ }
131
+ function spawnApi(expr, sourceFile) {
132
+ if (Node.isIdentifier(expr)) {
133
+ const name = expr.getText();
134
+ return SPAWN_NAMES.has(name) ? name : undefined;
135
+ }
136
+ if (!Node.isPropertyAccessExpression(expr)) {
137
+ return undefined;
138
+ }
139
+ const name = expr.getName();
140
+ const recv = expr.getExpression();
141
+ if (!SPAWN_NAMES.has(name) || !Node.isIdentifier(recv)) {
142
+ return undefined;
143
+ }
144
+ const text = recv.getText();
145
+ if (text === "child_process" || text === "cp" || childProcessNamespaces(sourceFile).has(text)) {
146
+ return name;
147
+ }
148
+ return undefined;
149
+ }
150
+ function childProcessNamespaces(sourceFile) {
151
+ const names = new Set();
152
+ for (const decl of sourceFile.getImportDeclarations()) {
153
+ const spec = decl.getModuleSpecifierValue();
154
+ if (spec !== "node:child_process" &&
155
+ spec !== "child_process" &&
156
+ spec !== "node:child_process/promises" &&
157
+ spec !== "child_process/promises") {
158
+ continue;
159
+ }
160
+ const ns = decl.getNamespaceImport();
161
+ if (ns !== undefined) {
162
+ names.add(ns.getText());
163
+ }
164
+ const def = decl.getDefaultImport();
165
+ if (def !== undefined) {
166
+ names.add(def.getText());
167
+ }
168
+ }
169
+ return names;
170
+ }
171
+ //# sourceMappingURL=no-spawn-in-create.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"no-spawn-in-create.js","sourceRoot":"","sources":["../src/no-spawn-in-create.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { type RuleContext } from "qualety";
2
+ export declare const preferDefineRule: {
3
+ meta: import("qualety").RuleMeta & {
4
+ requires?: readonly ["typescript"] | undefined;
5
+ };
6
+ create(context: RuleContext<readonly ["typescript"]>): void | import("qualety").RuleListener;
7
+ };
8
+ //# sourceMappingURL=prefer-define-rule.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-define-rule.d.ts","sourceRoot":"","sources":["../src/prefer-define-rule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAMvD,eAAO,MAAM,gBAAgB;;;;;CAe3B,CAAC"}
@@ -0,0 +1,74 @@
1
+ import { defineRule } from "qualety";
2
+ import { Node, SourceFile } from "ts-morph";
3
+ import { entryValue, objectInit, pluginLiterals, resolveBinding } from "./ast.js";
4
+ const SUGGESTION = "Wrap this rule with defineRule and list artifact ids in meta.requires.";
5
+ export const preferDefineRule = defineRule({
6
+ meta: {
7
+ requires: ["typescript"],
8
+ docs: {
9
+ description: "Prefer defineRule over a bare Rule object on a plugin rules map.",
10
+ },
11
+ },
12
+ create: (context) => {
13
+ const sources = context.getArtifact("typescript").sources;
14
+ for (const [abs, unit] of sources) {
15
+ if (unit instanceof SourceFile && !abs.endsWith(".d.ts")) {
16
+ scanFile(unit, abs, sources, context);
17
+ }
18
+ }
19
+ },
20
+ });
21
+ function scanFile(sourceFile, file, sources, context) {
22
+ for (const plugin of pluginLiterals(sourceFile)) {
23
+ const rules = objectInit(plugin, "rules");
24
+ if (!Node.isObjectLiteralExpression(rules)) {
25
+ continue;
26
+ }
27
+ for (const prop of rules.getProperties()) {
28
+ checkEntry(prop, sourceFile, file, sources, context);
29
+ }
30
+ }
31
+ }
32
+ function checkEntry(prop, sourceFile, file, sources, context) {
33
+ const value = entryValue(prop);
34
+ if (value === undefined || isDefineRuleCall(value)) {
35
+ return;
36
+ }
37
+ if (Node.isIdentifier(value)) {
38
+ const bound = resolveBinding(value.getText(), sourceFile, sources);
39
+ if (bound === undefined || isDefineRuleCall(bound) || !isBareRule(bound)) {
40
+ return;
41
+ }
42
+ reportBare(context, file, value);
43
+ return;
44
+ }
45
+ if (isBareRule(value)) {
46
+ reportBare(context, file, value);
47
+ }
48
+ }
49
+ function isDefineRuleCall(node) {
50
+ if (!Node.isCallExpression(node)) {
51
+ return false;
52
+ }
53
+ const expr = node.getExpression();
54
+ return Node.isIdentifier(expr) && expr.getText() === "defineRule";
55
+ }
56
+ function isBareRule(node) {
57
+ if (!Node.isObjectLiteralExpression(node)) {
58
+ return false;
59
+ }
60
+ return node.getProperty("meta") !== undefined && node.getProperty("create") !== undefined;
61
+ }
62
+ function reportBare(context, file, node) {
63
+ context.report({
64
+ severity: "error",
65
+ file,
66
+ range: {
67
+ start: node.getSourceFile().getLineAndColumnAtPos(node.getStart()),
68
+ end: node.getSourceFile().getLineAndColumnAtPos(node.getEnd()),
69
+ },
70
+ message: "Prefer defineRule over a bare Rule object on a plugin rules map.",
71
+ suggestion: SUGGESTION,
72
+ });
73
+ }
74
+ //# sourceMappingURL=prefer-define-rule.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prefer-define-rule.js","sourceRoot":"","sources":["../src/prefer-define-rule.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@qualety/plugin-kit",
3
+ "version": "0.1.0",
4
+ "description": "Portable plugin-authoring rules for qualety.",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "https://github.com/NavehBrenner/qualety.git",
9
+ "directory": "packages/plugin-kit"
10
+ },
11
+ "bugs": {
12
+ "url": "https://github.com/NavehBrenner/qualety/issues"
13
+ },
14
+ "homepage": "https://github.com/NavehBrenner/qualety",
15
+ "publishConfig": {
16
+ "access": "public"
17
+ },
18
+ "type": "module",
19
+ "exports": {
20
+ ".": {
21
+ "types": "./dist/index.d.ts",
22
+ "import": "./dist/index.js"
23
+ }
24
+ },
25
+ "types": "./dist/index.d.ts",
26
+ "files": [
27
+ "dist"
28
+ ],
29
+ "engines": {
30
+ "node": ">=22"
31
+ },
32
+ "dependencies": {
33
+ "ts-morph": "^28.0.0",
34
+ "qualety": "0.1.0"
35
+ },
36
+ "devDependencies": {
37
+ "@types/node": "^26.2.0"
38
+ },
39
+ "scripts": {
40
+ "build": "tsc -b"
41
+ }
42
+ }