@thymian/plugin-http-linter 0.1.10 → 0.1.11-canary.20260624-288c194
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/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -15
- package/dist/index.js.map +1 -1
- package/dist/static-api-context.d.ts +10 -14
- package/dist/static-api-context.d.ts.map +1 -1
- package/dist/static-api-context.js +54 -81
- package/dist/static-api-context.js.map +1 -1
- package/package.json +3 -3
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type EvaluatedRuleViolation, type Rule, type RulesConfiguration, type SerializedThymianFormat, type ThymianPlugin, type
|
|
1
|
+
import { type EvaluatedRuleViolation, type Rule, type RulesConfiguration, type SerializedThymianFormat, type ThymianPlugin, type ToolRun } from '@thymian/core';
|
|
2
2
|
export { StaticApiContext } from './static-api-context.js';
|
|
3
3
|
declare module '@thymian/core' {
|
|
4
4
|
interface ThymianActions {
|
|
@@ -19,7 +19,7 @@ declare module '@thymian/core' {
|
|
|
19
19
|
rulesConfig?: RulesConfiguration;
|
|
20
20
|
};
|
|
21
21
|
response: {
|
|
22
|
-
|
|
22
|
+
runs: ToolRun[];
|
|
23
23
|
violations: EvaluatedRuleViolation[];
|
|
24
24
|
valid: boolean;
|
|
25
25
|
};
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,sBAAsB,EAE3B,KAAK,IAAI,EAET,KAAK,kBAAkB,EAKvB,KAAK,uBAAuB,EAG5B,KAAK,aAAa,EAClB,KAAK,OAAO,EACb,MAAM,eAAe,CAAC;AAIvB,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAE3D,OAAO,QAAQ,eAAe,CAAC;IAC7B,UAAU,cAAc;QACtB,wBAAwB,EAAE;YACxB,KAAK,EAAE;gBAAE,KAAK,EAAE,MAAM,EAAE,CAAA;aAAE,CAAC;YAC3B,QAAQ,EAAE,IAAI,CAAC;SAChB,CAAC;QAEF,mBAAmB,EAAE;YACnB,KAAK,EAAE,KAAK,CAAC;YACb,QAAQ,EAAE,IAAI,EAAE,CAAC;SAClB,CAAC;QAEF,yBAAyB,EAAE;YACzB,KAAK,EAAE;gBACL,MAAM,EAAE,uBAAuB,CAAC;gBAChC,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC;gBACf,WAAW,CAAC,EAAE,kBAAkB,CAAC;aAClC,CAAC;YACF,QAAQ,EAAE;gBACR,IAAI,EAAE,OAAO,EAAE,CAAC;gBAChB,UAAU,EAAE,sBAAsB,EAAE,CAAC;gBACrC,KAAK,EAAE,OAAO,CAAC;aAChB,CAAC;SACH,CAAC;KACH;CACF;AAsCD,wBAAgB,sBAAsB,CACpC,UAAU,SAAgC,GACzC,aAAa,CAuDf;AAED,eAAO,MAAM,gBAAgB,eAA2B,CAAC;AAEzD,eAAe,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,14 +1,26 @@
|
|
|
1
|
-
import { runRules, ThymianFormat, } from '@thymian/core';
|
|
1
|
+
import { createToolRun, executionsFromRunRulesResult, rulesToRuleDescriptors, runRules, runRulesResultToViolations, ThymianFormat, } from '@thymian/core';
|
|
2
2
|
import { StaticApiContext } from './static-api-context.js';
|
|
3
3
|
export { StaticApiContext } from './static-api-context.js';
|
|
4
|
-
function createStaticLinterAdapter(logger,
|
|
4
|
+
function createStaticLinterAdapter(logger, format, rulesConfig) {
|
|
5
5
|
return {
|
|
6
6
|
errorName: 'StaticLinterError',
|
|
7
7
|
mode: 'static',
|
|
8
8
|
getRuleFn: (rule) => rule.lintRule,
|
|
9
|
-
createContext: (_rule, options) => new StaticApiContext(format, logger,
|
|
9
|
+
createContext: (_rule, options) => new StaticApiContext(format, logger, (options ?? {}).skipOrigins),
|
|
10
10
|
};
|
|
11
11
|
}
|
|
12
|
+
function createRuns(pluginName, format, ruleResults, rules = []) {
|
|
13
|
+
const executions = executionsFromRunRulesResult(ruleResults, rules, format);
|
|
14
|
+
const ruleDescriptors = rulesToRuleDescriptors(rules, (r) => r.lintRule);
|
|
15
|
+
return [
|
|
16
|
+
createToolRun({
|
|
17
|
+
tool: { name: pluginName },
|
|
18
|
+
runType: 'lint',
|
|
19
|
+
executions,
|
|
20
|
+
rules: ruleDescriptors.length > 0 ? ruleDescriptors : undefined,
|
|
21
|
+
}),
|
|
22
|
+
];
|
|
23
|
+
}
|
|
12
24
|
export function createHttpLinterPlugin(pluginName = '@thymian/plugin-http-linter') {
|
|
13
25
|
return {
|
|
14
26
|
name: pluginName,
|
|
@@ -19,22 +31,15 @@ export function createHttpLinterPlugin(pluginName = '@thymian/plugin-http-linter
|
|
|
19
31
|
async plugin(emitter, logger) {
|
|
20
32
|
emitter.onAction('core.lint', async ({ format, rules = [], rulesConfig = {} }, ctx) => {
|
|
21
33
|
const thymianFormat = ThymianFormat.import(format);
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
-
ctx.reply({
|
|
25
|
-
source: pluginName,
|
|
26
|
-
status: violations.length === 0 ? 'success' : 'failed',
|
|
27
|
-
violations,
|
|
28
|
-
statistics,
|
|
29
|
-
});
|
|
34
|
+
const ruleResults = await runRules(logger, rules, thymianFormat, rulesConfig, createStaticLinterAdapter(logger, thymianFormat, rulesConfig));
|
|
35
|
+
ctx.reply(createRuns(pluginName, thymianFormat, ruleResults, rules));
|
|
30
36
|
});
|
|
31
37
|
emitter.onAction('http-linter.lint-static', async ({ format, rules = [], rulesConfig = {} }, ctx) => {
|
|
32
38
|
const thymianFormat = ThymianFormat.import(format);
|
|
33
|
-
const
|
|
34
|
-
const
|
|
35
|
-
const { violations } = await runRules(logger, rules, thymianFormat, rulesConfig, createStaticLinterAdapter(logger, reportFn, thymianFormat, rulesConfig));
|
|
39
|
+
const ruleResults = await runRules(logger, rules, thymianFormat, rulesConfig, createStaticLinterAdapter(logger, thymianFormat, rulesConfig));
|
|
40
|
+
const violations = runRulesResultToViolations(ruleResults, rules);
|
|
36
41
|
ctx.reply({
|
|
37
|
-
|
|
42
|
+
runs: createRuns(pluginName, thymianFormat, ruleResults, rules),
|
|
38
43
|
violations,
|
|
39
44
|
valid: violations.length === 0,
|
|
40
45
|
});
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +1,22 @@
|
|
|
1
|
-
import { type CommonHttpRequest, type CommonHttpResponse, type HttpFilterExpression, type LintContext, type Logger, type
|
|
1
|
+
import { type CommonHttpRequest, type CommonHttpResponse, type HttpFilterExpression, type LintContext, type Logger, type RuleFinding, type RuleFnResult, type RuleViolation, type RuleViolationLocation, ThymianFormat, type ThymianHttpRequest, type ThymianHttpResponse, type ValidationFn } from '@thymian/core';
|
|
2
2
|
export declare class StaticApiContext implements LintContext {
|
|
3
3
|
private readonly logger;
|
|
4
|
-
private readonly skippedOrigins;
|
|
5
4
|
readonly format: ThymianFormat;
|
|
6
|
-
readonly
|
|
7
|
-
|
|
8
|
-
constructor(format: ThymianFormat, logger: Logger, report?: ReportFn, skippedOrigins?: string[]);
|
|
9
|
-
reportViolation(violation: RuleViolation): void;
|
|
5
|
+
private readonly skippedOrigins;
|
|
6
|
+
constructor(format: ThymianFormat, logger: Logger, reportOrSkippedOrigins?: (() => void) | string[], legacySkippedOrigins?: string[]);
|
|
10
7
|
getRuleExecutionDiagnostics(): undefined;
|
|
11
8
|
validateCommonHttpTransactions(filter: HttpFilterExpression, validate?: ValidationFn<[
|
|
12
9
|
CommonHttpRequest,
|
|
13
10
|
CommonHttpResponse,
|
|
14
11
|
RuleViolationLocation
|
|
15
|
-
]> | HttpFilterExpression): RuleFnResult;
|
|
12
|
+
]> | HttpFilterExpression): RuleFnResult[];
|
|
16
13
|
validateGroupedCommonHttpTransactions(filter: HttpFilterExpression, groupBy: HttpFilterExpression, validationFn: ValidationFn<[
|
|
17
14
|
string,
|
|
18
|
-
[
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
validateHttpTransactions(filterFn: (req: ThymianHttpRequest, res: ThymianHttpResponse, responses: ThymianHttpResponse[]) => boolean, validationFn?: (req: ThymianHttpRequest, res: ThymianHttpResponse, responses: ThymianHttpResponse[]) => PartialBy<RuleViolation, 'location'> | boolean): RuleFnResult;
|
|
15
|
+
[CommonHttpRequest, CommonHttpResponse, RuleViolationLocation][]
|
|
16
|
+
]>): RuleFnResult[];
|
|
17
|
+
validateHttpTransactions(filterFn: (req: ThymianHttpRequest, res: ThymianHttpResponse, responses: ThymianHttpResponse[]) => boolean, validationFn?: (req: ThymianHttpRequest, res: ThymianHttpResponse, responses: ThymianHttpResponse[]) => {
|
|
18
|
+
violation?: RuleViolation;
|
|
19
|
+
findings?: RuleFinding[];
|
|
20
|
+
} | boolean): RuleFnResult[];
|
|
25
21
|
}
|
|
26
22
|
//# sourceMappingURL=static-api-context.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static-api-context.d.ts","sourceRoot":"","sources":["../src/static-api-context.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EAEvB,KAAK,oBAAoB,EAEzB,KAAK,WAAW,EAChB,KAAK,MAAM,EACX,KAAK,
|
|
1
|
+
{"version":3,"file":"static-api-context.d.ts","sourceRoot":"","sources":["../src/static-api-context.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EAEvB,KAAK,oBAAoB,EAEzB,KAAK,WAAW,EAChB,KAAK,MAAM,EACX,KAAK,WAAW,EAChB,KAAK,YAAY,EACjB,KAAK,aAAa,EAClB,KAAK,qBAAqB,EAC1B,aAAa,EACb,KAAK,kBAAkB,EACvB,KAAK,mBAAmB,EAKxB,KAAK,YAAY,EAClB,MAAM,eAAe,CAAC;AAKvB,qBAAa,gBAAiB,YAAW,WAAW;IAMhD,OAAO,CAAC,QAAQ,CAAC,MAAM;IALzB,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAW;gBAGxC,MAAM,EAAE,aAAa,EACJ,MAAM,EAAE,MAAM,EAC/B,sBAAsB,CAAC,EAAE,CAAC,MAAM,IAAI,CAAC,GAAG,MAAM,EAAE,EAChD,oBAAoB,GAAE,MAAM,EAAO;IAoBrC,2BAA2B,IAAI,SAAS;IAIxC,8BAA8B,CAC5B,MAAM,EAAE,oBAAoB,EAC5B,QAAQ,GACJ,YAAY,CACV;QAAC,iBAAiB;QAAE,kBAAkB;QAAE,qBAAqB;KAAC,CAC/D,GACD,oBAA6B,GAChC,YAAY,EAAE;IAyCjB,qCAAqC,CACnC,MAAM,EAAE,oBAAoB,EAC5B,OAAO,EAAE,oBAAoB,EAC7B,YAAY,EAAE,YAAY,CACxB;QAAC,MAAM;QAAE,CAAC,iBAAiB,EAAE,kBAAkB,EAAE,qBAAqB,CAAC,EAAE;KAAC,CAC3E,GACA,YAAY,EAAE;IA0CjB,wBAAwB,CACtB,QAAQ,EAAE,CACR,GAAG,EAAE,kBAAkB,EACvB,GAAG,EAAE,mBAAmB,EACxB,SAAS,EAAE,mBAAmB,EAAE,KAC7B,OAAO,EACZ,YAAY,GAAE,CACZ,GAAG,EAAE,kBAAkB,EACvB,GAAG,EAAE,mBAAmB,EACxB,SAAS,EAAE,mBAAmB,EAAE,KAE9B;QAAE,SAAS,CAAC,EAAE,aAAa,CAAC;QAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,CAAA;KAAE,GACvD,OAAkB,GACrB,YAAY,EAAE;CAmDlB"}
|
|
@@ -3,72 +3,52 @@ import { httpFilterExpressionToFilter } from './visitors/http-filter-expression-
|
|
|
3
3
|
import { httpFilterToGroupByFn } from './visitors/http-filter-to-static-by-fn.js';
|
|
4
4
|
export class StaticApiContext {
|
|
5
5
|
logger;
|
|
6
|
-
skippedOrigins;
|
|
7
6
|
format;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
constructor(format, logger, report = () => undefined, skippedOrigins = []) {
|
|
7
|
+
skippedOrigins;
|
|
8
|
+
constructor(format, logger, reportOrSkippedOrigins, legacySkippedOrigins = []) {
|
|
11
9
|
this.logger = logger;
|
|
10
|
+
const skippedOrigins = Array.isArray(reportOrSkippedOrigins)
|
|
11
|
+
? reportOrSkippedOrigins
|
|
12
|
+
: legacySkippedOrigins;
|
|
12
13
|
this.skippedOrigins = skippedOrigins;
|
|
13
|
-
this.
|
|
14
|
-
if (skippedOrigins.length === 0) {
|
|
14
|
+
if (this.skippedOrigins.length === 0) {
|
|
15
15
|
this.format = format;
|
|
16
16
|
}
|
|
17
17
|
else {
|
|
18
|
-
const regExps = skippedOrigins.map(createRegExpFromOriginWildcard);
|
|
18
|
+
const regExps = this.skippedOrigins.map(createRegExpFromOriginWildcard);
|
|
19
19
|
this.format = format.filter(({ thymianReq }) => !regExps.some((regExp) => regExp.test(thymianRequestToOrigin(thymianReq))));
|
|
20
20
|
}
|
|
21
21
|
}
|
|
22
|
-
reportViolation(violation) {
|
|
23
|
-
this.violations.push(violation);
|
|
24
|
-
}
|
|
25
22
|
getRuleExecutionDiagnostics() {
|
|
26
23
|
return undefined;
|
|
27
24
|
}
|
|
28
25
|
validateCommonHttpTransactions(filter, validate = filter) {
|
|
29
26
|
const filterFn = httpFilterExpressionToFilter(filter);
|
|
30
|
-
|
|
27
|
+
const rawEntries = this.format
|
|
31
28
|
.getThymianHttpTransactions()
|
|
32
29
|
.filter((transaction) => filterFn(transaction, this.format))
|
|
33
|
-
.
|
|
30
|
+
.flatMap((transaction) => {
|
|
31
|
+
const location = {
|
|
32
|
+
elementType: 'edge',
|
|
33
|
+
elementId: transaction.transactionId,
|
|
34
|
+
};
|
|
34
35
|
if (typeof validate === 'function') {
|
|
35
|
-
|
|
36
|
-
elementType: 'edge',
|
|
37
|
-
elementId: transaction.transactionId,
|
|
38
|
-
});
|
|
39
|
-
if (typeof validationResult === 'boolean' && validationResult) {
|
|
40
|
-
violations.push({
|
|
41
|
-
location: {
|
|
42
|
-
elementType: 'edge',
|
|
43
|
-
elementId: transaction.transactionId,
|
|
44
|
-
},
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
if (validationResult && typeof validationResult === 'object') {
|
|
48
|
-
violations.push({
|
|
49
|
-
location: {
|
|
50
|
-
elementType: 'edge',
|
|
51
|
-
elementId: transaction.transactionId,
|
|
52
|
-
},
|
|
53
|
-
...validationResult,
|
|
54
|
-
});
|
|
55
|
-
}
|
|
36
|
+
return validate(thymianToCommonHttpRequest(transaction.thymianReq, transaction.thymianReqId), thymianToCommonHttpResponse(transaction.thymianRes, transaction.thymianResId), location);
|
|
56
37
|
}
|
|
57
38
|
else {
|
|
58
39
|
const validateFn = httpFilterExpressionToFilter(validate);
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
40
|
+
return validateFn(transaction, this.format)
|
|
41
|
+
? [
|
|
42
|
+
{
|
|
43
|
+
location: { ...location, pointer: '' },
|
|
44
|
+
violation: {},
|
|
45
|
+
findings: [],
|
|
65
46
|
},
|
|
66
|
-
|
|
67
|
-
|
|
47
|
+
]
|
|
48
|
+
: [];
|
|
68
49
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
.concat(this.violations);
|
|
50
|
+
});
|
|
51
|
+
return rawEntries;
|
|
72
52
|
}
|
|
73
53
|
validateGroupedCommonHttpTransactions(filter, groupBy, validationFn) {
|
|
74
54
|
const filterFn = httpFilterExpressionToFilter(filter);
|
|
@@ -81,28 +61,20 @@ export class StaticApiContext {
|
|
|
81
61
|
(groups[key] ??= []).push(transaction);
|
|
82
62
|
return groups;
|
|
83
63
|
}, {});
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
]));
|
|
94
|
-
if (validationResult) {
|
|
95
|
-
violations.push(validationResult);
|
|
96
|
-
}
|
|
97
|
-
return violations;
|
|
98
|
-
}, [])
|
|
99
|
-
.concat(this.violations);
|
|
64
|
+
const rawEntries = Object.entries(groups).flatMap(([key, group]) => validationFn(key, group.map(({ thymianReq, thymianRes, thymianReqId, thymianResId, transactionId, }) => [
|
|
65
|
+
thymianToCommonHttpRequest(thymianReq, thymianReqId),
|
|
66
|
+
thymianToCommonHttpResponse(thymianRes, thymianResId),
|
|
67
|
+
{
|
|
68
|
+
elementType: 'edge',
|
|
69
|
+
elementId: transactionId,
|
|
70
|
+
},
|
|
71
|
+
])));
|
|
72
|
+
return rawEntries;
|
|
100
73
|
}
|
|
101
74
|
validateHttpTransactions(filterFn, validationFn = filterFn) {
|
|
102
|
-
|
|
103
|
-
.reduceNodes((violations, id, node) => {
|
|
75
|
+
const rawEntries = this.format.graph.reduceNodes((acc, id, node) => {
|
|
104
76
|
if (!isNodeType(node, 'http-request')) {
|
|
105
|
-
return
|
|
77
|
+
return acc;
|
|
106
78
|
}
|
|
107
79
|
const responsesWithIds = this.format.getHttpResponsesOf(id);
|
|
108
80
|
const responses = responsesWithIds.map(([, res]) => res);
|
|
@@ -113,28 +85,29 @@ export class StaticApiContext {
|
|
|
113
85
|
if (!transactionId) {
|
|
114
86
|
throw new Error('Invalid HTTP transaction ID.');
|
|
115
87
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
});
|
|
88
|
+
const location = {
|
|
89
|
+
elementType: 'edge',
|
|
90
|
+
elementId: transactionId,
|
|
91
|
+
};
|
|
92
|
+
if (result === true) {
|
|
93
|
+
acc.push({ location, violation: {}, findings: [] });
|
|
123
94
|
}
|
|
124
|
-
else if (result
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
95
|
+
else if (result !== false &&
|
|
96
|
+
result !== undefined &&
|
|
97
|
+
result !== null) {
|
|
98
|
+
if (result.violation !== undefined) {
|
|
99
|
+
acc.push({
|
|
100
|
+
location,
|
|
101
|
+
violation: result.violation,
|
|
102
|
+
findings: result.findings ?? [],
|
|
103
|
+
});
|
|
104
|
+
}
|
|
132
105
|
}
|
|
133
106
|
}
|
|
134
107
|
}
|
|
135
|
-
return
|
|
136
|
-
}, [])
|
|
137
|
-
|
|
108
|
+
return acc;
|
|
109
|
+
}, []);
|
|
110
|
+
return rawEntries;
|
|
138
111
|
}
|
|
139
112
|
}
|
|
140
113
|
//# sourceMappingURL=static-api-context.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static-api-context.js","sourceRoot":"","sources":["../src/static-api-context.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,8BAA8B,EAE9B,UAAU,
|
|
1
|
+
{"version":3,"file":"static-api-context.js","sourceRoot":"","sources":["../src/static-api-context.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@thymian/plugin-http-linter",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.11-canary.20260624-288c194",
|
|
4
4
|
"description": "Thymian plugin for static linting of API descriptions against HTTP conformance rules",
|
|
5
5
|
"license": "AGPL-3.0-only",
|
|
6
6
|
"bugs": {
|
|
@@ -41,10 +41,10 @@
|
|
|
41
41
|
"!**/*.tsbuildinfo"
|
|
42
42
|
],
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@thymian/core": "0.1.
|
|
44
|
+
"@thymian/core": "0.1.11-canary.20260624-288c194",
|
|
45
45
|
"tslib": "^2.3.0"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
|
-
"@thymian/core-testing": "0.1.
|
|
48
|
+
"@thymian/core-testing": "0.1.11-canary.20260624-288c194"
|
|
49
49
|
}
|
|
50
50
|
}
|