@effect/language-service 0.23.2 → 0.23.4

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect/language-service",
3
- "version": "0.23.2",
3
+ "version": "0.23.4",
4
4
  "description": "A Language-Service Plugin to Refactor and Diagnostic effect-ts projects",
5
5
  "main": "index.cjs",
6
6
  "repository": {
package/transform.js CHANGED
@@ -734,6 +734,9 @@ var isRight2 = isRight;
734
734
  var map = /* @__PURE__ */ dual(2, (self, f) => isRight2(self) ? right2(f(self.right)) : left2(self.left));
735
735
  var getOrElse = /* @__PURE__ */ dual(2, (self, onLeft) => isLeft2(self) ? onLeft(self.left) : self.right);
736
736
 
737
+ // node_modules/.pnpm/effect@3.16.5/node_modules/effect/dist/esm/internal/array.js
738
+ var isNonEmptyArray = (self) => self.length > 0;
739
+
737
740
  // node_modules/.pnpm/effect@3.16.5/node_modules/effect/dist/esm/Order.js
738
741
  var make = (compare) => (self, that) => self === that ? 0 : compare(self, that);
739
742
 
@@ -754,6 +757,19 @@ var fromIterable = (collection) => Array.isArray(collection) ? collection : Arra
754
757
  var append = /* @__PURE__ */ dual(2, (self, last) => [...self, last]);
755
758
  var appendAll = /* @__PURE__ */ dual(2, (self, that) => fromIterable(self).concat(fromIterable(that)));
756
759
  var isArray = Array.isArray;
760
+ var isEmptyArray = (self) => self.length === 0;
761
+ var isEmptyReadonlyArray = isEmptyArray;
762
+ var isNonEmptyReadonlyArray = isNonEmptyArray;
763
+ var isOutOfBounds = (i, as) => i < 0 || i >= as.length;
764
+ var unsafeGet = /* @__PURE__ */ dual(2, (self, index) => {
765
+ const i = Math.floor(index);
766
+ if (isOutOfBounds(i, self)) {
767
+ throw new Error(`Index ${i} out of bounds`);
768
+ }
769
+ return self[i];
770
+ });
771
+ var headNonEmpty = /* @__PURE__ */ unsafeGet(0);
772
+ var tailNonEmpty = (self) => self.slice(1);
757
773
  var sort = /* @__PURE__ */ dual(2, (self, O) => {
758
774
  const out = Array.from(self);
759
775
  out.sort(O);
@@ -775,6 +791,20 @@ var intersectionWith = (isEquivalent) => {
775
791
  var intersection = /* @__PURE__ */ intersectionWith(_equivalence);
776
792
  var empty = () => [];
777
793
  var map2 = /* @__PURE__ */ dual(2, (self, f) => self.map(f));
794
+ var flatMap = /* @__PURE__ */ dual(2, (self, f) => {
795
+ if (isEmptyReadonlyArray(self)) {
796
+ return [];
797
+ }
798
+ const out = [];
799
+ for (let i = 0; i < self.length; i++) {
800
+ const inner = f(self[i], i);
801
+ for (let j = 0; j < inner.length; j++) {
802
+ out.push(inner[j]);
803
+ }
804
+ }
805
+ return out;
806
+ });
807
+ var flatten = /* @__PURE__ */ flatMap(identity);
778
808
  var filter = /* @__PURE__ */ dual(2, (self, predicate) => {
779
809
  const as = fromIterable(self);
780
810
  const out = [];
@@ -785,6 +815,21 @@ var filter = /* @__PURE__ */ dual(2, (self, predicate) => {
785
815
  }
786
816
  return out;
787
817
  });
818
+ var dedupeWith = /* @__PURE__ */ dual(2, (self, isEquivalent) => {
819
+ const input = fromIterable(self);
820
+ if (isNonEmptyReadonlyArray(input)) {
821
+ const out = [headNonEmpty(input)];
822
+ const rest = tailNonEmpty(input);
823
+ for (const r of rest) {
824
+ if (out.every((a) => !isEquivalent(r, a))) {
825
+ out.push(r);
826
+ }
827
+ }
828
+ return out;
829
+ }
830
+ return [];
831
+ });
832
+ var dedupe = (self) => dedupeWith(self, equivalence());
788
833
 
789
834
  // src/core/Nano.ts
790
835
  function makeInternalSuccess(value) {
@@ -861,7 +906,7 @@ var sync = (value) => {
861
906
  };
862
907
  return nano;
863
908
  };
864
- var flatMap = dual(2, (fa, f) => make2((ctx) => {
909
+ var flatMap2 = dual(2, (fa, f) => make2((ctx) => {
865
910
  const result = fa.run(ctx);
866
911
  if (result._tag !== "Right") return result;
867
912
  return f(result.value).run(ctx);
@@ -1010,14 +1055,43 @@ function parsePackageContentNameAndVersionFromScope(v) {
1010
1055
  if (!isString(name)) return;
1011
1056
  if (!isString(version)) return;
1012
1057
  const hasEffectInPeerDependencies = hasProperty(packageJsonContent, "peerDependencies") && isObject(packageJsonContent.peerDependencies) && hasProperty(packageJsonContent.peerDependencies, "effect");
1058
+ const referencedPackages = Object.keys({
1059
+ ...hasProperty(packageJsonContent, "dependencies") && isObject(packageJsonContent.dependencies) ? packageJsonContent.dependencies : {},
1060
+ ...hasProperty(packageJsonContent, "peerDependencies") && isObject(packageJsonContent.peerDependencies) ? packageJsonContent.peerDependencies : {},
1061
+ ...hasProperty(packageJsonContent, "devDependencies") && isObject(packageJsonContent.devDependencies) ? packageJsonContent.devDependencies : {}
1062
+ });
1013
1063
  return {
1014
1064
  name: name.toLowerCase(),
1015
1065
  version: version.toLowerCase(),
1016
1066
  hasEffectInPeerDependencies,
1017
1067
  contents: packageJsonContent,
1018
- packageDirectory: packageJsonScope.packageDirectory
1068
+ packageDirectory: packageJsonScope.packageDirectory,
1069
+ referencedPackages
1019
1070
  };
1020
1071
  }
1072
+ var resolveModulePattern = fn("resolveModulePattern")(
1073
+ function* (sourceFile, pattern) {
1074
+ if (pattern.indexOf("*") === -1) return [pattern.toLowerCase()];
1075
+ const ts = yield* service(TypeScriptApi);
1076
+ const packageJsonScope = parsePackageContentNameAndVersionFromScope(sourceFile);
1077
+ const referencedPackages = [];
1078
+ for (const statement of sourceFile.statements) {
1079
+ if (ts.isImportDeclaration(statement) && ts.isStringLiteral(statement.moduleSpecifier)) {
1080
+ const moduleSpecifier = statement.moduleSpecifier.text.toLowerCase();
1081
+ const packageName = moduleSpecifier.startsWith("@") ? moduleSpecifier.split("/", 2).join("/") : moduleSpecifier.split("/", 1).join("/");
1082
+ referencedPackages.push(packageName);
1083
+ }
1084
+ }
1085
+ return pipe(
1086
+ referencedPackages.concat(packageJsonScope?.referencedPackages || []),
1087
+ dedupe,
1088
+ map2((packageName) => packageName.toLowerCase()),
1089
+ filter(
1090
+ (packageName) => pattern.endsWith("*") && packageName.startsWith(pattern.toLowerCase().substring(0, pattern.length - 1))
1091
+ )
1092
+ );
1093
+ }
1094
+ );
1021
1095
  function makeGetModuleSpecifier(ts) {
1022
1096
  if (!(hasProperty(ts, "moduleSpecifiers") && hasProperty(ts.moduleSpecifiers, "getModuleSpecifier") && isFunction2(ts.moduleSpecifiers.getModuleSpecifier))) return;
1023
1097
  const _internal = ts.moduleSpecifiers.getModuleSpecifier;
@@ -1187,7 +1261,7 @@ var createDiagnosticExecutor = fn("LSP.createCommentDirectivesProcessor")(
1187
1261
  const fixByDisableNextLine = (_) => ({
1188
1262
  fixName: rule.name + "_skipNextLine",
1189
1263
  description: "Disable " + rule.name + " for this line",
1190
- apply: flatMap(
1264
+ apply: flatMap2(
1191
1265
  service(ChangeTracker),
1192
1266
  (changeTracker) => sync(() => {
1193
1267
  const disableAtNode = findParentStatementForDisableNextLine(_.node);
@@ -1204,7 +1278,7 @@ var createDiagnosticExecutor = fn("LSP.createCommentDirectivesProcessor")(
1204
1278
  const fixByDisableEntireFile = {
1205
1279
  fixName: rule.name + "_skipFile",
1206
1280
  description: "Disable " + rule.name + " for this entire file",
1207
- apply: flatMap(
1281
+ apply: flatMap2(
1208
1282
  service(ChangeTracker),
1209
1283
  (changeTracker) => sync(
1210
1284
  () => changeTracker.insertText(
@@ -2500,7 +2574,14 @@ var importFromBarrel = createDiagnostic({
2500
2574
  const ts = yield* service(TypeScriptApi);
2501
2575
  const typeChecker = yield* service(TypeCheckerApi);
2502
2576
  const program = yield* service(TypeScriptProgram);
2503
- const isImportedFromBarrelExport = (element, languageServicePluginOptions2) => {
2577
+ const packageNamesToCheck = flatten(
2578
+ yield* all(
2579
+ ...languageServicePluginOptions.namespaceImportPackages.map(
2580
+ (packageName) => resolveModulePattern(sourceFile, packageName)
2581
+ )
2582
+ )
2583
+ );
2584
+ const isImportedFromBarrelExport = (element) => {
2504
2585
  const getModuleSpecifier = makeGetModuleSpecifier(ts);
2505
2586
  const resolveExternalModuleName = makeResolveExternalModuleName(typeChecker);
2506
2587
  if (!(getModuleSpecifier && resolveExternalModuleName)) return;
@@ -2513,7 +2594,7 @@ var importFromBarrel = createDiagnostic({
2513
2594
  if (!namedBindings) return;
2514
2595
  if (!ts.isNamedImports(namedBindings)) return;
2515
2596
  const barrelModuleName = importDeclaration.moduleSpecifier.text;
2516
- if (languageServicePluginOptions2.namespaceImportPackages.indexOf(barrelModuleName.toLowerCase()) === -1) return;
2597
+ if (packageNamesToCheck.indexOf(barrelModuleName.toLowerCase()) === -1) return;
2517
2598
  const moduleSymbol = resolveExternalModuleName(importDeclaration.moduleSpecifier);
2518
2599
  if (!moduleSymbol) return;
2519
2600
  if (!moduleSymbol.exports) return;
@@ -2556,7 +2637,7 @@ var importFromBarrel = createDiagnostic({
2556
2637
  ts.forEachChild(node, appendNodeToVisit);
2557
2638
  continue;
2558
2639
  }
2559
- const result = isImportedFromBarrelExport(node, languageServicePluginOptions);
2640
+ const result = isImportedFromBarrelExport(node);
2560
2641
  if (!result) continue;
2561
2642
  const { barrelModuleName, importClause, importDeclaration, importedName, namedBindings, unbarrelledFileName } = result;
2562
2643
  report({
@@ -2694,7 +2775,7 @@ More info at https://effect.website/docs/requirements-management/layers/#avoidin
2694
2775
  for (const [type, reportAt] of typesToCheck) {
2695
2776
  yield* pipe(
2696
2777
  typeParser.contextTag(type, node),
2697
- flatMap(
2778
+ flatMap2(
2698
2779
  ({ Service }) => pipe(
2699
2780
  parseLeakedRequirements(Service, node),
2700
2781
  map3((requirements) => reportLeakingRequirements(reportAt, sort(requirements, typeOrder)))
@@ -2722,7 +2803,7 @@ var missingEffectContext = createDiagnostic({
2722
2803
  typeParser.effectType(expectedType, node),
2723
2804
  typeParser.effectType(realType, valueNode)
2724
2805
  ),
2725
- flatMap(
2806
+ flatMap2(
2726
2807
  ([expectedEffect, realEffect]) => getMissingTypeEntriesInTargetType(
2727
2808
  realEffect.R,
2728
2809
  expectedEffect.R
@@ -2770,7 +2851,7 @@ var missingEffectError = createDiagnostic({
2770
2851
  typeParser.effectType(expectedType, node),
2771
2852
  typeParser.effectType(realType, valueNode)
2772
2853
  ),
2773
- flatMap(
2854
+ flatMap2(
2774
2855
  ([expectedEffect, realEffect]) => getMissingTypeEntriesInTargetType(
2775
2856
  realEffect.E,
2776
2857
  expectedEffect.E