@violetflux/eslint-plugin-kerros 0.2.3 → 0.3.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/dist/index.cjs +14 -12
- package/dist/index.mjs +14 -12
- package/package.json +2 -2
package/dist/index.cjs
CHANGED
|
@@ -80,6 +80,7 @@ function getTypeServices(context) {
|
|
|
80
80
|
//#region src/internal/kerros-types.ts
|
|
81
81
|
const markerNames = {
|
|
82
82
|
externalStoreProvider: "externalStoreProviderMarker",
|
|
83
|
+
storeGetter: "storeGetterMarker",
|
|
83
84
|
storeHook: "storeHookMarker",
|
|
84
85
|
storeInstanceHook: "storeInstanceHookMarker"
|
|
85
86
|
};
|
|
@@ -177,11 +178,11 @@ function createKerrosProgramTools(program) {
|
|
|
177
178
|
const returnType = checker.getReturnTypeOfSignature(signature);
|
|
178
179
|
const hookType = getTupleMemberType(returnType, 0, node);
|
|
179
180
|
if (!hookType || !hasMarker(hookType, "storeHook")) return void 0;
|
|
180
|
-
const
|
|
181
|
-
if (name === "createStore"
|
|
182
|
-
if (name !== "bindStore" || !
|
|
181
|
+
const thirdType = getTupleMemberType(returnType, 2, node);
|
|
182
|
+
if (name === "createStore") return !thirdType || hasMarker(thirdType, "storeGetter") ? "createStore" : void 0;
|
|
183
|
+
if (name !== "bindStore" || !thirdType) return void 0;
|
|
183
184
|
const providerType = getTupleMemberType(returnType, 1, node);
|
|
184
|
-
return providerType && hasMarker(providerType, "externalStoreProvider") && hasMarker(
|
|
185
|
+
return providerType && hasMarker(providerType, "externalStoreProvider") && hasMarker(thirdType, "storeInstanceHook") ? "bindStore" : void 0;
|
|
185
186
|
};
|
|
186
187
|
/** Test whether a call invokes a nominal Kerros Store Hook. */
|
|
187
188
|
const isStoreHookCall = (node) => {
|
|
@@ -301,10 +302,11 @@ const bindingNaming = createRule({
|
|
|
301
302
|
name: "binding-naming",
|
|
302
303
|
meta: {
|
|
303
304
|
type: "problem",
|
|
304
|
-
docs: { description: "Keep Kerros Hook and
|
|
305
|
+
docs: { description: "Keep Kerros Hook, Provider, and getter binding names aligned." },
|
|
305
306
|
schema: [],
|
|
306
307
|
messages: {
|
|
307
308
|
destructureBinding: "Kerros factory results must be destructured.",
|
|
309
|
+
getterName: "The Store getter must be named getXxx.",
|
|
308
310
|
hookName: "The Store Hook must be named useXxx.",
|
|
309
311
|
providerName: "The Provider name must match the Store Hook.",
|
|
310
312
|
instanceName: "The instance Hook name must match the Store Hook."
|
|
@@ -334,12 +336,12 @@ const bindingNaming = createRule({
|
|
|
334
336
|
}
|
|
335
337
|
const hook = getElement(declarator.id, 0);
|
|
336
338
|
const provider = getElement(declarator.id, 1);
|
|
337
|
-
const
|
|
339
|
+
const third = getElement(declarator.id, 2);
|
|
338
340
|
const explicitName = kind === "createStore" ? getCreateStoreName(node) : getBindStoreName(node);
|
|
339
341
|
const hookMatch = hook && /^use(?<name>[A-Z][A-Za-z0-9]*)$/u.exec(hook.name);
|
|
340
342
|
const providerMatch = provider && /^(?<name>[A-Z][A-Za-z0-9]*)Provider$/u.exec(provider.name);
|
|
341
|
-
const
|
|
342
|
-
const inferredName = hookMatch?.groups?.name ?? providerMatch?.groups?.name ??
|
|
343
|
+
const thirdMatch = third && (kind === "createStore" ? /^get(?<name>[A-Z][A-Za-z0-9]*)$/u.exec(third.name) : /^use(?<name>[A-Z][A-Za-z0-9]*)Instance$/u.exec(third.name));
|
|
344
|
+
const inferredName = hookMatch?.groups?.name ?? providerMatch?.groups?.name ?? thirdMatch?.groups?.name;
|
|
343
345
|
const name = explicitName ?? inferredName;
|
|
344
346
|
if (hook && (!hookMatch || name && hookMatch.groups?.name !== name)) context.report({
|
|
345
347
|
node: hook,
|
|
@@ -349,9 +351,9 @@ const bindingNaming = createRule({
|
|
|
349
351
|
node: provider,
|
|
350
352
|
messageId: "providerName"
|
|
351
353
|
});
|
|
352
|
-
if (
|
|
353
|
-
node:
|
|
354
|
-
messageId: "instanceName"
|
|
354
|
+
if (third && (!thirdMatch || name && thirdMatch.groups?.name !== name)) context.report({
|
|
355
|
+
node: third,
|
|
356
|
+
messageId: kind === "createStore" ? "getterName" : "instanceName"
|
|
355
357
|
});
|
|
356
358
|
} };
|
|
357
359
|
}
|
|
@@ -2449,7 +2451,7 @@ const rules = {
|
|
|
2449
2451
|
const plugin = {
|
|
2450
2452
|
meta: {
|
|
2451
2453
|
name: "@violetflux/eslint-plugin-kerros",
|
|
2452
|
-
version: "0.
|
|
2454
|
+
version: "0.3.0"
|
|
2453
2455
|
},
|
|
2454
2456
|
rules
|
|
2455
2457
|
};
|
package/dist/index.mjs
CHANGED
|
@@ -52,6 +52,7 @@ function getTypeServices(context) {
|
|
|
52
52
|
//#region src/internal/kerros-types.ts
|
|
53
53
|
const markerNames = {
|
|
54
54
|
externalStoreProvider: "externalStoreProviderMarker",
|
|
55
|
+
storeGetter: "storeGetterMarker",
|
|
55
56
|
storeHook: "storeHookMarker",
|
|
56
57
|
storeInstanceHook: "storeInstanceHookMarker"
|
|
57
58
|
};
|
|
@@ -149,11 +150,11 @@ function createKerrosProgramTools(program) {
|
|
|
149
150
|
const returnType = checker.getReturnTypeOfSignature(signature);
|
|
150
151
|
const hookType = getTupleMemberType(returnType, 0, node);
|
|
151
152
|
if (!hookType || !hasMarker(hookType, "storeHook")) return void 0;
|
|
152
|
-
const
|
|
153
|
-
if (name === "createStore"
|
|
154
|
-
if (name !== "bindStore" || !
|
|
153
|
+
const thirdType = getTupleMemberType(returnType, 2, node);
|
|
154
|
+
if (name === "createStore") return !thirdType || hasMarker(thirdType, "storeGetter") ? "createStore" : void 0;
|
|
155
|
+
if (name !== "bindStore" || !thirdType) return void 0;
|
|
155
156
|
const providerType = getTupleMemberType(returnType, 1, node);
|
|
156
|
-
return providerType && hasMarker(providerType, "externalStoreProvider") && hasMarker(
|
|
157
|
+
return providerType && hasMarker(providerType, "externalStoreProvider") && hasMarker(thirdType, "storeInstanceHook") ? "bindStore" : void 0;
|
|
157
158
|
};
|
|
158
159
|
/** Test whether a call invokes a nominal Kerros Store Hook. */
|
|
159
160
|
const isStoreHookCall = (node) => {
|
|
@@ -273,10 +274,11 @@ const bindingNaming = createRule({
|
|
|
273
274
|
name: "binding-naming",
|
|
274
275
|
meta: {
|
|
275
276
|
type: "problem",
|
|
276
|
-
docs: { description: "Keep Kerros Hook and
|
|
277
|
+
docs: { description: "Keep Kerros Hook, Provider, and getter binding names aligned." },
|
|
277
278
|
schema: [],
|
|
278
279
|
messages: {
|
|
279
280
|
destructureBinding: "Kerros factory results must be destructured.",
|
|
281
|
+
getterName: "The Store getter must be named getXxx.",
|
|
280
282
|
hookName: "The Store Hook must be named useXxx.",
|
|
281
283
|
providerName: "The Provider name must match the Store Hook.",
|
|
282
284
|
instanceName: "The instance Hook name must match the Store Hook."
|
|
@@ -306,12 +308,12 @@ const bindingNaming = createRule({
|
|
|
306
308
|
}
|
|
307
309
|
const hook = getElement(declarator.id, 0);
|
|
308
310
|
const provider = getElement(declarator.id, 1);
|
|
309
|
-
const
|
|
311
|
+
const third = getElement(declarator.id, 2);
|
|
310
312
|
const explicitName = kind === "createStore" ? getCreateStoreName(node) : getBindStoreName(node);
|
|
311
313
|
const hookMatch = hook && /^use(?<name>[A-Z][A-Za-z0-9]*)$/u.exec(hook.name);
|
|
312
314
|
const providerMatch = provider && /^(?<name>[A-Z][A-Za-z0-9]*)Provider$/u.exec(provider.name);
|
|
313
|
-
const
|
|
314
|
-
const inferredName = hookMatch?.groups?.name ?? providerMatch?.groups?.name ??
|
|
315
|
+
const thirdMatch = third && (kind === "createStore" ? /^get(?<name>[A-Z][A-Za-z0-9]*)$/u.exec(third.name) : /^use(?<name>[A-Z][A-Za-z0-9]*)Instance$/u.exec(third.name));
|
|
316
|
+
const inferredName = hookMatch?.groups?.name ?? providerMatch?.groups?.name ?? thirdMatch?.groups?.name;
|
|
315
317
|
const name = explicitName ?? inferredName;
|
|
316
318
|
if (hook && (!hookMatch || name && hookMatch.groups?.name !== name)) context.report({
|
|
317
319
|
node: hook,
|
|
@@ -321,9 +323,9 @@ const bindingNaming = createRule({
|
|
|
321
323
|
node: provider,
|
|
322
324
|
messageId: "providerName"
|
|
323
325
|
});
|
|
324
|
-
if (
|
|
325
|
-
node:
|
|
326
|
-
messageId: "instanceName"
|
|
326
|
+
if (third && (!thirdMatch || name && thirdMatch.groups?.name !== name)) context.report({
|
|
327
|
+
node: third,
|
|
328
|
+
messageId: kind === "createStore" ? "getterName" : "instanceName"
|
|
327
329
|
});
|
|
328
330
|
} };
|
|
329
331
|
}
|
|
@@ -2421,7 +2423,7 @@ const rules = {
|
|
|
2421
2423
|
const plugin = {
|
|
2422
2424
|
meta: {
|
|
2423
2425
|
name: "@violetflux/eslint-plugin-kerros",
|
|
2424
|
-
version: "0.
|
|
2426
|
+
version: "0.3.0"
|
|
2425
2427
|
},
|
|
2426
2428
|
rules
|
|
2427
2429
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@violetflux/eslint-plugin-kerros",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Type-aware ESLint rules for Kerros stores.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
},
|
|
36
36
|
"peerDependencies": {
|
|
37
37
|
"@typescript-eslint/parser": "^8.0.0",
|
|
38
|
-
"@violetflux/kerros": "^0.
|
|
38
|
+
"@violetflux/kerros": "^0.3.0",
|
|
39
39
|
"eslint": "^9.0.0 || ^10.0.0",
|
|
40
40
|
"typescript": "^5.0.0 || >=6.0.0 <6.1.0"
|
|
41
41
|
},
|