@effect/language-service 0.28.1 → 0.28.3

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.28.1",
3
+ "version": "0.28.3",
4
4
  "description": "A Language-Service Plugin to Refactor and Diagnostic effect-ts projects",
5
5
  "main": "index.cjs",
6
6
  "bin": {
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.12/node_modules/effect/dist/esm/Function.js
27
+ // node_modules/.pnpm/effect@3.17.1/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,12 +118,8 @@ function pipe(a, ab, bc, cd, de, ef, fg, gh, hi) {
118
118
  }
119
119
  }
120
120
 
121
- // node_modules/.pnpm/effect@3.16.12/node_modules/effect/dist/esm/internal/version.js
122
- var moduleVersion = "3.16.12";
123
- var getCurrentVersion = () => moduleVersion;
124
-
125
- // node_modules/.pnpm/effect@3.16.12/node_modules/effect/dist/esm/GlobalValue.js
126
- var globalStoreId = `effect/GlobalValue/globalStoreId/${/* @__PURE__ */ getCurrentVersion()}`;
121
+ // node_modules/.pnpm/effect@3.17.1/node_modules/effect/dist/esm/GlobalValue.js
122
+ var globalStoreId = `effect/GlobalValue`;
127
123
  var globalStore;
128
124
  var globalValue = (id, compute) => {
129
125
  if (!globalStore) {
@@ -136,7 +132,7 @@ var globalValue = (id, compute) => {
136
132
  return globalStore.get(id);
137
133
  };
138
134
 
139
- // node_modules/.pnpm/effect@3.16.12/node_modules/effect/dist/esm/Predicate.js
135
+ // node_modules/.pnpm/effect@3.17.1/node_modules/effect/dist/esm/Predicate.js
140
136
  var isString = (input) => typeof input === "string";
141
137
  var isNumber = (input) => typeof input === "number";
142
138
  var isBoolean = (input) => typeof input === "boolean";
@@ -146,10 +142,10 @@ var isObject = (input) => isRecordOrArray(input) || isFunction2(input);
146
142
  var hasProperty = /* @__PURE__ */ dual(2, (self, property) => isObject(self) && property in self);
147
143
  var isRecord = (input) => isRecordOrArray(input) && !Array.isArray(input);
148
144
 
149
- // node_modules/.pnpm/effect@3.16.12/node_modules/effect/dist/esm/internal/errors.js
145
+ // node_modules/.pnpm/effect@3.17.1/node_modules/effect/dist/esm/internal/errors.js
150
146
  var getBugErrorMessage = (message) => `BUG: ${message} - please report an issue at https://github.com/Effect-TS/effect/issues`;
151
147
 
152
- // node_modules/.pnpm/effect@3.16.12/node_modules/effect/dist/esm/Utils.js
148
+ // node_modules/.pnpm/effect@3.17.1/node_modules/effect/dist/esm/Utils.js
153
149
  var GenKindTypeId = /* @__PURE__ */ Symbol.for("effect/Gen/GenKind");
154
150
  var GenKindImpl = class {
155
151
  value;
@@ -277,7 +273,7 @@ var internalCall = isNotOptimizedAway ? standard.effect_internal_function : forc
277
273
  var genConstructor = function* () {
278
274
  }.constructor;
279
275
 
280
- // node_modules/.pnpm/effect@3.16.12/node_modules/effect/dist/esm/Hash.js
276
+ // node_modules/.pnpm/effect@3.17.1/node_modules/effect/dist/esm/Hash.js
281
277
  var randomHashCache = /* @__PURE__ */ globalValue(/* @__PURE__ */ Symbol.for("effect/Hash/randomHashCache"), () => /* @__PURE__ */ new WeakMap());
282
278
  var symbol = /* @__PURE__ */ Symbol.for("effect/Hash");
283
279
  var hash = (self) => {
@@ -376,7 +372,7 @@ var cached = function() {
376
372
  return hash2;
377
373
  };
378
374
 
379
- // node_modules/.pnpm/effect@3.16.12/node_modules/effect/dist/esm/Equal.js
375
+ // node_modules/.pnpm/effect@3.17.1/node_modules/effect/dist/esm/Equal.js
380
376
  var symbol2 = /* @__PURE__ */ Symbol.for("effect/Equal");
381
377
  function equals() {
382
378
  if (arguments.length === 1) {
@@ -430,7 +426,7 @@ function compareBoth(self, that) {
430
426
  var isEqual = (u) => hasProperty(u, symbol2);
431
427
  var equivalence = () => equals;
432
428
 
433
- // node_modules/.pnpm/effect@3.16.12/node_modules/effect/dist/esm/Inspectable.js
429
+ // node_modules/.pnpm/effect@3.17.1/node_modules/effect/dist/esm/Inspectable.js
434
430
  var NodeInspectSymbol = /* @__PURE__ */ Symbol.for("nodejs.util.inspect.custom");
435
431
  var toJSON = (x) => {
436
432
  try {
@@ -482,7 +478,7 @@ var redact = (u) => {
482
478
  return u;
483
479
  };
484
480
 
485
- // node_modules/.pnpm/effect@3.16.12/node_modules/effect/dist/esm/Pipeable.js
481
+ // node_modules/.pnpm/effect@3.17.1/node_modules/effect/dist/esm/Pipeable.js
486
482
  var pipeArguments = (self, args2) => {
487
483
  switch (args2.length) {
488
484
  case 0:
@@ -515,10 +511,14 @@ var pipeArguments = (self, args2) => {
515
511
  }
516
512
  };
517
513
 
518
- // node_modules/.pnpm/effect@3.16.12/node_modules/effect/dist/esm/internal/opCodes/effect.js
514
+ // node_modules/.pnpm/effect@3.17.1/node_modules/effect/dist/esm/internal/opCodes/effect.js
519
515
  var OP_COMMIT = "Commit";
520
516
 
521
- // node_modules/.pnpm/effect@3.16.12/node_modules/effect/dist/esm/internal/effectable.js
517
+ // node_modules/.pnpm/effect@3.17.1/node_modules/effect/dist/esm/internal/version.js
518
+ var moduleVersion = "3.17.1";
519
+ var getCurrentVersion = () => moduleVersion;
520
+
521
+ // node_modules/.pnpm/effect@3.17.1/node_modules/effect/dist/esm/internal/effectable.js
522
522
  var EffectTypeId = /* @__PURE__ */ Symbol.for("effect/Effect");
523
523
  var StreamTypeId = /* @__PURE__ */ Symbol.for("effect/Stream");
524
524
  var SinkTypeId = /* @__PURE__ */ Symbol.for("effect/Sink");
@@ -605,7 +605,7 @@ var StructuralCommitPrototype = {
605
605
  ...StructuralPrototype
606
606
  };
607
607
 
608
- // node_modules/.pnpm/effect@3.16.12/node_modules/effect/dist/esm/internal/option.js
608
+ // node_modules/.pnpm/effect@3.17.1/node_modules/effect/dist/esm/internal/option.js
609
609
  var TypeId = /* @__PURE__ */ Symbol.for("effect/Option");
610
610
  var CommonProto = {
611
611
  ...EffectPrototype,
@@ -663,7 +663,7 @@ var some = (value) => {
663
663
  return a;
664
664
  };
665
665
 
666
- // node_modules/.pnpm/effect@3.16.12/node_modules/effect/dist/esm/internal/either.js
666
+ // node_modules/.pnpm/effect@3.17.1/node_modules/effect/dist/esm/internal/either.js
667
667
  var TypeId2 = /* @__PURE__ */ Symbol.for("effect/Either");
668
668
  var CommonProto2 = {
669
669
  ...EffectPrototype,
@@ -725,7 +725,7 @@ var right = (right3) => {
725
725
  return a;
726
726
  };
727
727
 
728
- // node_modules/.pnpm/effect@3.16.12/node_modules/effect/dist/esm/Either.js
728
+ // node_modules/.pnpm/effect@3.17.1/node_modules/effect/dist/esm/Either.js
729
729
  var right2 = right;
730
730
  var left2 = left;
731
731
  var isLeft2 = isLeft;
@@ -733,14 +733,14 @@ var isRight2 = isRight;
733
733
  var map = /* @__PURE__ */ dual(2, (self, f) => isRight2(self) ? right2(f(self.right)) : left2(self.left));
734
734
  var getOrElse = /* @__PURE__ */ dual(2, (self, onLeft) => isLeft2(self) ? onLeft(self.left) : self.right);
735
735
 
736
- // node_modules/.pnpm/effect@3.16.12/node_modules/effect/dist/esm/internal/array.js
736
+ // node_modules/.pnpm/effect@3.17.1/node_modules/effect/dist/esm/internal/array.js
737
737
  var isNonEmptyArray = (self) => self.length > 0;
738
738
 
739
- // node_modules/.pnpm/effect@3.16.12/node_modules/effect/dist/esm/Order.js
739
+ // node_modules/.pnpm/effect@3.17.1/node_modules/effect/dist/esm/Order.js
740
740
  var make = (compare) => (self, that) => self === that ? 0 : compare(self, that);
741
741
  var string2 = /* @__PURE__ */ make((self, that) => self < that ? -1 : 1);
742
742
 
743
- // node_modules/.pnpm/effect@3.16.12/node_modules/effect/dist/esm/Option.js
743
+ // node_modules/.pnpm/effect@3.17.1/node_modules/effect/dist/esm/Option.js
744
744
  var none2 = () => none;
745
745
  var some2 = some;
746
746
  var isNone2 = isNone;
@@ -752,7 +752,7 @@ var match = /* @__PURE__ */ dual(2, (self, {
752
752
  var orElse = /* @__PURE__ */ dual(2, (self, that) => isNone2(self) ? that() : self);
753
753
  var fromNullable = (nullableValue) => nullableValue == null ? none2() : some2(nullableValue);
754
754
 
755
- // node_modules/.pnpm/effect@3.16.12/node_modules/effect/dist/esm/Array.js
755
+ // node_modules/.pnpm/effect@3.17.1/node_modules/effect/dist/esm/Array.js
756
756
  var fromIterable = (collection) => Array.isArray(collection) ? collection : Array.from(collection);
757
757
  var append = /* @__PURE__ */ dual(2, (self, last) => [...self, last]);
758
758
  var appendAll = /* @__PURE__ */ dual(2, (self, that) => fromIterable(self).concat(fromIterable(that)));
@@ -3362,6 +3362,110 @@ var missingStarInYieldEffectGen = createDiagnostic({
3362
3362
  })
3363
3363
  });
3364
3364
 
3365
+ // src/diagnostics/multipleEffectProvide.ts
3366
+ var multipleEffectProvide = createDiagnostic({
3367
+ name: "multipleEffectProvide",
3368
+ code: 18,
3369
+ severity: "warning",
3370
+ apply: fn("multipleEffectProvide.apply")(function* (sourceFile, report) {
3371
+ const ts = yield* service(TypeScriptApi);
3372
+ const typeChecker = yield* service(TypeCheckerApi);
3373
+ const typeParser = yield* service(TypeParser);
3374
+ const effectModuleIdentifier = yield* pipe(
3375
+ findImportedModuleIdentifierByPackageAndNameOrBarrel(
3376
+ sourceFile,
3377
+ "effect",
3378
+ "Effect"
3379
+ ),
3380
+ map3((_) => _.text),
3381
+ orElse2(() => succeed("Effect"))
3382
+ );
3383
+ const layerModuleIdentifier = yield* pipe(
3384
+ findImportedModuleIdentifierByPackageAndNameOrBarrel(
3385
+ sourceFile,
3386
+ "effect",
3387
+ "Layer"
3388
+ ),
3389
+ map3((_) => _.text),
3390
+ orElse2(() => succeed("Layer"))
3391
+ );
3392
+ const parseEffectProvideLayer = (node) => {
3393
+ if (ts.isCallExpression(node) && ts.isPropertyAccessExpression(node.expression) && ts.isIdentifier(node.expression.name) && node.expression.name.text === "provide" && node.arguments.length > 0) {
3394
+ const layer = node.arguments[0];
3395
+ const type = typeChecker.getTypeAtLocation(layer);
3396
+ return pipe(
3397
+ typeParser.importedEffectModule(node.expression.expression),
3398
+ flatMap2(() => typeParser.layerType(type, layer)),
3399
+ map3(() => ({ layer, node })),
3400
+ orElse2(() => void_)
3401
+ );
3402
+ }
3403
+ return void_;
3404
+ };
3405
+ const parsePipeCall = (node) => gen(function* () {
3406
+ const { args: args2 } = yield* typeParser.pipeCall(node);
3407
+ let currentChunk = 0;
3408
+ const previousLayers = [[]];
3409
+ for (const pipeArg of args2) {
3410
+ const parsedProvide = yield* parseEffectProvideLayer(pipeArg);
3411
+ if (parsedProvide) {
3412
+ previousLayers[currentChunk].push(parsedProvide);
3413
+ } else {
3414
+ currentChunk++;
3415
+ previousLayers.push([]);
3416
+ }
3417
+ }
3418
+ for (const chunk of previousLayers) {
3419
+ if (chunk.length < 2) continue;
3420
+ report({
3421
+ node: chunk[0].node,
3422
+ messageText: "Avoid chaining Effect.provide calls, as this can lead to service lifecycle issues. Instead, merge layers and provide them in a single call.",
3423
+ fixes: [{
3424
+ fixName: "multipleEffectProvide_fix",
3425
+ description: "Combine into a single provide",
3426
+ apply: gen(function* () {
3427
+ const changeTracker = yield* service(ChangeTracker);
3428
+ changeTracker.deleteRange(sourceFile, {
3429
+ pos: chunk[0].node.getStart(sourceFile),
3430
+ end: chunk[chunk.length - 1].node.getEnd()
3431
+ });
3432
+ const newNode = ts.factory.createCallExpression(
3433
+ ts.factory.createPropertyAccessExpression(
3434
+ ts.factory.createIdentifier(effectModuleIdentifier),
3435
+ ts.factory.createIdentifier("provide")
3436
+ ),
3437
+ void 0,
3438
+ [ts.factory.createCallExpression(
3439
+ ts.factory.createPropertyAccessExpression(
3440
+ ts.factory.createIdentifier(layerModuleIdentifier),
3441
+ ts.factory.createIdentifier("mergeAll")
3442
+ ),
3443
+ void 0,
3444
+ chunk.map((c) => c.layer)
3445
+ )]
3446
+ );
3447
+ changeTracker.insertNodeAt(sourceFile, chunk[0].node.getStart(sourceFile), newNode);
3448
+ })
3449
+ }]
3450
+ });
3451
+ }
3452
+ });
3453
+ const nodeToVisit = [];
3454
+ const appendNodeToVisit = (node) => {
3455
+ nodeToVisit.push(node);
3456
+ return void 0;
3457
+ };
3458
+ ts.forEachChild(sourceFile, appendNodeToVisit);
3459
+ while (nodeToVisit.length > 0) {
3460
+ const node = nodeToVisit.shift();
3461
+ ts.forEachChild(node, appendNodeToVisit);
3462
+ if (ts.isCallExpression(node)) {
3463
+ yield* pipe(parsePipeCall(node), ignore);
3464
+ }
3465
+ }
3466
+ })
3467
+ });
3468
+
3365
3469
  // src/diagnostics/returnEffectInGen.ts
3366
3470
  var returnEffectInGen = createDiagnostic({
3367
3471
  name: "returnEffectInGen",
@@ -3823,7 +3927,8 @@ var diagnostics = [
3823
3927
  scopeInLayerEffect,
3824
3928
  effectInVoidSuccess,
3825
3929
  unnecessaryPipeChain,
3826
- strictBooleanExpressions
3930
+ strictBooleanExpressions,
3931
+ multipleEffectProvide
3827
3932
  ];
3828
3933
 
3829
3934
  // src/transform.ts