@aiready/contract-enforcement 0.2.6 → 0.2.8
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/.turbo/turbo-build.log +19 -18
- package/.turbo/turbo-format-check.log +7 -0
- package/.turbo/turbo-lint.log +5 -0
- package/.turbo/turbo-test.log +18 -16
- package/.turbo/turbo-type-check.log +5 -0
- package/dist/index.js +4 -1
- package/dist/index.mjs +4 -1
- package/package.json +5 -3
- package/src/__tests__/detector.test.ts +13 -1
- package/src/detector.ts +7 -3
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,18 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
>
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
DTS
|
|
17
|
-
DTS
|
|
18
|
-
DTS dist/index.d.
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
> @aiready/contract-enforcement@0.2.8 build /Users/pengcao/projects/aiready/packages/contract-enforcement
|
|
4
|
+
> tsup src/index.ts --format cjs,esm --dts
|
|
5
|
+
|
|
6
|
+
[34mCLI[39m Building entry: src/index.ts
|
|
7
|
+
[34mCLI[39m Using tsconfig: tsconfig.json
|
|
8
|
+
[34mCLI[39m tsup v8.5.1
|
|
9
|
+
[34mCLI[39m Target: es2020
|
|
10
|
+
[34mCJS[39m Build start
|
|
11
|
+
[34mESM[39m Build start
|
|
12
|
+
[32mCJS[39m [1mdist/index.js [22m[32m18.88 KB[39m
|
|
13
|
+
[32mCJS[39m ⚡️ Build success in 118ms
|
|
14
|
+
[32mESM[39m [1mdist/index.mjs [22m[32m17.44 KB[39m
|
|
15
|
+
[32mESM[39m ⚡️ Build success in 118ms
|
|
16
|
+
DTS Build start
|
|
17
|
+
DTS ⚡️ Build success in 2234ms
|
|
18
|
+
DTS dist/index.d.ts 2.45 KB
|
|
19
|
+
DTS dist/index.d.mts 2.45 KB
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
> @aiready/contract-enforcement@0.2.8 format-check /Users/pengcao/projects/aiready/packages/contract-enforcement
|
|
4
|
+
> prettier --check . --ignore-path ../../.prettierignore
|
|
5
|
+
|
|
6
|
+
Checking formatting...
|
|
7
|
+
package.json[2K[1GREADME.md[2K[1Gsrc/__tests__/detector.test.ts[2K[1Gsrc/__tests__/provider.test.ts[2K[1Gsrc/__tests__/scoring.test.ts[2K[1Gsrc/analyzer.ts[2K[1Gsrc/detector.ts[2K[1Gsrc/index.ts[2K[1Gsrc/provider.ts[2K[1Gsrc/scoring.ts[2K[1Gsrc/types.ts[2K[1Gtsconfig.json[2K[1GAll matched files use Prettier code style!
|
package/.turbo/turbo-test.log
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
>
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
[
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
[32m✓[39m src/__tests__/
|
|
10
|
-
[32m✓[39m src/__tests__/
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
[2m
|
|
14
|
-
[2m
|
|
15
|
-
[2m
|
|
16
|
-
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
> @aiready/contract-enforcement@0.2.7 test /Users/pengcao/projects/aiready/packages/contract-enforcement
|
|
4
|
+
> vitest run
|
|
5
|
+
|
|
6
|
+
[?25l
|
|
7
|
+
[1m[46m RUN [49m[22m [36mv4.1.1 [39m[90m/Users/pengcao/projects/aiready/packages/contract-enforcement[39m
|
|
8
|
+
|
|
9
|
+
[32m✓[39m src/__tests__/scoring.test.ts [2m([22m[2m7 tests[22m[2m)[22m[32m 5[2mms[22m[39m
|
|
10
|
+
[32m✓[39m src/__tests__/detector.test.ts [2m([22m[2m15 tests[22m[2m)[22m[32m 27[2mms[22m[39m
|
|
11
|
+
[32m✓[39m src/__tests__/provider.test.ts [2m([22m[2m5 tests[22m[2m)[22m[32m 3[2mms[22m[39m
|
|
12
|
+
|
|
13
|
+
[2m Test Files [22m [1m[32m3 passed[39m[22m[90m (3)[39m
|
|
14
|
+
[2m Tests [22m [1m[32m27 passed[39m[22m[90m (27)[39m
|
|
15
|
+
[2m Start at [22m 00:08:31
|
|
16
|
+
[2m Duration [22m 1.81s[2m (transform 650ms, setup 0ms, import 3.21s, tests 35ms, environment 0ms)[22m
|
|
17
|
+
|
|
18
|
+
[?25h
|
package/dist/index.js
CHANGED
|
@@ -143,8 +143,11 @@ function isSwallowedCatch(body, filePath) {
|
|
|
143
143
|
const stmt = body[0];
|
|
144
144
|
if (stmt.type === "ExpressionStatement" && stmt.expression?.type === "CallExpression") {
|
|
145
145
|
const callee = stmt.expression.callee;
|
|
146
|
-
if (callee?.type === "MemberExpression" && callee.object?.type === "Identifier" && callee.object.name === "console")
|
|
146
|
+
if (callee?.type === "MemberExpression" && callee.object?.type === "Identifier" && callee.object.name === "console") {
|
|
147
|
+
const method = callee.property.type === "Identifier" ? callee.property.name : "";
|
|
148
|
+
if (method === "error" || method === "warn") return false;
|
|
147
149
|
return true;
|
|
150
|
+
}
|
|
148
151
|
if (isUiComponent) {
|
|
149
152
|
let calleeName = "";
|
|
150
153
|
if (callee?.type === "Identifier") calleeName = callee.name;
|
package/dist/index.mjs
CHANGED
|
@@ -116,8 +116,11 @@ function isSwallowedCatch(body, filePath) {
|
|
|
116
116
|
const stmt = body[0];
|
|
117
117
|
if (stmt.type === "ExpressionStatement" && stmt.expression?.type === "CallExpression") {
|
|
118
118
|
const callee = stmt.expression.callee;
|
|
119
|
-
if (callee?.type === "MemberExpression" && callee.object?.type === "Identifier" && callee.object.name === "console")
|
|
119
|
+
if (callee?.type === "MemberExpression" && callee.object?.type === "Identifier" && callee.object.name === "console") {
|
|
120
|
+
const method = callee.property.type === "Identifier" ? callee.property.name : "";
|
|
121
|
+
if (method === "error" || method === "warn") return false;
|
|
120
122
|
return true;
|
|
123
|
+
}
|
|
121
124
|
if (isUiComponent) {
|
|
122
125
|
let calleeName = "";
|
|
123
126
|
if (callee?.type === "Identifier") calleeName = callee.name;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aiready/contract-enforcement",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.8",
|
|
4
4
|
"description": "Measures structural type safety and boundary validation to reduce fallback cascades for AI agents",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -32,7 +32,7 @@
|
|
|
32
32
|
"homepage": "https://github.com/caopengau/aiready-contract-enforcement",
|
|
33
33
|
"dependencies": {
|
|
34
34
|
"@typescript-eslint/typescript-estree": "^8.53.0",
|
|
35
|
-
"@aiready/core": "0.24.
|
|
35
|
+
"@aiready/core": "0.24.8"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@types/node": "^24.0.0",
|
|
@@ -49,6 +49,8 @@
|
|
|
49
49
|
"test": "vitest run",
|
|
50
50
|
"lint": "eslint src",
|
|
51
51
|
"clean": "rm -rf dist",
|
|
52
|
-
"release": "pnpm build && pnpm publish --no-git-checks"
|
|
52
|
+
"release": "pnpm build && pnpm publish --no-git-checks",
|
|
53
|
+
"type-check": "tsc --noEmit",
|
|
54
|
+
"format-check": "prettier --check . --ignore-path ../../.prettierignore"
|
|
53
55
|
}
|
|
54
56
|
}
|
|
@@ -72,13 +72,25 @@ describe('detectDefensivePatterns', () => {
|
|
|
72
72
|
try {
|
|
73
73
|
doSomething();
|
|
74
74
|
} catch (e) {
|
|
75
|
-
console.
|
|
75
|
+
console.log(e);
|
|
76
76
|
}
|
|
77
77
|
`;
|
|
78
78
|
const result = detectDefensivePatterns(filePath, code);
|
|
79
79
|
expect(result.counts['swallowed-error']).toBe(1);
|
|
80
80
|
});
|
|
81
81
|
|
|
82
|
+
it('does not flag console.error as swallowed', () => {
|
|
83
|
+
const code = `
|
|
84
|
+
try {
|
|
85
|
+
doSomething();
|
|
86
|
+
} catch (e) {
|
|
87
|
+
console.error(e);
|
|
88
|
+
}
|
|
89
|
+
`;
|
|
90
|
+
const result = detectDefensivePatterns(filePath, code);
|
|
91
|
+
expect(result.counts['swallowed-error']).toBe(0);
|
|
92
|
+
});
|
|
93
|
+
|
|
82
94
|
it('does not flag catch blocks with real handling', () => {
|
|
83
95
|
const code = `
|
|
84
96
|
try {
|
package/src/detector.ts
CHANGED
|
@@ -141,13 +141,17 @@ function isSwallowedCatch(
|
|
|
141
141
|
stmt.expression?.type === 'CallExpression'
|
|
142
142
|
) {
|
|
143
143
|
const callee = stmt.expression.callee;
|
|
144
|
-
// console.
|
|
144
|
+
// console.error and console.warn are considered "handling" or at least "reporting"
|
|
145
145
|
if (
|
|
146
146
|
callee?.type === 'MemberExpression' &&
|
|
147
147
|
callee.object?.type === 'Identifier' &&
|
|
148
148
|
callee.object.name === 'console'
|
|
149
|
-
)
|
|
150
|
-
|
|
149
|
+
) {
|
|
150
|
+
const method =
|
|
151
|
+
callee.property.type === 'Identifier' ? callee.property.name : '';
|
|
152
|
+
if (method === 'error' || method === 'warn') return false;
|
|
153
|
+
return true; // console.log/info/debug etc. are still considered "swallowed"
|
|
154
|
+
}
|
|
151
155
|
|
|
152
156
|
// If it's a UI component and looks like telemetry, it's a false positive
|
|
153
157
|
if (isUiComponent) {
|