@agilebot/eslint-plugin 0.2.6 → 0.3.1

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.
Files changed (2) hide show
  1. package/dist/index.js +246 -246
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license @agilebot/eslint-plugin v0.2.6
2
+ * @license @agilebot/eslint-plugin v0.3.1
3
3
  *
4
4
  * Copyright (c) Agilebot, Inc. and its affiliates.
5
5
  *
@@ -521,6 +521,251 @@ var noDefault = {
521
521
  }
522
522
  };
523
523
 
524
+ function getBasicIdentifier(node) {
525
+ if (node.type === 'Identifier') {
526
+ return node.name;
527
+ }
528
+ if (node.type === 'Literal') {
529
+ return node.value;
530
+ }
531
+ if (node.type === 'TemplateLiteral') {
532
+ if (node.expressions.length > 0) {
533
+ return null;
534
+ }
535
+ return node.quasis[0].value.raw;
536
+ }
537
+ return null;
538
+ }
539
+ function getBaseIdentifier(node) {
540
+ switch (node.type) {
541
+ case 'Identifier': {
542
+ return node;
543
+ }
544
+ case 'CallExpression': {
545
+ return getBaseIdentifier(node.callee);
546
+ }
547
+ case 'MemberExpression': {
548
+ return getBaseIdentifier(node.object);
549
+ }
550
+ }
551
+ return null;
552
+ }
553
+ function getStyesObj(node) {
554
+ const isMakeStyles = node.callee.name === 'makeStyles';
555
+ const isModernApi =
556
+ node.callee.type === 'MemberExpression' &&
557
+ node.callee.property.name === 'create' &&
558
+ getBaseIdentifier(node.callee.object) &&
559
+ getBaseIdentifier(node.callee.object).name === 'tss';
560
+ if (!isMakeStyles && !isModernApi) {
561
+ return;
562
+ }
563
+ const styles = (() => {
564
+ if (isMakeStyles) {
565
+ return node.parent.arguments[0];
566
+ }
567
+ if (isModernApi) {
568
+ return node.callee.parent.arguments[0];
569
+ }
570
+ })();
571
+ if (!styles) {
572
+ return;
573
+ }
574
+ switch (styles.type) {
575
+ case 'ObjectExpression':
576
+ return styles;
577
+ case 'ArrowFunctionExpression':
578
+ {
579
+ const { body } = styles;
580
+ switch (body.type) {
581
+ case 'ObjectExpression':
582
+ return body;
583
+ case 'BlockStatement': {
584
+ let stylesObj;
585
+ body.body.forEach(bodyNode => {
586
+ if (
587
+ bodyNode.type === 'ReturnStatement' &&
588
+ bodyNode.argument.type === 'ObjectExpression'
589
+ ) {
590
+ stylesObj = bodyNode.argument;
591
+ }
592
+ });
593
+ return stylesObj;
594
+ }
595
+ }
596
+ }
597
+ break;
598
+ }
599
+ }
600
+
601
+ var classNaming = {
602
+ meta: {
603
+ type: 'problem'
604
+ },
605
+ create: function rule(context) {
606
+ return {
607
+ CallExpression(node) {
608
+ const stylesObj = getStyesObj(node);
609
+ if (stylesObj === undefined) {
610
+ return;
611
+ }
612
+ stylesObj.properties.forEach(property => {
613
+ if (property.computed) {
614
+ return;
615
+ }
616
+ if (
617
+ property.type === 'ExperimentalSpreadProperty' ||
618
+ property.type === 'SpreadElement'
619
+ ) {
620
+ return;
621
+ }
622
+ const className = property.key.value || property.key.name;
623
+ if (!eslintUtils.isCamelCase(className)) {
624
+ context.report({
625
+ node: property,
626
+ message: `Class \`${className}\` must be camelCase in TSS.`
627
+ });
628
+ }
629
+ });
630
+ }
631
+ };
632
+ }
633
+ };
634
+
635
+ var noColorValue = {
636
+ meta: {
637
+ type: 'problem',
638
+ docs: {
639
+ description:
640
+ 'Enforce the use of color variables instead of color codes within TSS'
641
+ }
642
+ },
643
+ create: function (context) {
644
+ const parserOptions = context.parserOptions;
645
+ if (!parserOptions || !parserOptions.project) {
646
+ return {};
647
+ }
648
+ return {
649
+ CallExpression(node) {
650
+ const stylesObj = getStyesObj(node);
651
+ if (!stylesObj) {
652
+ return;
653
+ }
654
+ function checkColorLiteral(value) {
655
+ if (value.type === 'Literal' && typeof value.value === 'string') {
656
+ const colorCodePattern =
657
+ /#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})|rgb\?\(\s*(\d{1,3}\s*,\s*){2}\d{1,3}(?:\s*,\s*\d*(?:\.\d+)?)?\s*\)/g;
658
+ const isColorCode = colorCodePattern.test(value.value);
659
+ if (isColorCode) {
660
+ context.report({
661
+ node: value,
662
+ message: 'Use color variables instead of color codes in TSS.'
663
+ });
664
+ }
665
+ }
666
+ }
667
+ function loopStylesObj(obj) {
668
+ if (obj && obj.type === 'ObjectExpression') {
669
+ obj.properties.forEach(property => {
670
+ if (property.type === 'Property' && property.value) {
671
+ if (property.value.type === 'ObjectExpression') {
672
+ loopStylesObj(property.value);
673
+ } else {
674
+ checkColorLiteral(property.value);
675
+ }
676
+ }
677
+ });
678
+ }
679
+ }
680
+ loopStylesObj(stylesObj);
681
+ }
682
+ };
683
+ }
684
+ };
685
+
686
+ var unusedClasses = {
687
+ meta: {
688
+ type: 'problem'
689
+ },
690
+ create: function rule(context) {
691
+ const usedClasses = {};
692
+ const definedClasses = {};
693
+ return {
694
+ CallExpression(node) {
695
+ const stylesObj = getStyesObj(node);
696
+ if (stylesObj === undefined) {
697
+ return;
698
+ }
699
+ stylesObj.properties.forEach(property => {
700
+ if (property.computed) {
701
+ return;
702
+ }
703
+ if (
704
+ property.type === 'ExperimentalSpreadProperty' ||
705
+ property.type === 'SpreadElement'
706
+ ) {
707
+ return;
708
+ }
709
+ definedClasses[property.key.value || property.key.name] = property;
710
+ });
711
+ },
712
+ MemberExpression(node) {
713
+ if (
714
+ node.object.type === 'Identifier' &&
715
+ node.object.name === 'classes'
716
+ ) {
717
+ const whichClass = getBasicIdentifier(node.property);
718
+ if (whichClass) {
719
+ usedClasses[whichClass] = true;
720
+ }
721
+ return;
722
+ }
723
+ const classIdentifier = getBasicIdentifier(node.property);
724
+ if (!classIdentifier) {
725
+ return;
726
+ }
727
+ if (classIdentifier !== 'classes') {
728
+ return;
729
+ }
730
+ const { parent } = node;
731
+ if (parent.type !== 'MemberExpression') {
732
+ return;
733
+ }
734
+ if (
735
+ node.object.object &&
736
+ node.object.object.type !== 'ThisExpression'
737
+ ) {
738
+ return;
739
+ }
740
+ const propsIdentifier = getBasicIdentifier(parent.object);
741
+ if (propsIdentifier && propsIdentifier !== 'props') {
742
+ return;
743
+ }
744
+ if (!propsIdentifier && parent.object.type !== 'MemberExpression') {
745
+ return;
746
+ }
747
+ if (parent.parent.type === 'MemberExpression') {
748
+ return;
749
+ }
750
+ const parentClassIdentifier = getBasicIdentifier(parent.property);
751
+ if (parentClassIdentifier) {
752
+ usedClasses[parentClassIdentifier] = true;
753
+ }
754
+ },
755
+ 'Program:exit': () => {
756
+ Object.keys(definedClasses).forEach(definedClassKey => {
757
+ if (!usedClasses[definedClassKey]) {
758
+ context.report({
759
+ node: definedClasses[definedClassKey],
760
+ message: `Class \`${definedClassKey}\` is unused`
761
+ });
762
+ }
763
+ });
764
+ }
765
+ };
766
+ }
767
+ };
768
+
524
769
  var betterExhaustiveDeps = {
525
770
  meta: {
526
771
  type: 'suggestion',
@@ -2287,251 +2532,6 @@ var noUnnecessaryTemplateLiterals = {
2287
2532
  }
2288
2533
  };
2289
2534
 
2290
- function getBasicIdentifier(node) {
2291
- if (node.type === 'Identifier') {
2292
- return node.name;
2293
- }
2294
- if (node.type === 'Literal') {
2295
- return node.value;
2296
- }
2297
- if (node.type === 'TemplateLiteral') {
2298
- if (node.expressions.length > 0) {
2299
- return null;
2300
- }
2301
- return node.quasis[0].value.raw;
2302
- }
2303
- return null;
2304
- }
2305
- function getBaseIdentifier(node) {
2306
- switch (node.type) {
2307
- case 'Identifier': {
2308
- return node;
2309
- }
2310
- case 'CallExpression': {
2311
- return getBaseIdentifier(node.callee);
2312
- }
2313
- case 'MemberExpression': {
2314
- return getBaseIdentifier(node.object);
2315
- }
2316
- }
2317
- return null;
2318
- }
2319
- function getStyesObj(node) {
2320
- const isMakeStyles = node.callee.name === 'makeStyles';
2321
- const isModernApi =
2322
- node.callee.type === 'MemberExpression' &&
2323
- node.callee.property.name === 'create' &&
2324
- getBaseIdentifier(node.callee.object) &&
2325
- getBaseIdentifier(node.callee.object).name === 'tss';
2326
- if (!isMakeStyles && !isModernApi) {
2327
- return;
2328
- }
2329
- const styles = (() => {
2330
- if (isMakeStyles) {
2331
- return node.parent.arguments[0];
2332
- }
2333
- if (isModernApi) {
2334
- return node.callee.parent.arguments[0];
2335
- }
2336
- })();
2337
- if (!styles) {
2338
- return;
2339
- }
2340
- switch (styles.type) {
2341
- case 'ObjectExpression':
2342
- return styles;
2343
- case 'ArrowFunctionExpression':
2344
- {
2345
- const { body } = styles;
2346
- switch (body.type) {
2347
- case 'ObjectExpression':
2348
- return body;
2349
- case 'BlockStatement': {
2350
- let stylesObj;
2351
- body.body.forEach(bodyNode => {
2352
- if (
2353
- bodyNode.type === 'ReturnStatement' &&
2354
- bodyNode.argument.type === 'ObjectExpression'
2355
- ) {
2356
- stylesObj = bodyNode.argument;
2357
- }
2358
- });
2359
- return stylesObj;
2360
- }
2361
- }
2362
- }
2363
- break;
2364
- }
2365
- }
2366
-
2367
- var classNaming = {
2368
- meta: {
2369
- type: 'problem'
2370
- },
2371
- create: function rule(context) {
2372
- return {
2373
- CallExpression(node) {
2374
- const stylesObj = getStyesObj(node);
2375
- if (stylesObj === undefined) {
2376
- return;
2377
- }
2378
- stylesObj.properties.forEach(property => {
2379
- if (property.computed) {
2380
- return;
2381
- }
2382
- if (
2383
- property.type === 'ExperimentalSpreadProperty' ||
2384
- property.type === 'SpreadElement'
2385
- ) {
2386
- return;
2387
- }
2388
- const className = property.key.value || property.key.name;
2389
- if (!eslintUtils.isCamelCase(className)) {
2390
- context.report({
2391
- node: property,
2392
- message: `Class \`${className}\` must be camelCase in TSS.`
2393
- });
2394
- }
2395
- });
2396
- }
2397
- };
2398
- }
2399
- };
2400
-
2401
- var noColorValue = {
2402
- meta: {
2403
- type: 'problem',
2404
- docs: {
2405
- description:
2406
- 'Enforce the use of color variables instead of color codes within TSS'
2407
- }
2408
- },
2409
- create: function (context) {
2410
- const parserOptions = context.parserOptions;
2411
- if (!parserOptions || !parserOptions.project) {
2412
- return {};
2413
- }
2414
- return {
2415
- CallExpression(node) {
2416
- const stylesObj = getStyesObj(node);
2417
- if (!stylesObj) {
2418
- return;
2419
- }
2420
- function checkColorLiteral(value) {
2421
- if (value.type === 'Literal' && typeof value.value === 'string') {
2422
- const colorCodePattern =
2423
- /#(?:[0-9a-fA-F]{3}|[0-9a-fA-F]{6}|[0-9a-fA-F]{8})|rgb\?\(\s*(\d{1,3}\s*,\s*){2}\d{1,3}(?:\s*,\s*\d*(?:\.\d+)?)?\s*\)/g;
2424
- const isColorCode = colorCodePattern.test(value.value);
2425
- if (isColorCode) {
2426
- context.report({
2427
- node: value,
2428
- message: 'Use color variables instead of color codes in TSS.'
2429
- });
2430
- }
2431
- }
2432
- }
2433
- function loopStylesObj(obj) {
2434
- if (obj && obj.type === 'ObjectExpression') {
2435
- obj.properties.forEach(property => {
2436
- if (property.type === 'Property' && property.value) {
2437
- if (property.value.type === 'ObjectExpression') {
2438
- loopStylesObj(property.value);
2439
- } else {
2440
- checkColorLiteral(property.value);
2441
- }
2442
- }
2443
- });
2444
- }
2445
- }
2446
- loopStylesObj(stylesObj);
2447
- }
2448
- };
2449
- }
2450
- };
2451
-
2452
- var unusedClasses = {
2453
- meta: {
2454
- type: 'problem'
2455
- },
2456
- create: function rule(context) {
2457
- const usedClasses = {};
2458
- const definedClasses = {};
2459
- return {
2460
- CallExpression(node) {
2461
- const stylesObj = getStyesObj(node);
2462
- if (stylesObj === undefined) {
2463
- return;
2464
- }
2465
- stylesObj.properties.forEach(property => {
2466
- if (property.computed) {
2467
- return;
2468
- }
2469
- if (
2470
- property.type === 'ExperimentalSpreadProperty' ||
2471
- property.type === 'SpreadElement'
2472
- ) {
2473
- return;
2474
- }
2475
- definedClasses[property.key.value || property.key.name] = property;
2476
- });
2477
- },
2478
- MemberExpression(node) {
2479
- if (
2480
- node.object.type === 'Identifier' &&
2481
- node.object.name === 'classes'
2482
- ) {
2483
- const whichClass = getBasicIdentifier(node.property);
2484
- if (whichClass) {
2485
- usedClasses[whichClass] = true;
2486
- }
2487
- return;
2488
- }
2489
- const classIdentifier = getBasicIdentifier(node.property);
2490
- if (!classIdentifier) {
2491
- return;
2492
- }
2493
- if (classIdentifier !== 'classes') {
2494
- return;
2495
- }
2496
- const { parent } = node;
2497
- if (parent.type !== 'MemberExpression') {
2498
- return;
2499
- }
2500
- if (
2501
- node.object.object &&
2502
- node.object.object.type !== 'ThisExpression'
2503
- ) {
2504
- return;
2505
- }
2506
- const propsIdentifier = getBasicIdentifier(parent.object);
2507
- if (propsIdentifier && propsIdentifier !== 'props') {
2508
- return;
2509
- }
2510
- if (!propsIdentifier && parent.object.type !== 'MemberExpression') {
2511
- return;
2512
- }
2513
- if (parent.parent.type === 'MemberExpression') {
2514
- return;
2515
- }
2516
- const parentClassIdentifier = getBasicIdentifier(parent.property);
2517
- if (parentClassIdentifier) {
2518
- usedClasses[parentClassIdentifier] = true;
2519
- }
2520
- },
2521
- 'Program:exit': () => {
2522
- Object.keys(definedClasses).forEach(definedClassKey => {
2523
- if (!usedClasses[definedClassKey]) {
2524
- context.report({
2525
- node: definedClasses[definedClassKey],
2526
- message: `Class \`${definedClassKey}\` is unused`
2527
- });
2528
- }
2529
- });
2530
- }
2531
- };
2532
- }
2533
- };
2534
-
2535
2535
  var ruleFiles = /*#__PURE__*/Object.freeze({
2536
2536
  __proto__: null,
2537
2537
  rules_import_enforce_icon_alias: enforceIconAlias,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agilebot/eslint-plugin",
3
- "version": "0.2.6",
3
+ "version": "0.3.1",
4
4
  "description": "Agilebot's ESLint plugin",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -18,9 +18,9 @@
18
18
  "node": "^18.18.0 || >=20.0.0"
19
19
  },
20
20
  "dependencies": {
21
- "@typescript-eslint/utils": "^7.6.0",
21
+ "@typescript-eslint/utils": "~7.7.0",
22
22
  "eslint-plugin-react": "^7.34.1",
23
- "@agilebot/eslint-utils": "0.2.6"
23
+ "@agilebot/eslint-utils": "0.3.1"
24
24
  },
25
25
  "peerDependencies": {
26
26
  "eslint": "^7.0.0 || ^8.0.0"