@violetflux/eslint-plugin-kerros 0.2.4 → 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 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 instanceType = getTupleMemberType(returnType, 2, node);
181
- if (name === "createStore" && !instanceType) return "createStore";
182
- if (name !== "bindStore" || !instanceType) return void 0;
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(instanceType, "storeInstanceHook") ? "bindStore" : void 0;
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 Provider binding names aligned." },
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 instance = getElement(declarator.id, 2);
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 instanceMatch = instance && /^use(?<name>[A-Z][A-Za-z0-9]*)Instance$/u.exec(instance.name);
342
- const inferredName = hookMatch?.groups?.name ?? providerMatch?.groups?.name ?? instanceMatch?.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 (instance && (!instanceMatch || name && instanceMatch.groups?.name !== name)) context.report({
353
- node: instance,
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.2.4"
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 instanceType = getTupleMemberType(returnType, 2, node);
153
- if (name === "createStore" && !instanceType) return "createStore";
154
- if (name !== "bindStore" || !instanceType) return void 0;
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(instanceType, "storeInstanceHook") ? "bindStore" : void 0;
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 Provider binding names aligned." },
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 instance = getElement(declarator.id, 2);
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 instanceMatch = instance && /^use(?<name>[A-Z][A-Za-z0-9]*)Instance$/u.exec(instance.name);
314
- const inferredName = hookMatch?.groups?.name ?? providerMatch?.groups?.name ?? instanceMatch?.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 (instance && (!instanceMatch || name && instanceMatch.groups?.name !== name)) context.report({
325
- node: instance,
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.2.4"
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.2.4",
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.2.4",
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
  },