@effect/language-service 0.34.0 → 0.35.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/index.js CHANGED
@@ -135,9 +135,6 @@ var isObject = (input) => isRecordOrArray(input) || isFunction2(input);
135
135
  var hasProperty = /* @__PURE__ */ dual(2, (self, property) => isObject(self) && property in self);
136
136
  var isRecord = (input) => isRecordOrArray(input) && !Array.isArray(input);
137
137
 
138
- // node_modules/.pnpm/effect@3.17.1/node_modules/effect/dist/esm/internal/errors.js
139
- var getBugErrorMessage = (message) => `BUG: ${message} - please report an issue at https://github.com/Effect-TS/effect/issues`;
140
-
141
138
  // node_modules/.pnpm/effect@3.17.1/node_modules/effect/dist/esm/Utils.js
142
139
  var GenKindTypeId = /* @__PURE__ */ Symbol.for("effect/Gen/GenKind");
143
140
  var GenKindImpl = class {
@@ -238,12 +235,6 @@ var YieldWrap = class {
238
235
  return this.#value;
239
236
  }
240
237
  };
241
- function yieldWrapGet(self) {
242
- if (typeof self === "object" && self !== null && YieldWrapTypeId in self) {
243
- return self[YieldWrapTypeId]();
244
- }
245
- throw new Error(getBugErrorMessage("yieldWrapGet"));
246
- }
247
238
  var structuralRegionState = /* @__PURE__ */ globalValue("effect/Utils/isStructuralRegion", () => ({
248
239
  enabled: false,
249
240
  tester: void 0
@@ -748,6 +739,31 @@ var NanoTag = class {
748
739
  }
749
740
  };
750
741
  var Tag = (identifier) => new NanoTag(identifier);
742
+ var SingleShotGen2 = class _SingleShotGen {
743
+ called = false;
744
+ self;
745
+ constructor(self) {
746
+ this.self = self;
747
+ }
748
+ /**
749
+ * @since 2.0.0
750
+ */
751
+ next(a) {
752
+ return this.called ? {
753
+ value: a,
754
+ done: true
755
+ } : (this.called = true, {
756
+ value: this.self,
757
+ done: false
758
+ });
759
+ }
760
+ /**
761
+ * @since 2.0.0
762
+ */
763
+ [Symbol.iterator]() {
764
+ return new _SingleShotGen(this.self);
765
+ }
766
+ };
751
767
  var evaluate = Symbol.for("Nano.evaluate");
752
768
  var contA = Symbol.for("Nano.contA");
753
769
  var contE = Symbol.for("Nano.contE");
@@ -762,7 +778,7 @@ var NanoDefectException = class {
762
778
  };
763
779
  var PrimitiveProto = {
764
780
  [Symbol.iterator]() {
765
- return new SingleShotGen(new YieldWrap(this));
781
+ return new SingleShotGen2(this);
766
782
  }
767
783
  };
768
784
  var SucceedProto = {
@@ -885,7 +901,7 @@ var FromIteratorProto = {
885
901
  const state = this[args][0].next(value);
886
902
  if (state.done) return succeed(state.value);
887
903
  fiber._stack.push(this);
888
- return yieldWrapGet(state.value);
904
+ return state.value;
889
905
  },
890
906
  [evaluate](fiber) {
891
907
  return this[contA](this[args][1], fiber);
@@ -1256,7 +1272,7 @@ function makeTypeScriptUtils(ts) {
1256
1272
  function isNodeInRange(textRange) {
1257
1273
  return (node) => node.pos <= textRange.pos && node.end >= textRange.end;
1258
1274
  }
1259
- function transformAsyncAwaitToEffectGen(node, effectModuleName, onAwait) {
1275
+ function transformAsyncAwaitToEffectGeneratorBody(body, onAwait) {
1260
1276
  function visitor(_) {
1261
1277
  if (ts.isAwaitExpression(_)) {
1262
1278
  const expression = ts.visitEachChild(_.expression, visitor, ts.nullTransformationContext);
@@ -1267,7 +1283,44 @@ function makeTypeScriptUtils(ts) {
1267
1283
  }
1268
1284
  return ts.visitEachChild(_, visitor, ts.nullTransformationContext);
1269
1285
  }
1270
- const generatorBody = visitor(node.body);
1286
+ return visitor(body);
1287
+ }
1288
+ function transformAsyncAwaitToEffectFn(node, effectModuleName, onAwait) {
1289
+ const generatorBody = transformAsyncAwaitToEffectGeneratorBody(node.body, onAwait);
1290
+ const fnName = node.name && ts.isIdentifier(node.name) ? node.name : ts.isVariableDeclaration(node.parent) && ts.isIdentifier(node.parent.name) && node.parent.initializer === node ? node.parent.name : void 0;
1291
+ let fnCall = ts.factory.createPropertyAccessExpression(
1292
+ ts.factory.createIdentifier(effectModuleName),
1293
+ "fn"
1294
+ );
1295
+ if (fnName) {
1296
+ fnCall = ts.factory.createCallExpression(
1297
+ fnName,
1298
+ void 0,
1299
+ [ts.factory.createStringLiteral(fnName.text)]
1300
+ );
1301
+ }
1302
+ return tryPreserveDeclarationSemantics(
1303
+ node,
1304
+ ts.factory.createCallExpression(
1305
+ fnCall,
1306
+ void 0,
1307
+ [
1308
+ ts.factory.createFunctionExpression(
1309
+ void 0,
1310
+ ts.factory.createToken(ts.SyntaxKind.AsteriskToken),
1311
+ void 0,
1312
+ node.typeParameters,
1313
+ node.parameters,
1314
+ void 0,
1315
+ ts.isBlock(generatorBody) ? generatorBody : ts.factory.createBlock([ts.factory.createReturnStatement(generatorBody)])
1316
+ )
1317
+ ]
1318
+ ),
1319
+ true
1320
+ );
1321
+ }
1322
+ function transformAsyncAwaitToEffectGen(node, effectModuleName, onAwait) {
1323
+ const generatorBody = transformAsyncAwaitToEffectGeneratorBody(node.body, onAwait);
1271
1324
  const effectGenCallExp = createEffectGenCallExpression(effectModuleName, generatorBody);
1272
1325
  let currentFlags = ts.getCombinedModifierFlags(node);
1273
1326
  currentFlags &= ~ts.ModifierFlags.Async;
@@ -1371,12 +1424,15 @@ function makeTypeScriptUtils(ts) {
1371
1424
  }
1372
1425
  return typeNode;
1373
1426
  }
1374
- function tryPreserveDeclarationSemantics(nodeToReplace, node) {
1427
+ function tryPreserveDeclarationSemantics(nodeToReplace, node, dropAsync) {
1375
1428
  if (!ts.isExpression(node)) return node;
1376
1429
  if (ts.isFunctionDeclaration(nodeToReplace)) {
1377
1430
  if (!nodeToReplace.name) return node;
1431
+ let currentFlags = ts.getCombinedModifierFlags(nodeToReplace);
1432
+ currentFlags &= ~ts.ModifierFlags.Async;
1433
+ const newModifiers = dropAsync ? ts.factory.createModifiersFromModifierFlags(currentFlags) : nodeToReplace.modifiers;
1378
1434
  return ts.factory.createVariableStatement(
1379
- nodeToReplace.modifiers,
1435
+ newModifiers,
1380
1436
  ts.factory.createVariableDeclarationList(
1381
1437
  [ts.factory.createVariableDeclaration(
1382
1438
  nodeToReplace.name,
@@ -1388,8 +1444,11 @@ function makeTypeScriptUtils(ts) {
1388
1444
  )
1389
1445
  );
1390
1446
  } else if (ts.isMethodDeclaration(nodeToReplace)) {
1447
+ let currentFlags = ts.getCombinedModifierFlags(nodeToReplace);
1448
+ currentFlags &= ~ts.ModifierFlags.Async;
1449
+ const newModifiers = dropAsync ? ts.factory.createModifiersFromModifierFlags(currentFlags) : nodeToReplace.modifiers;
1391
1450
  return ts.factory.createPropertyDeclaration(
1392
- nodeToReplace.modifiers,
1451
+ newModifiers,
1393
1452
  nodeToReplace.name,
1394
1453
  void 0,
1395
1454
  void 0,
@@ -1492,6 +1551,7 @@ function makeTypeScriptUtils(ts) {
1492
1551
  getAncestorNodesInRange,
1493
1552
  toTextRange,
1494
1553
  isNodeInRange,
1554
+ transformAsyncAwaitToEffectFn,
1495
1555
  transformAsyncAwaitToEffectGen,
1496
1556
  findImportedModuleIdentifierByPackageAndNameOrBarrel,
1497
1557
  simplifyTypeNode,
@@ -10722,6 +10782,156 @@ function quickInfo(sourceFile, position, quickInfo2) {
10722
10782
  });
10723
10783
  }
10724
10784
 
10785
+ // src/refactors/asyncAwaitToFn.ts
10786
+ var asyncAwaitToFn = createRefactor({
10787
+ name: "asyncAwaitToFn",
10788
+ description: "Convert to Effect.fn",
10789
+ apply: fn("asyncAwaitToFn.apply")(function* (sourceFile, textRange) {
10790
+ const ts = yield* service(TypeScriptApi);
10791
+ const tsUtils = yield* service(TypeScriptUtils);
10792
+ const typeChecker = yield* service(TypeCheckerApi);
10793
+ const maybeNode = pipe(
10794
+ tsUtils.getAncestorNodesInRange(sourceFile, textRange),
10795
+ filter(
10796
+ (node2) => ts.isFunctionDeclaration(node2) || ts.isArrowFunction(node2) || ts.isFunctionExpression(node2)
10797
+ ),
10798
+ filter((node2) => !!node2.body),
10799
+ filter((node2) => !!(ts.getCombinedModifierFlags(node2) & ts.ModifierFlags.Async)),
10800
+ head
10801
+ );
10802
+ if (isNone2(maybeNode)) return yield* fail(new RefactorNotApplicableError());
10803
+ const node = maybeNode.value;
10804
+ return {
10805
+ kind: "refactor.rewrite.effect.asyncAwaitToFn",
10806
+ description: "Rewrite to Effect.fn",
10807
+ apply: pipe(
10808
+ gen(function* () {
10809
+ const changeTracker = yield* service(ChangeTracker);
10810
+ const effectModuleIdentifierName = tsUtils.findImportedModuleIdentifierByPackageAndNameOrBarrel(
10811
+ sourceFile,
10812
+ "effect",
10813
+ "Effect"
10814
+ ) || "Effect";
10815
+ const newDeclaration = tsUtils.transformAsyncAwaitToEffectFn(
10816
+ node,
10817
+ effectModuleIdentifierName,
10818
+ (expression) => ts.factory.createCallExpression(
10819
+ ts.factory.createPropertyAccessExpression(
10820
+ ts.factory.createIdentifier(effectModuleIdentifierName),
10821
+ "promise"
10822
+ ),
10823
+ void 0,
10824
+ [
10825
+ ts.factory.createArrowFunction(
10826
+ void 0,
10827
+ void 0,
10828
+ [],
10829
+ void 0,
10830
+ void 0,
10831
+ expression
10832
+ )
10833
+ ]
10834
+ )
10835
+ );
10836
+ changeTracker.replaceNode(sourceFile, node, newDeclaration);
10837
+ }),
10838
+ provideService(TypeScriptApi, ts),
10839
+ provideService(TypeCheckerApi, typeChecker)
10840
+ )
10841
+ };
10842
+ })
10843
+ });
10844
+
10845
+ // src/refactors/asyncAwaitToFnTryPromise.ts
10846
+ var asyncAwaitToFnTryPromise = createRefactor({
10847
+ name: "asyncAwaitToFnTryPromise",
10848
+ description: "Convert to Effect.fn with failures",
10849
+ apply: fn("asyncAwaitToFnTryPromise.apply")(function* (sourceFile, textRange) {
10850
+ const ts = yield* service(TypeScriptApi);
10851
+ const tsUtils = yield* service(TypeScriptUtils);
10852
+ const typeChecker = yield* service(TypeCheckerApi);
10853
+ const maybeNode = pipe(
10854
+ tsUtils.getAncestorNodesInRange(sourceFile, textRange),
10855
+ filter(
10856
+ (node2) => ts.isFunctionDeclaration(node2) || ts.isArrowFunction(node2) || ts.isFunctionExpression(node2)
10857
+ ),
10858
+ filter((node2) => !!node2.body),
10859
+ filter((node2) => !!(ts.getCombinedModifierFlags(node2) & ts.ModifierFlags.Async)),
10860
+ head
10861
+ );
10862
+ if (isNone2(maybeNode)) return yield* fail(new RefactorNotApplicableError());
10863
+ const node = maybeNode.value;
10864
+ return {
10865
+ kind: "refactor.rewrite.effect.asyncAwaitToFnTryPromise",
10866
+ description: "Rewrite to Effect.fn with failures",
10867
+ apply: pipe(
10868
+ gen(function* () {
10869
+ const changeTracker = yield* service(ChangeTracker);
10870
+ const effectModuleIdentifierName = tsUtils.findImportedModuleIdentifierByPackageAndNameOrBarrel(
10871
+ sourceFile,
10872
+ "effect",
10873
+ "Effect"
10874
+ ) || "Effect";
10875
+ let errorCount = 0;
10876
+ function createErrorADT() {
10877
+ errorCount++;
10878
+ return ts.factory.createObjectLiteralExpression([
10879
+ ts.factory.createPropertyAssignment(
10880
+ "_tag",
10881
+ ts.factory.createAsExpression(
10882
+ ts.factory.createStringLiteral("Error" + errorCount),
10883
+ ts.factory.createTypeReferenceNode("const")
10884
+ )
10885
+ ),
10886
+ ts.factory.createShorthandPropertyAssignment("error")
10887
+ ]);
10888
+ }
10889
+ const newDeclaration = tsUtils.transformAsyncAwaitToEffectFn(
10890
+ node,
10891
+ effectModuleIdentifierName,
10892
+ (expression) => ts.factory.createCallExpression(
10893
+ ts.factory.createPropertyAccessExpression(
10894
+ ts.factory.createIdentifier(effectModuleIdentifierName),
10895
+ "tryPromise"
10896
+ ),
10897
+ void 0,
10898
+ [
10899
+ ts.factory.createObjectLiteralExpression([
10900
+ ts.factory.createPropertyAssignment(
10901
+ ts.factory.createIdentifier("try"),
10902
+ ts.factory.createArrowFunction(
10903
+ void 0,
10904
+ void 0,
10905
+ [],
10906
+ void 0,
10907
+ void 0,
10908
+ expression
10909
+ )
10910
+ ),
10911
+ ts.factory.createPropertyAssignment(
10912
+ ts.factory.createIdentifier("catch"),
10913
+ ts.factory.createArrowFunction(
10914
+ void 0,
10915
+ void 0,
10916
+ [ts.factory.createParameterDeclaration(void 0, void 0, "error")],
10917
+ void 0,
10918
+ void 0,
10919
+ createErrorADT()
10920
+ )
10921
+ )
10922
+ ])
10923
+ ]
10924
+ )
10925
+ );
10926
+ changeTracker.replaceNode(sourceFile, node, newDeclaration);
10927
+ }),
10928
+ provideService(TypeScriptApi, ts),
10929
+ provideService(TypeCheckerApi, typeChecker)
10930
+ )
10931
+ };
10932
+ })
10933
+ });
10934
+
10725
10935
  // src/refactors/asyncAwaitToGen.ts
10726
10936
  var asyncAwaitToGen = createRefactor({
10727
10937
  name: "asyncAwaitToGen",
@@ -10902,6 +11112,7 @@ var effectGenToFn = createRefactor({
10902
11112
  const nodesFromInitializers = pipe(
10903
11113
  parentNodes,
10904
11114
  filter((_) => ts.isVariableDeclaration(_) && _.initializer ? true : false),
11115
+ filter((_) => tsUtils.isNodeInRange(textRange)(_.name)),
10905
11116
  map4((_) => _.initializer)
10906
11117
  );
10907
11118
  const maybeNode = yield* pipe(
@@ -10945,7 +11156,7 @@ var effectGenToFn = createRefactor({
10945
11156
  changeTracker.replaceNode(
10946
11157
  sourceFile,
10947
11158
  nodeToReplace,
10948
- tsUtils.tryPreserveDeclarationSemantics(nodeToReplace, effectFnCallWithGenerator)
11159
+ tsUtils.tryPreserveDeclarationSemantics(nodeToReplace, effectFnCallWithGenerator, false)
10949
11160
  );
10950
11161
  }),
10951
11162
  provideService(TypeScriptApi, ts)
@@ -10998,7 +11209,8 @@ var functionToArrow = createRefactor({
10998
11209
  );
10999
11210
  const newDeclaration = tsUtils.tryPreserveDeclarationSemantics(
11000
11211
  node,
11001
- arrowFunction
11212
+ arrowFunction,
11213
+ false
11002
11214
  );
11003
11215
  changeTracker.replaceNode(sourceFile, node, newDeclaration, {
11004
11216
  leadingTriviaOption: ts.textChanges.LeadingTriviaOption.IncludeAll,
@@ -12214,6 +12426,8 @@ var wrapWithPipe = createRefactor({
12214
12426
  var refactors = [
12215
12427
  asyncAwaitToGen,
12216
12428
  asyncAwaitToGenTryPromise,
12429
+ asyncAwaitToFn,
12430
+ asyncAwaitToFnTryPromise,
12217
12431
  functionToArrow,
12218
12432
  typeToEffectSchema,
12219
12433
  typeToEffectSchemaClass,