@effect/language-service 0.19.0 → 0.20.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@effect/language-service",
3
- "version": "0.19.0",
3
+ "version": "0.20.1",
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
@@ -24,7 +24,7 @@ __export(transform_exports, {
24
24
  });
25
25
  module.exports = __toCommonJS(transform_exports);
26
26
 
27
- // node_modules/.pnpm/effect@3.16.3/node_modules/effect/dist/esm/Function.js
27
+ // node_modules/.pnpm/effect@3.16.5/node_modules/effect/dist/esm/Function.js
28
28
  var isFunction = (input) => typeof input === "function";
29
29
  var dual = function(arity, body) {
30
30
  if (typeof arity === "function") {
@@ -118,11 +118,11 @@ function pipe(a, ab, bc, cd, de, ef, fg, gh, hi) {
118
118
  }
119
119
  }
120
120
 
121
- // node_modules/.pnpm/effect@3.16.3/node_modules/effect/dist/esm/internal/version.js
122
- var moduleVersion = "3.16.3";
121
+ // node_modules/.pnpm/effect@3.16.5/node_modules/effect/dist/esm/internal/version.js
122
+ var moduleVersion = "3.16.5";
123
123
  var getCurrentVersion = () => moduleVersion;
124
124
 
125
- // node_modules/.pnpm/effect@3.16.3/node_modules/effect/dist/esm/GlobalValue.js
125
+ // node_modules/.pnpm/effect@3.16.5/node_modules/effect/dist/esm/GlobalValue.js
126
126
  var globalStoreId = `effect/GlobalValue/globalStoreId/${/* @__PURE__ */ getCurrentVersion()}`;
127
127
  var globalStore;
128
128
  var globalValue = (id, compute) => {
@@ -136,7 +136,7 @@ var globalValue = (id, compute) => {
136
136
  return globalStore.get(id);
137
137
  };
138
138
 
139
- // node_modules/.pnpm/effect@3.16.3/node_modules/effect/dist/esm/Predicate.js
139
+ // node_modules/.pnpm/effect@3.16.5/node_modules/effect/dist/esm/Predicate.js
140
140
  var isString = (input) => typeof input === "string";
141
141
  var isNumber = (input) => typeof input === "number";
142
142
  var isBoolean = (input) => typeof input === "boolean";
@@ -145,10 +145,10 @@ var isRecordOrArray = (input) => typeof input === "object" && input !== null;
145
145
  var isObject = (input) => isRecordOrArray(input) || isFunction2(input);
146
146
  var hasProperty = /* @__PURE__ */ dual(2, (self, property) => isObject(self) && property in self);
147
147
 
148
- // node_modules/.pnpm/effect@3.16.3/node_modules/effect/dist/esm/internal/errors.js
148
+ // node_modules/.pnpm/effect@3.16.5/node_modules/effect/dist/esm/internal/errors.js
149
149
  var getBugErrorMessage = (message) => `BUG: ${message} - please report an issue at https://github.com/Effect-TS/effect/issues`;
150
150
 
151
- // node_modules/.pnpm/effect@3.16.3/node_modules/effect/dist/esm/Utils.js
151
+ // node_modules/.pnpm/effect@3.16.5/node_modules/effect/dist/esm/Utils.js
152
152
  var GenKindTypeId = /* @__PURE__ */ Symbol.for("effect/Gen/GenKind");
153
153
  var isGenKind = (u) => isObject(u) && GenKindTypeId in u;
154
154
  var GenKindImpl = class {
@@ -277,7 +277,7 @@ var internalCall = isNotOptimizedAway ? standard.effect_internal_function : forc
277
277
  var genConstructor = function* () {
278
278
  }.constructor;
279
279
 
280
- // node_modules/.pnpm/effect@3.16.3/node_modules/effect/dist/esm/Hash.js
280
+ // node_modules/.pnpm/effect@3.16.5/node_modules/effect/dist/esm/Hash.js
281
281
  var randomHashCache = /* @__PURE__ */ globalValue(/* @__PURE__ */ Symbol.for("effect/Hash/randomHashCache"), () => /* @__PURE__ */ new WeakMap());
282
282
  var symbol = /* @__PURE__ */ Symbol.for("effect/Hash");
283
283
  var hash = (self) => {
@@ -376,7 +376,7 @@ var cached = function() {
376
376
  return hash2;
377
377
  };
378
378
 
379
- // node_modules/.pnpm/effect@3.16.3/node_modules/effect/dist/esm/Equal.js
379
+ // node_modules/.pnpm/effect@3.16.5/node_modules/effect/dist/esm/Equal.js
380
380
  var symbol2 = /* @__PURE__ */ Symbol.for("effect/Equal");
381
381
  function equals() {
382
382
  if (arguments.length === 1) {
@@ -429,7 +429,7 @@ function compareBoth(self, that) {
429
429
  }
430
430
  var isEqual = (u) => hasProperty(u, symbol2);
431
431
 
432
- // node_modules/.pnpm/effect@3.16.3/node_modules/effect/dist/esm/Inspectable.js
432
+ // node_modules/.pnpm/effect@3.16.5/node_modules/effect/dist/esm/Inspectable.js
433
433
  var NodeInspectSymbol = /* @__PURE__ */ Symbol.for("nodejs.util.inspect.custom");
434
434
  var toJSON = (x) => {
435
435
  try {
@@ -481,7 +481,7 @@ var redact = (u) => {
481
481
  return u;
482
482
  };
483
483
 
484
- // node_modules/.pnpm/effect@3.16.3/node_modules/effect/dist/esm/Pipeable.js
484
+ // node_modules/.pnpm/effect@3.16.5/node_modules/effect/dist/esm/Pipeable.js
485
485
  var pipeArguments = (self, args) => {
486
486
  switch (args.length) {
487
487
  case 0:
@@ -514,10 +514,10 @@ var pipeArguments = (self, args) => {
514
514
  }
515
515
  };
516
516
 
517
- // node_modules/.pnpm/effect@3.16.3/node_modules/effect/dist/esm/internal/opCodes/effect.js
517
+ // node_modules/.pnpm/effect@3.16.5/node_modules/effect/dist/esm/internal/opCodes/effect.js
518
518
  var OP_COMMIT = "Commit";
519
519
 
520
- // node_modules/.pnpm/effect@3.16.3/node_modules/effect/dist/esm/internal/effectable.js
520
+ // node_modules/.pnpm/effect@3.16.5/node_modules/effect/dist/esm/internal/effectable.js
521
521
  var EffectTypeId = /* @__PURE__ */ Symbol.for("effect/Effect");
522
522
  var StreamTypeId = /* @__PURE__ */ Symbol.for("effect/Stream");
523
523
  var SinkTypeId = /* @__PURE__ */ Symbol.for("effect/Sink");
@@ -604,7 +604,7 @@ var StructuralCommitPrototype = {
604
604
  ...StructuralPrototype
605
605
  };
606
606
 
607
- // node_modules/.pnpm/effect@3.16.3/node_modules/effect/dist/esm/internal/option.js
607
+ // node_modules/.pnpm/effect@3.16.5/node_modules/effect/dist/esm/internal/option.js
608
608
  var TypeId = /* @__PURE__ */ Symbol.for("effect/Option");
609
609
  var CommonProto = {
610
610
  ...EffectPrototype,
@@ -662,7 +662,7 @@ var some = (value) => {
662
662
  return a;
663
663
  };
664
664
 
665
- // node_modules/.pnpm/effect@3.16.3/node_modules/effect/dist/esm/internal/either.js
665
+ // node_modules/.pnpm/effect@3.16.5/node_modules/effect/dist/esm/internal/either.js
666
666
  var TypeId2 = /* @__PURE__ */ Symbol.for("effect/Either");
667
667
  var CommonProto2 = {
668
668
  ...EffectPrototype,
@@ -724,7 +724,7 @@ var right = (right3) => {
724
724
  return a;
725
725
  };
726
726
 
727
- // node_modules/.pnpm/effect@3.16.3/node_modules/effect/dist/esm/Either.js
727
+ // node_modules/.pnpm/effect@3.16.5/node_modules/effect/dist/esm/Either.js
728
728
  var right2 = right;
729
729
  var left2 = left;
730
730
  var isLeft2 = isLeft;
@@ -732,10 +732,10 @@ var isRight2 = isRight;
732
732
  var map = /* @__PURE__ */ dual(2, (self, f) => isRight2(self) ? right2(f(self.right)) : left2(self.left));
733
733
  var getOrElse = /* @__PURE__ */ dual(2, (self, onLeft) => isLeft2(self) ? onLeft(self.left) : self.right);
734
734
 
735
- // node_modules/.pnpm/effect@3.16.3/node_modules/effect/dist/esm/Order.js
735
+ // node_modules/.pnpm/effect@3.16.5/node_modules/effect/dist/esm/Order.js
736
736
  var make = (compare) => (self, that) => self === that ? 0 : compare(self, that);
737
737
 
738
- // node_modules/.pnpm/effect@3.16.3/node_modules/effect/dist/esm/Option.js
738
+ // node_modules/.pnpm/effect@3.16.5/node_modules/effect/dist/esm/Option.js
739
739
  var none2 = () => none;
740
740
  var some2 = some;
741
741
  var isNone2 = isNone;
@@ -747,7 +747,7 @@ var match = /* @__PURE__ */ dual(2, (self, {
747
747
  var orElse = /* @__PURE__ */ dual(2, (self, that) => isNone2(self) ? that() : self);
748
748
  var fromNullable = (nullableValue) => nullableValue == null ? none2() : some2(nullableValue);
749
749
 
750
- // node_modules/.pnpm/effect@3.16.3/node_modules/effect/dist/esm/Array.js
750
+ // node_modules/.pnpm/effect@3.16.5/node_modules/effect/dist/esm/Array.js
751
751
  var fromIterable = (collection) => Array.isArray(collection) ? collection : Array.from(collection);
752
752
  var append = /* @__PURE__ */ dual(2, (self, last) => [...self, last]);
753
753
  var appendAll = /* @__PURE__ */ dual(2, (self, that) => fromIterable(self).concat(fromIterable(that)));
@@ -937,6 +937,27 @@ function parse(config) {
937
937
  var TypeScriptApi = Tag("TypeScriptApi");
938
938
  var TypeScriptProgram = Tag("TypeScriptProgram");
939
939
  var ChangeTracker = Tag("ChangeTracker");
940
+ function parsePackageContentNameAndVersionFromScope(v) {
941
+ if (!isObject(v)) return;
942
+ if (!hasProperty(v, "packageJsonScope")) return;
943
+ if (!v.packageJsonScope) return;
944
+ const packageJsonScope = v.packageJsonScope;
945
+ if (!hasProperty(packageJsonScope, "contents")) return;
946
+ if (!hasProperty(packageJsonScope.contents, "packageJsonContent")) return;
947
+ const packageJsonContent = packageJsonScope.contents.packageJsonContent;
948
+ if (!hasProperty(packageJsonContent, "name")) return;
949
+ if (!hasProperty(packageJsonContent, "version")) return;
950
+ const { name, version } = packageJsonContent;
951
+ if (!isString(name)) return;
952
+ if (!isString(version)) return;
953
+ const hasEffectInPeerDependencies = hasProperty(packageJsonContent, "peerDependencies") && isObject(packageJsonContent.peerDependencies) && hasProperty(packageJsonContent.peerDependencies, "effect");
954
+ return {
955
+ name: name.toLowerCase(),
956
+ version: version.toLowerCase(),
957
+ hasEffectInPeerDependencies,
958
+ contents: packageJsonContent
959
+ };
960
+ }
940
961
 
941
962
  // src/core/LSP.ts
942
963
  var RefactorNotApplicableError = class {
@@ -1434,27 +1455,6 @@ var appendToUniqueTypesMap = fn(
1434
1455
  // src/diagnostics/duplicatePackage.ts
1435
1456
  var checkedPackagesCache = /* @__PURE__ */ new Map();
1436
1457
  var programResolvedCacheSize = /* @__PURE__ */ new Map();
1437
- function parsePackageContentNameAndVersion(v) {
1438
- if (!isObject(v)) return;
1439
- if (!hasProperty(v, "packageJsonScope")) return;
1440
- if (!v.packageJsonScope) return;
1441
- const packageJsonScope = v.packageJsonScope;
1442
- if (!hasProperty(packageJsonScope, "contents")) return;
1443
- if (!hasProperty(packageJsonScope.contents, "packageJsonContent")) return;
1444
- const packageJsonContent = packageJsonScope.contents.packageJsonContent;
1445
- if (!hasProperty(packageJsonContent, "name")) return;
1446
- if (!hasProperty(packageJsonContent, "version")) return;
1447
- const { name, version } = packageJsonContent;
1448
- if (!isString(name)) return;
1449
- if (!isString(version)) return;
1450
- const hasEffectInPeerDependencies = hasProperty(packageJsonContent, "peerDependencies") && isObject(packageJsonContent.peerDependencies) && hasProperty(packageJsonContent.peerDependencies, "effect");
1451
- return {
1452
- name: name.toLowerCase(),
1453
- version: version.toLowerCase(),
1454
- hasEffectInPeerDependencies,
1455
- contents: packageJsonContent
1456
- };
1457
- }
1458
1458
  var duplicatePackage = createDiagnostic({
1459
1459
  name: "duplicatePackage",
1460
1460
  code: 6,
@@ -1471,7 +1471,7 @@ var duplicatePackage = createDiagnostic({
1471
1471
  const seenPackages = /* @__PURE__ */ new Set();
1472
1472
  resolvedPackages = {};
1473
1473
  program.getSourceFiles().map((_) => {
1474
- const packageInfo = parsePackageContentNameAndVersion(_);
1474
+ const packageInfo = parsePackageContentNameAndVersionFromScope(_);
1475
1475
  if (!packageInfo) return;
1476
1476
  const packageNameAndVersion = packageInfo.name + "@" + packageInfo.version;
1477
1477
  if (seenPackages.has(packageNameAndVersion)) return;
@@ -1842,6 +1842,19 @@ var createReturnYieldStarStatement = fn("AST.createReturnYieldStarStatement")(
1842
1842
  );
1843
1843
  }
1844
1844
  );
1845
+ var parsePipeCall = fn("AST.parsePipeCall")(
1846
+ function* (node) {
1847
+ const ts = yield* service(TypeScriptApi);
1848
+ if (ts.isCallExpression(node) && ts.isPropertyAccessExpression(node.expression) && ts.isIdentifier(node.expression.name) && node.expression.name.text === "pipe") {
1849
+ return { node, subject: node.expression.expression, args: node.arguments };
1850
+ }
1851
+ if (ts.isCallExpression(node) && ts.isIdentifier(node.expression) && node.expression.text === "pipe" && node.arguments.length > 0) {
1852
+ const [subject, ...args] = node.arguments;
1853
+ return { node, subject, args };
1854
+ }
1855
+ return yield* fail(new NodeNotFoundError());
1856
+ }
1857
+ );
1845
1858
 
1846
1859
  // src/utils/TypeParser.ts
1847
1860
  var TypeParserIssue = class {
@@ -2390,6 +2403,75 @@ var missingEffectError = createDiagnostic({
2390
2403
  })
2391
2404
  });
2392
2405
 
2406
+ // src/diagnostics/missingReturnYieldStar.ts
2407
+ var missingReturnYieldStar = createDiagnostic({
2408
+ name: "missingReturnYieldStar",
2409
+ code: 7,
2410
+ apply: fn("missingReturnYieldStar.apply")(function* (sourceFile) {
2411
+ const ts = yield* service(TypeScriptApi);
2412
+ const typeChecker = yield* service(TypeCheckerApi);
2413
+ const effectDiagnostics = [];
2414
+ const brokenYields = /* @__PURE__ */ new Set();
2415
+ const nodeToVisit = [];
2416
+ const appendNodeToVisit = (node) => {
2417
+ nodeToVisit.push(node);
2418
+ return void 0;
2419
+ };
2420
+ ts.forEachChild(sourceFile, appendNodeToVisit);
2421
+ while (nodeToVisit.length > 0) {
2422
+ const node = nodeToVisit.shift();
2423
+ ts.forEachChild(node, appendNodeToVisit);
2424
+ if (ts.isYieldExpression(node) && node.expression && node.asteriskToken) {
2425
+ const type = typeChecker.getTypeAtLocation(node.expression);
2426
+ const maybeEffect = yield* option(effectType(type, node.expression));
2427
+ if (isSome2(maybeEffect) && maybeEffect.value.A.flags & ts.TypeFlags.Never) {
2428
+ const generatorFunctionOrReturnStatement = ts.findAncestor(
2429
+ node,
2430
+ (_) => ts.isFunctionExpression(_) || ts.isFunctionDeclaration(_) || ts.isMethodDeclaration(_) || ts.isReturnStatement(_)
2431
+ );
2432
+ if (generatorFunctionOrReturnStatement && !ts.isReturnStatement(generatorFunctionOrReturnStatement)) {
2433
+ if (generatorFunctionOrReturnStatement && generatorFunctionOrReturnStatement.parent) {
2434
+ const effectGenNode = generatorFunctionOrReturnStatement.parent;
2435
+ const effectGenLike = yield* pipe(
2436
+ effectGen(effectGenNode),
2437
+ orElse2(() => effectFnUntracedGen(effectGenNode)),
2438
+ orElse2(() => effectFnGen(effectGenNode)),
2439
+ option
2440
+ );
2441
+ if (isSome2(effectGenLike)) {
2442
+ brokenYields.add(node);
2443
+ }
2444
+ }
2445
+ }
2446
+ }
2447
+ }
2448
+ }
2449
+ brokenYields.forEach((node) => {
2450
+ const fix = node.expression ? [{
2451
+ fixName: "missingReturnYieldStar_fix",
2452
+ description: "Add return statement",
2453
+ apply: gen(function* () {
2454
+ const changeTracker = yield* service(ChangeTracker);
2455
+ changeTracker.replaceNode(
2456
+ sourceFile,
2457
+ node,
2458
+ ts.factory.createReturnStatement(
2459
+ node
2460
+ )
2461
+ );
2462
+ })
2463
+ }] : [];
2464
+ effectDiagnostics.push({
2465
+ node,
2466
+ category: ts.DiagnosticCategory.Error,
2467
+ messageText: `Yielded Effect never completes, so it is best to use a 'return yield*' instead.`,
2468
+ fixes: fix
2469
+ });
2470
+ });
2471
+ return effectDiagnostics;
2472
+ })
2473
+ });
2474
+
2393
2475
  // src/diagnostics/missingStarInYieldEffectGen.ts
2394
2476
  var missingStarInYieldEffectGen = createDiagnostic({
2395
2477
  name: "missingStarInYieldEffectGen",
@@ -2515,7 +2597,8 @@ var diagnostics = [
2515
2597
  missingEffectError,
2516
2598
  floatingEffect,
2517
2599
  missingStarInYieldEffectGen,
2518
- unnecessaryEffectGen2
2600
+ unnecessaryEffectGen2,
2601
+ missingReturnYieldStar
2519
2602
  ];
2520
2603
 
2521
2604
  // src/transform.ts