@effect/language-service 0.0.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.
Files changed (116) hide show
  1. package/README.md +59 -0
  2. package/_mjs/ast.mjs +80 -0
  3. package/_mjs/ast.mjs.map +1 -0
  4. package/_mjs/config.mjs +24 -0
  5. package/_mjs/config.mjs.map +1 -0
  6. package/_mjs/diagnostics/definition.mjs +4 -0
  7. package/_mjs/diagnostics/definition.mjs.map +1 -0
  8. package/_mjs/diagnostics/ensureGetCallTrace.mjs +49 -0
  9. package/_mjs/diagnostics/ensureGetCallTrace.mjs.map +1 -0
  10. package/_mjs/diagnostics/index.mjs +9 -0
  11. package/_mjs/diagnostics/index.mjs.map +1 -0
  12. package/_mjs/diagnostics/noSyncWithConstant.mjs +36 -0
  13. package/_mjs/diagnostics/noSyncWithConstant.mjs.map +1 -0
  14. package/_mjs/diagnostics/removeCurryArrow.mjs +18 -0
  15. package/_mjs/diagnostics/removeCurryArrow.mjs.map +1 -0
  16. package/_mjs/index.mjs +111 -0
  17. package/_mjs/index.mjs.map +1 -0
  18. package/_mjs/refactors/addPipe.mjs +24 -0
  19. package/_mjs/refactors/addPipe.mjs.map +1 -0
  20. package/_mjs/refactors/asyncAwaitToGen.mjs +25 -0
  21. package/_mjs/refactors/asyncAwaitToGen.mjs.map +1 -0
  22. package/_mjs/refactors/asyncAwaitToGenTryPromise.mjs +30 -0
  23. package/_mjs/refactors/asyncAwaitToGenTryPromise.mjs.map +1 -0
  24. package/_mjs/refactors/definition.mjs +4 -0
  25. package/_mjs/refactors/definition.mjs.map +1 -0
  26. package/_mjs/refactors/functionToArrow.mjs +43 -0
  27. package/_mjs/refactors/functionToArrow.mjs.map +1 -0
  28. package/_mjs/refactors/index.mjs +19 -0
  29. package/_mjs/refactors/index.mjs.map +1 -0
  30. package/_mjs/refactors/removeCurryArrow.mjs +24 -0
  31. package/_mjs/refactors/removeCurryArrow.mjs.map +1 -0
  32. package/_mjs/refactors/removePipe.mjs +23 -0
  33. package/_mjs/refactors/removePipe.mjs.map +1 -0
  34. package/_mjs/refactors/toggleReturnTypeAnnotation.mjs +44 -0
  35. package/_mjs/refactors/toggleReturnTypeAnnotation.mjs.map +1 -0
  36. package/_mjs/refactors/toggleTypeAnnotation.mjs +37 -0
  37. package/_mjs/refactors/toggleTypeAnnotation.mjs.map +1 -0
  38. package/_mjs/utils.mjs +146 -0
  39. package/_mjs/utils.mjs.map +1 -0
  40. package/ast.d.ts +116 -0
  41. package/ast.d.ts.map +1 -0
  42. package/ast.js +100 -0
  43. package/ast.js.map +1 -0
  44. package/config.d.ts +10 -0
  45. package/config.d.ts.map +1 -0
  46. package/config.js +31 -0
  47. package/config.js.map +1 -0
  48. package/diagnostics/definition.d.ts +15 -0
  49. package/diagnostics/definition.d.ts.map +1 -0
  50. package/diagnostics/definition.js +10 -0
  51. package/diagnostics/definition.js.map +1 -0
  52. package/diagnostics/ensureGetCallTrace.d.ts +3 -0
  53. package/diagnostics/ensureGetCallTrace.d.ts.map +1 -0
  54. package/diagnostics/ensureGetCallTrace.js +58 -0
  55. package/diagnostics/ensureGetCallTrace.js.map +1 -0
  56. package/diagnostics/index.d.ts +7 -0
  57. package/diagnostics/index.d.ts.map +1 -0
  58. package/diagnostics/index.js +17 -0
  59. package/diagnostics/index.js.map +1 -0
  60. package/diagnostics/noSyncWithConstant.d.ts +3 -0
  61. package/diagnostics/noSyncWithConstant.d.ts.map +1 -0
  62. package/diagnostics/noSyncWithConstant.js +45 -0
  63. package/diagnostics/noSyncWithConstant.js.map +1 -0
  64. package/diagnostics/removeCurryArrow.d.ts +3 -0
  65. package/diagnostics/removeCurryArrow.d.ts.map +1 -0
  66. package/diagnostics/removeCurryArrow.js +27 -0
  67. package/diagnostics/removeCurryArrow.js.map +1 -0
  68. package/index.d.ts +2 -0
  69. package/index.d.ts.map +1 -0
  70. package/index.js +116 -0
  71. package/index.js.map +1 -0
  72. package/package.json +43 -0
  73. package/refactors/addPipe.d.ts +3 -0
  74. package/refactors/addPipe.d.ts.map +1 -0
  75. package/refactors/addPipe.js +33 -0
  76. package/refactors/addPipe.js.map +1 -0
  77. package/refactors/asyncAwaitToGen.d.ts +3 -0
  78. package/refactors/asyncAwaitToGen.d.ts.map +1 -0
  79. package/refactors/asyncAwaitToGen.js +34 -0
  80. package/refactors/asyncAwaitToGen.js.map +1 -0
  81. package/refactors/asyncAwaitToGenTryPromise.d.ts +3 -0
  82. package/refactors/asyncAwaitToGenTryPromise.d.ts.map +1 -0
  83. package/refactors/asyncAwaitToGenTryPromise.js +39 -0
  84. package/refactors/asyncAwaitToGenTryPromise.js.map +1 -0
  85. package/refactors/definition.d.ts +13 -0
  86. package/refactors/definition.d.ts.map +1 -0
  87. package/refactors/definition.js +10 -0
  88. package/refactors/definition.js.map +1 -0
  89. package/refactors/functionToArrow.d.ts +3 -0
  90. package/refactors/functionToArrow.d.ts.map +1 -0
  91. package/refactors/functionToArrow.js +52 -0
  92. package/refactors/functionToArrow.js.map +1 -0
  93. package/refactors/index.d.ts +12 -0
  94. package/refactors/index.d.ts.map +1 -0
  95. package/refactors/index.js +27 -0
  96. package/refactors/index.js.map +1 -0
  97. package/refactors/removeCurryArrow.d.ts +3 -0
  98. package/refactors/removeCurryArrow.d.ts.map +1 -0
  99. package/refactors/removeCurryArrow.js +33 -0
  100. package/refactors/removeCurryArrow.js.map +1 -0
  101. package/refactors/removePipe.d.ts +3 -0
  102. package/refactors/removePipe.d.ts.map +1 -0
  103. package/refactors/removePipe.js +32 -0
  104. package/refactors/removePipe.js.map +1 -0
  105. package/refactors/toggleReturnTypeAnnotation.d.ts +3 -0
  106. package/refactors/toggleReturnTypeAnnotation.d.ts.map +1 -0
  107. package/refactors/toggleReturnTypeAnnotation.js +53 -0
  108. package/refactors/toggleReturnTypeAnnotation.js.map +1 -0
  109. package/refactors/toggleTypeAnnotation.d.ts +3 -0
  110. package/refactors/toggleTypeAnnotation.d.ts.map +1 -0
  111. package/refactors/toggleTypeAnnotation.js +46 -0
  112. package/refactors/toggleTypeAnnotation.js.map +1 -0
  113. package/utils.d.ts +15 -0
  114. package/utils.d.ts.map +1 -0
  115. package/utils.js +163 -0
  116. package/utils.js.map +1 -0
package/README.md ADDED
@@ -0,0 +1,59 @@
1
+ # language-service
2
+
3
+ This package implements a TypeScript language service plugin that allows additional refactors and diagnostics with your VSCode editor (or any editor that supports TypeScript's LSP).
4
+
5
+ ## Installation
6
+
7
+ After `npm install @effect/language-service` in your project, ensure you set your VSCode to use your workspace TypeScript version.
8
+
9
+ Inside your tsconfig.json, you should add the plugin configuration as follows:
10
+
11
+ ```json
12
+ {
13
+ "compilerOptions": {
14
+ "plugins": [{
15
+ "name": "@effect/language-service",
16
+ }]
17
+ }
18
+ }
19
+ ```
20
+
21
+ ## Provided refactors
22
+
23
+ Here's a list of the refactors provided by this language service plugin.
24
+
25
+ ### Add pipe
26
+
27
+ ![](images/add-pipe.gif)
28
+
29
+ Transform a set of function calls to a pipe() call.
30
+
31
+ ### Remove pipe
32
+
33
+ ![](images/remove-pipe.gif)
34
+
35
+ Transform a pipe() call into a series of regular function calls.
36
+
37
+ ### Remove curry arrow
38
+
39
+ ![](images/remove-curry-arrow.gif)
40
+
41
+ Removes useless arrow functions.
42
+
43
+ ### Toggle type annotation
44
+
45
+ ![](images/toggle-type-annotation.gif)
46
+
47
+ With a single refactor, adds or removes type annotations from the definition.
48
+
49
+ ### async-await to Effect.gen
50
+
51
+ ![](images/async-await-to-gen.gif)
52
+
53
+ Transform an async function definition, into an Effect by using Effect.gen.
54
+
55
+ ### async-await to Effect.gen with tryPromise
56
+
57
+ ![](images/async-await-to-gen-try-promise.gif)
58
+
59
+ Transform an async function definition, into an Effect by using Effect.gen, and generating a tagged error for each promise call.
package/_mjs/ast.mjs ADDED
@@ -0,0 +1,80 @@
1
+ import * as T from "@effect/core/io/Effect";
2
+ import * as Ch from "@tsplus/stdlib/collections/Chunk";
3
+ import { pipe } from "@tsplus/stdlib/data/Function";
4
+ import * as O from "@tsplus/stdlib/data/Maybe";
5
+ import { Tag } from "@tsplus/stdlib/service/Tag";
6
+ export const TypeScriptApi = /*#__PURE__*/Tag();
7
+ export const TypeScriptProgram = /*#__PURE__*/Tag();
8
+ export const ChangeTrackerApi = /*#__PURE__*/Tag();
9
+ export class NoSuchSourceFile {
10
+ constructor(fileName) {
11
+ this.fileName = fileName;
12
+ this._tag = "NoSuchSourceFile";
13
+ }
14
+ }
15
+ export function getSourceFile(fileName) {
16
+ return pipe(T.service(TypeScriptProgram), T.map(program => program.getSourceFile(fileName)), T.filterOrFail(sourceFile => !!sourceFile, () => new NoSuchSourceFile(fileName)));
17
+ }
18
+ export function hasModifier(node, kind) {
19
+ return T.serviceWith(TypeScriptApi, ts => !!(ts.getCombinedModifierFlags(node) & kind));
20
+ }
21
+ /**
22
+ * Gets the closest node that contains given TextRange
23
+ */
24
+ export function getNodesContainingRange(ts) {
25
+ return (sourceFile, textRange) => {
26
+ const precedingToken = ts.findPrecedingToken(textRange.pos, sourceFile);
27
+ if (!precedingToken) return Ch.empty();
28
+ let result = Ch.empty();
29
+ let parent = precedingToken;
30
+ while (parent) {
31
+ result = pipe(result, Ch.append(parent));
32
+ parent = parent.parent;
33
+ }
34
+ return result;
35
+ };
36
+ }
37
+ /**
38
+ * Ensures value is a text range
39
+ */
40
+ export function toTextRange(positionOrRange) {
41
+ return typeof positionOrRange === "number" ? {
42
+ end: positionOrRange,
43
+ pos: positionOrRange
44
+ } : positionOrRange;
45
+ }
46
+ export function getHumanReadableName(sourceFile, node) {
47
+ const text = node.getText(sourceFile);
48
+ return text.length > 10 ? text.substring(0, 10) + "..." : text;
49
+ }
50
+ export function collectAll(ts) {
51
+ return (rootNode, test) => {
52
+ let result = Ch.empty();
53
+ function visitor(node) {
54
+ if (test(node)) result = pipe(result, Ch.append(node));
55
+ ts.forEachChild(node, visitor);
56
+ }
57
+ visitor(rootNode);
58
+ return result;
59
+ };
60
+ }
61
+ export function getRelevantTokens(ts) {
62
+ return (position, sourceFile) => {
63
+ const previousToken = ts.findPrecedingToken(position, sourceFile);
64
+ if (previousToken && position <= previousToken.end && (ts.isMemberName(previousToken) || ts.isKeyword(previousToken.kind))) {
65
+ const contextToken = ts.findPrecedingToken(previousToken.getFullStart(), sourceFile, /*startNode*/undefined); // TODO: GH#18217
66
+ return {
67
+ contextToken: O.some(contextToken),
68
+ previousToken: O.some(previousToken)
69
+ };
70
+ }
71
+ return {
72
+ contextToken: O.fromNullable(previousToken),
73
+ previousToken: O.fromNullable(previousToken)
74
+ };
75
+ };
76
+ }
77
+ export function isNodeInRange(textRange) {
78
+ return node => node.pos <= textRange.pos && node.end >= textRange.end;
79
+ }
80
+ //# sourceMappingURL=ast.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ast.mjs","mappings":"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","names":["T","Ch","pipe","O","Tag","TypeScriptApi","TypeScriptProgram","ChangeTrackerApi","NoSuchSourceFile","constructor","fileName","getSourceFile","service","map","program","filterOrFail","sourceFile","hasModifier","node","kind","serviceWith","ts","getCombinedModifierFlags","getNodesContainingRange","textRange","precedingToken","findPrecedingToken","pos","empty","result","parent","append","toTextRange","positionOrRange","end","getHumanReadableName","text","getText","length","substring","collectAll","rootNode","test","visitor","forEachChild","getRelevantTokens","position","previousToken","isMemberName","isKeyword","contextToken","getFullStart","undefined","some","fromNullable","isNodeInRange"],"sourceRoot":"","sources":["../../src/ast.ts"],"sourcesContent":[null]}
@@ -0,0 +1,24 @@
1
+ function literal(...types) {
2
+ return def => value => types.indexOf(value) > -1 ? value : def;
3
+ }
4
+ function record(type) {
5
+ return value => {
6
+ if (typeof value !== "object" || value === null) return {};
7
+ return Object.keys(value).reduce((obj, key) => ({
8
+ ...obj,
9
+ [key]: type(value[key])
10
+ }), {});
11
+ };
12
+ }
13
+ function struct(types) {
14
+ return value => {
15
+ return Object.keys(types).reduce((obj, key) => ({
16
+ ...obj,
17
+ [key]: types[key](typeof value !== "object" || value === null ? null : value[key])
18
+ }), {});
19
+ };
20
+ }
21
+ export const parseLanguageServicePluginConfig = /*#__PURE__*/struct({
22
+ diagnostics: /*#__PURE__*/record( /*#__PURE__*/literal("none", "suggestion", "warning", "error")("none"))
23
+ });
24
+ //# sourceMappingURL=config.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.mjs","mappings":"AAQA,SAASA,OAAO,CAA+B,GAAGC,KAAQ;EACxD,OAAQC,GAAc,IAA0BC,KAAK,IAAKF,KAAK,CAACG,OAAO,CAACD,KAAY,CAAC,GAAG,CAAC,CAAC,GAAGA,KAAY,GAAGD,GAAG;AACjH;AAEA,SAASG,MAAM,CAAIC,IAAgB;EACjC,OAAQH,KAAc,IAAI;IACxB,IAAI,OAAOA,KAAK,KAAK,QAAQ,IAAIA,KAAK,KAAK,IAAI,EAAE,OAAO,EAAE;IAC1D,OAAOI,MAAM,CAACC,IAAI,CAACL,KAAK,CAAC,CAACM,MAAM,CAAC,CAACC,GAAG,EAAEC,GAAG,MAAM;MAAE,GAAGD,GAAG;MAAE,CAACC,GAAG,GAAGL,IAAI,CAACH,KAAK,CAACQ,GAAG,CAAC;IAAC,CAAE,CAAC,EAAE,EAAE,CAAC;EAC3F,CAAC;AACH;AAEA,SAASC,MAAM,CAA6CX,KAAQ;EAClE,OAAQE,KAAc,IAAI;IACxB,OAAOI,MAAM,CAACC,IAAI,CAACP,KAAK,CAAC,CAACQ,MAAM,CAC9B,CAACC,GAAG,EAAEC,GAAG,MAAM;MAAE,GAAGD,GAAG;MAAE,CAACC,GAAG,GAAGV,KAAK,CAACU,GAAG,CAAE,CAAC,OAAOR,KAAK,KAAK,QAAQ,IAAIA,KAAK,KAAK,IAAI,GAAG,IAAI,GAAGA,KAAK,CAACQ,GAAG,CAAC;IAAC,CAAE,CAAC,EAC/G,EAA0C,CAC3C;EACH,CAAC;AACH;AAEA,OAAO,MAAME,gCAAgC,gBAAGD,MAAM,CAAC;EACrDE,WAAW,eAAET,MAAM,eAACL,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC;CAC9E,CAAC","names":["literal","types","def","value","indexOf","record","type","Object","keys","reduce","obj","key","struct","parseLanguageServicePluginConfig","diagnostics"],"sourceRoot":"","sources":["../../src/config.ts"],"sourcesContent":[null]}
@@ -0,0 +1,4 @@
1
+ export function createDiagnostic(definition) {
2
+ return definition;
3
+ }
4
+ //# sourceMappingURL=definition.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.mjs","mappings":"AAwBA,OAAM,SAAUA,gBAAgB,CAACC,UAAgC;EAC/D,OAAOA,UAAU;AACnB","names":["createDiagnostic","definition"],"sourceRoot":"","sources":["../../../src/diagnostics/definition.ts"],"sourcesContent":[null]}
@@ -0,0 +1,49 @@
1
+ import * as T from "@effect/core/io/Effect";
2
+ import * as AST from "@effect/language-service/ast";
3
+ import { createDiagnostic } from "@effect/language-service/diagnostics/definition";
4
+ import { pipe } from "@fp-ts/data/Function";
5
+ import * as Ch from "@tsplus/stdlib/collections/Chunk";
6
+ export default /*#__PURE__*/createDiagnostic({
7
+ code: 1003,
8
+ category: "none",
9
+ apply: sourceFile => T.gen(function* ($) {
10
+ const ts = yield* $(T.service(AST.TypeScriptApi));
11
+ const program = yield* $(T.service(AST.TypeScriptProgram));
12
+ const typeChecker = program.getTypeChecker();
13
+ function isEffectType(type) {
14
+ const symbol = type.getSymbol();
15
+ if (!symbol) return false;
16
+ return symbol.getDocumentationComment(typeChecker).some(i => i.text.indexOf("Effects model resourceful interaction") > -1);
17
+ }
18
+ function isPipeableCombinator(type) {
19
+ const signatures = type.getCallSignatures();
20
+ if (signatures.length === 0) return false;
21
+ return signatures.some(isPipeableCallSignatureReturningEffect);
22
+ }
23
+ function isPipeableCallSignatureReturningEffect(signature) {
24
+ if (signature.getParameters().length !== 1) return false;
25
+ return isEffectType(signature.getReturnType());
26
+ }
27
+ function shouldBeTraced(signature) {
28
+ const returnType = signature.getReturnType();
29
+ return isEffectType(returnType) || isPipeableCombinator(returnType);
30
+ }
31
+ function isGetCallTraceCallExpression(node) {
32
+ if (!ts.isCallExpression(node)) return false;
33
+ const expression = node.expression;
34
+ if (!ts.isIdentifier(expression)) return false;
35
+ return expression.text === "getCallTrace";
36
+ }
37
+ return pipe(AST.collectAll(ts)(sourceFile, ts.isArrowFunction), Ch.concat(AST.collectAll(ts)(sourceFile, ts.isFunctionDeclaration)), Ch.filter(node => !!node.body), Ch.filter(node => typeChecker.getTypeAtLocation(node).getCallSignatures().some(shouldBeTraced)), Ch.filter(node => {
38
+ const body = node.body;
39
+ if (!ts.isBlock(body)) return true;
40
+ const firstStatement = body.statements[0];
41
+ if (!firstStatement) return true;
42
+ return Ch.isEmpty(AST.collectAll(ts)(firstStatement, isGetCallTraceCallExpression));
43
+ }), Ch.map(node => ({
44
+ node,
45
+ messageText: `This function should be traced. getCallTrace() should be the first line of the body.`
46
+ })));
47
+ })
48
+ });
49
+ //# sourceMappingURL=ensureGetCallTrace.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ensureGetCallTrace.mjs","mappings":"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","names":["T","AST","createDiagnostic","pipe","Ch","code","category","apply","sourceFile","gen","$","ts","service","TypeScriptApi","program","TypeScriptProgram","typeChecker","getTypeChecker","isEffectType","type","symbol","getSymbol","getDocumentationComment","some","i","text","indexOf","isPipeableCombinator","signatures","getCallSignatures","length","isPipeableCallSignatureReturningEffect","signature","getParameters","getReturnType","shouldBeTraced","returnType","isGetCallTraceCallExpression","node","isCallExpression","expression","isIdentifier","collectAll","isArrowFunction","concat","isFunctionDeclaration","filter","body","getTypeAtLocation","isBlock","firstStatement","statements","isEmpty","map","messageText"],"sourceRoot":"","sources":["../../../src/diagnostics/ensureGetCallTrace.ts"],"sourcesContent":[null]}
@@ -0,0 +1,9 @@
1
+ import ensureGetCallTrace from "@effect/language-service/diagnostics/ensureGetCallTrace";
2
+ import noSyncWithConstant from "@effect/language-service/diagnostics/noSyncWithConstant";
3
+ import removeCurryArrow from "@effect/language-service/diagnostics/removeCurryArrow";
4
+ export default {
5
+ removeCurryArrow,
6
+ noSyncWithConstant,
7
+ ensureGetCallTrace
8
+ };
9
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","mappings":"AAAA,OAAOA,kBAAkB,MAAM,yDAAyD;AACxF,OAAOC,kBAAkB,MAAM,yDAAyD;AACxF,OAAOC,gBAAgB,MAAM,uDAAuD;AAEpF,eAAe;EAAEA,gBAAgB;EAAED,kBAAkB;EAAED;AAAkB,CAAE","names":["ensureGetCallTrace","noSyncWithConstant","removeCurryArrow"],"sourceRoot":"","sources":["../../../src/diagnostics/index.ts"],"sourcesContent":[null]}
@@ -0,0 +1,36 @@
1
+ import * as T from "@effect/core/io/Effect";
2
+ import * as AST from "@effect/language-service/ast";
3
+ import { createDiagnostic } from "@effect/language-service/diagnostics/definition";
4
+ import { findModuleImportIdentifierName, isCombinatorCall, isLiteralConstantValue } from "@effect/language-service/utils";
5
+ import * as Ch from "@tsplus/stdlib/collections/Chunk";
6
+ import { pipe } from "@tsplus/stdlib/data/Function";
7
+ import * as O from "@tsplus/stdlib/data/Maybe";
8
+ export default /*#__PURE__*/createDiagnostic({
9
+ code: 1002,
10
+ category: "warning",
11
+ apply: sourceFile => T.gen(function* ($) {
12
+ const ts = yield* $(T.service(AST.TypeScriptApi));
13
+ const effectIdentifier = pipe(findModuleImportIdentifierName(ts)(sourceFile, "@effect/core/io/Effect"), O.getOrElse(() => "Effect"));
14
+ const methodsMap = {
15
+ sync: "succeed",
16
+ failSync: "fail",
17
+ dieSync: "die"
18
+ };
19
+ let result = Ch.empty();
20
+ for (const methodName of Object.keys(methodsMap)) {
21
+ const suggestedMethodName = methodsMap[methodName];
22
+ result = pipe(result, Ch.concat(pipe(AST.collectAll(ts)(sourceFile, isCombinatorCall(ts)(effectIdentifier, methodName)), Ch.filter(node => {
23
+ if (node.arguments.length !== 1) return false;
24
+ const arg = node.arguments[0];
25
+ if (!ts.isArrowFunction(arg)) return false;
26
+ if (!isLiteralConstantValue(ts)(arg.body)) return false;
27
+ return true;
28
+ }), Ch.map(node => ({
29
+ node,
30
+ messageText: `Value is constant, instead of using ${methodName} you could use ${suggestedMethodName}.`
31
+ })))));
32
+ }
33
+ return result;
34
+ })
35
+ });
36
+ //# sourceMappingURL=noSyncWithConstant.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"noSyncWithConstant.mjs","mappings":"AAAA,OAAO,KAAKA,CAAC,MAAM,wBAAwB;AAC3C,OAAO,KAAKC,GAAG,MAAM,8BAA8B;AAEnD,SAASC,gBAAgB,QAAQ,iDAAiD;AAClF,SACEC,8BAA8B,EAC9BC,gBAAgB,EAChBC,sBAAsB,QACjB,gCAAgC;AACvC,OAAO,KAAKC,EAAE,MAAM,kCAAkC;AACtD,SAASC,IAAI,QAAQ,8BAA8B;AACnD,OAAO,KAAKC,CAAC,MAAM,2BAA2B;AAE9C,4BAAeN,gBAAgB,CAAC;EAC9BO,IAAI,EAAE,IAAI;EACVC,QAAQ,EAAE,SAAS;EACnBC,KAAK,EAAGC,UAAU,IAChBZ,CAAC,CAACa,GAAG,CAAC,WAAUC,CAAC;IACf,MAAMC,EAAE,GAAG,OAAOD,CAAC,CAACd,CAAC,CAACgB,OAAO,CAACf,GAAG,CAACgB,aAAa,CAAC,CAAC;IAEjD,MAAMC,gBAAgB,GAAGX,IAAI,CAC3BJ,8BAA8B,CAACY,EAAE,CAAC,CAACH,UAAU,EAAE,wBAAwB,CAAC,EACxEJ,CAAC,CAACW,SAAS,CACT,MAAM,QAAQ,CACf,CACF;IAED,MAAMC,UAAU,GAAG;MACjBC,IAAI,EAAE,SAAS;MACfC,QAAQ,EAAE,MAAM;MAChBC,OAAO,EAAE;KACV;IAED,IAAIC,MAAM,GAA0ClB,EAAE,CAACmB,KAAK,EAAE;IAE9D,KAAK,MAAMC,UAAU,IAAIC,MAAM,CAACC,IAAI,CAACR,UAAU,CAAC,EAAE;MAChD,MAAMS,mBAAmB,GAAWT,UAAU,CAACM,UAAU,CAAE;MAE3DF,MAAM,GAAGjB,IAAI,CACXiB,MAAM,EACNlB,EAAE,CAACwB,MAAM,CACPvB,IAAI,CACFN,GAAG,CAAC8B,UAAU,CAAChB,EAAE,CAAC,CAACH,UAAU,EAAER,gBAAgB,CAACW,EAAE,CAAC,CAACG,gBAAgB,EAAEQ,UAAU,CAAC,CAAC,EAClFpB,EAAE,CAAC0B,MAAM,CAAEC,IAAI,IAAI;QACjB,IAAIA,IAAI,CAACC,SAAS,CAACC,MAAM,KAAK,CAAC,EAAE,OAAO,KAAK;QAC7C,MAAMC,GAAG,GAAGH,IAAI,CAACC,SAAS,CAAC,CAAC,CAAE;QAC9B,IAAI,CAACnB,EAAE,CAACsB,eAAe,CAACD,GAAG,CAAC,EAAE,OAAO,KAAK;QAC1C,IAAI,CAAC/B,sBAAsB,CAACU,EAAE,CAAC,CAACqB,GAAG,CAACE,IAAI,CAAC,EAAE,OAAO,KAAK;QACvD,OAAO,IAAI;MACb,CAAC,CAAC,EACFhC,EAAE,CAACiC,GAAG,CAAEN,IAAI,KAAM;QAChBA,IAAI;QACJO,WAAW,EAAE,uCAAuCd,UAAU,kBAAkBG,mBAAmB;OACpG,CAAC,CAAC,CACJ,CACF,CACF;;IAGH,OAAOL,MAAM;EACf,CAAC;CACJ,CAAC","names":["T","AST","createDiagnostic","findModuleImportIdentifierName","isCombinatorCall","isLiteralConstantValue","Ch","pipe","O","code","category","apply","sourceFile","gen","$","ts","service","TypeScriptApi","effectIdentifier","getOrElse","methodsMap","sync","failSync","dieSync","result","empty","methodName","Object","keys","suggestedMethodName","concat","collectAll","filter","node","arguments","length","arg","isArrowFunction","body","map","messageText"],"sourceRoot":"","sources":["../../../src/diagnostics/noSyncWithConstant.ts"],"sourcesContent":[null]}
@@ -0,0 +1,18 @@
1
+ import * as T from "@effect/core/io/Effect";
2
+ import * as AST from "@effect/language-service/ast";
3
+ import { createDiagnostic } from "@effect/language-service/diagnostics/definition";
4
+ import { isCurryArrow } from "@effect/language-service/utils";
5
+ import { pipe } from "@fp-ts/data/Function";
6
+ import * as Ch from "@tsplus/stdlib/collections/Chunk";
7
+ export default /*#__PURE__*/createDiagnostic({
8
+ code: 1001,
9
+ category: "suggestion",
10
+ apply: sourceFile => T.gen(function* ($) {
11
+ const ts = yield* $(T.service(AST.TypeScriptApi));
12
+ return pipe(AST.collectAll(ts)(sourceFile, isCurryArrow(ts)), Ch.map(node => ({
13
+ node,
14
+ messageText: "This arrow function may be not needed."
15
+ })));
16
+ })
17
+ });
18
+ //# sourceMappingURL=removeCurryArrow.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"removeCurryArrow.mjs","mappings":"AAAA,OAAO,KAAKA,CAAC,MAAM,wBAAwB;AAC3C,OAAO,KAAKC,GAAG,MAAM,8BAA8B;AACnD,SAASC,gBAAgB,QAAQ,iDAAiD;AAClF,SAASC,YAAY,QAAQ,gCAAgC;AAC7D,SAASC,IAAI,QAAQ,sBAAsB;AAC3C,OAAO,KAAKC,EAAE,MAAM,kCAAkC;AAEtD,4BAAeH,gBAAgB,CAAC;EAC9BI,IAAI,EAAE,IAAI;EACVC,QAAQ,EAAE,YAAY;EACtBC,KAAK,EAAGC,UAAU,IAChBT,CAAC,CAACU,GAAG,CAAC,WAAUC,CAAC;IACf,MAAMC,EAAE,GAAG,OAAOD,CAAC,CAACX,CAAC,CAACa,OAAO,CAACZ,GAAG,CAACa,aAAa,CAAC,CAAC;IAEjD,OAAOV,IAAI,CACTH,GAAG,CAACc,UAAU,CAACH,EAAE,CAAC,CAACH,UAAU,EAAEN,YAAY,CAACS,EAAE,CAAC,CAAC,EAChDP,EAAE,CAACW,GAAG,CAAEC,IAAI,KAAM;MAChBA,IAAI;MACJC,WAAW,EAAE;KACd,CAAC,CAAC,CACJ;EACH,CAAC;CACJ,CAAC","names":["T","AST","createDiagnostic","isCurryArrow","pipe","Ch","code","category","apply","sourceFile","gen","$","ts","service","TypeScriptApi","collectAll","map","node","messageText"],"sourceRoot":"","sources":["../../../src/diagnostics/removeCurryArrow.ts"],"sourcesContent":[null]}
package/_mjs/index.mjs ADDED
@@ -0,0 +1,111 @@
1
+ import * as T from "@effect/core/io/Effect";
2
+ import * as AST from "@effect/language-service/ast";
3
+ import { parseLanguageServicePluginConfig } from "@effect/language-service/config";
4
+ import diagnostics from "@effect/language-service/diagnostics/index";
5
+ import refactors from "@effect/language-service/refactors/index";
6
+ import { pipe } from "@fp-ts/data/Function";
7
+ import * as Ch from "@tsplus/stdlib/collections/Chunk";
8
+ import { identity } from "@tsplus/stdlib/data/Function";
9
+ import * as O from "@tsplus/stdlib/data/Maybe";
10
+ // eslint-disable-next-line @typescript-eslint/consistent-type-imports
11
+ function init(modules) {
12
+ const ts = modules.typescript;
13
+ function create(info) {
14
+ const languageService = info.languageService;
15
+ // create the proxy
16
+ const proxy = Object.create(null);
17
+ for (const k of Object.keys(info.languageService)) {
18
+ // @ts-expect-error
19
+ proxy[k] = (...args) => languageService[k].apply(languageService, args);
20
+ }
21
+ function applyConfiguredDiagnosticCategory(diagnostic) {
22
+ const config = parseLanguageServicePluginConfig(info.config);
23
+ const category = config.diagnostics[diagnostic.code] || diagnostic.category;
24
+ return {
25
+ ...diagnostic,
26
+ category
27
+ };
28
+ }
29
+ function toTsDiagnosticCategory(category) {
30
+ return {
31
+ none: ts.DiagnosticCategory.Suggestion,
32
+ suggestion: ts.DiagnosticCategory.Suggestion,
33
+ warning: ts.DiagnosticCategory.Warning,
34
+ error: ts.DiagnosticCategory.Error
35
+ }[category];
36
+ }
37
+ proxy.getSuggestionDiagnostics = (...args) => {
38
+ const suggestionDiagnostics = languageService.getSuggestionDiagnostics(...args);
39
+ const [fileName] = args;
40
+ const program = languageService.getProgram();
41
+ if (program) {
42
+ const effectDiagnostics = pipe(AST.getSourceFile(fileName), T.flatMap(sourceFile => T.forEachPar(Object.values(diagnostics).map(applyConfiguredDiagnosticCategory).filter(_ => _.category !== "none"), diagnostic => pipe(diagnostic.apply(sourceFile), T.map(Ch.map(_ => ({
43
+ file: sourceFile,
44
+ start: _.node.pos,
45
+ length: _.node.end - _.node.pos,
46
+ messageText: _.messageText,
47
+ category: toTsDiagnosticCategory(diagnostic.category),
48
+ code: diagnostic.code,
49
+ source: "effect"
50
+ })))))), T.map(Ch.flatten), T.map(v => Array.from(v)), T.provideService(AST.TypeScriptProgram, program), T.provideService(AST.TypeScriptApi, modules.typescript), T.unsafeRunSync);
51
+ return suggestionDiagnostics.concat(effectDiagnostics);
52
+ }
53
+ return suggestionDiagnostics;
54
+ };
55
+ proxy.getApplicableRefactors = (...args) => {
56
+ const applicableRefactors = languageService.getApplicableRefactors(...args);
57
+ const [fileName, positionOrRange] = args;
58
+ const program = languageService.getProgram();
59
+ if (program) {
60
+ const textRange = AST.toTextRange(positionOrRange);
61
+ const effectRefactors = pipe(AST.getSourceFile(fileName), T.flatMap(sourceFile => T.collectAllWith(Object.values(refactors).map(refactor => pipe(refactor.apply(sourceFile, textRange), T.map(O.map(_ => ({
62
+ name: refactor.name,
63
+ description: refactor.description,
64
+ actions: [{
65
+ name: refactor.name,
66
+ description: _.description
67
+ }]
68
+ }))))), identity)), T.map(v => Array.from(v)), T.provideService(AST.TypeScriptProgram, program), T.provideService(AST.TypeScriptApi, modules.typescript), T.unsafeRunSync);
69
+ info.project.projectService.logger.info("[@effect/language-service] possible refactors are " + JSON.stringify(effectRefactors));
70
+ return applicableRefactors.concat(effectRefactors);
71
+ }
72
+ return applicableRefactors;
73
+ };
74
+ proxy.getEditsForRefactor = (fileName, formatOptions, positionOrRange, refactorName, actionName, preferences, ...args) => {
75
+ const program = languageService.getProgram();
76
+ if (program) {
77
+ for (const refactor of Object.values(refactors)) {
78
+ if (refactor.name === refactorName) {
79
+ return pipe(T.gen(function* ($) {
80
+ const sourceFile = yield* $(AST.getSourceFile(fileName));
81
+ const textRange = AST.toTextRange(positionOrRange);
82
+ const possibleRefactor = yield* $(refactor.apply(sourceFile, textRange));
83
+ if (O.isNone(possibleRefactor)) {
84
+ info.project.projectService.logger.info("[@effect/language-service] requested refactor " + refactorName + " is not applicable");
85
+ return {
86
+ edits: []
87
+ };
88
+ }
89
+ const formatContext = ts.formatting.getFormatContext(formatOptions, info.languageServiceHost);
90
+ const edits = ts.textChanges.ChangeTracker.with({
91
+ formatContext,
92
+ host: info.languageServiceHost,
93
+ preferences: preferences || {}
94
+ }, changeTracker => pipe(possibleRefactor.value.apply, T.provideService(AST.ChangeTrackerApi, changeTracker), T.provideService(AST.TypeScriptApi, modules.typescript), T.provideService(AST.TypeScriptProgram, program), T.unsafeRunSync));
95
+ return {
96
+ edits
97
+ };
98
+ }), T.provideService(AST.TypeScriptApi, modules.typescript), T.provideService(AST.TypeScriptProgram, program), T.unsafeRunSync);
99
+ }
100
+ }
101
+ }
102
+ return languageService.getEditsForRefactor(fileName, formatOptions, positionOrRange, refactorName, actionName, preferences, ...args);
103
+ };
104
+ return proxy;
105
+ }
106
+ return {
107
+ create
108
+ };
109
+ }
110
+ module.exports = init;
111
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.mjs","mappings":"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","names":["T","AST","parseLanguageServicePluginConfig","diagnostics","refactors","pipe","Ch","identity","O","init","modules","ts","typescript","create","info","languageService","proxy","Object","k","keys","args","apply","applyConfiguredDiagnosticCategory","diagnostic","config","category","code","toTsDiagnosticCategory","none","DiagnosticCategory","Suggestion","suggestion","warning","Warning","error","Error","getSuggestionDiagnostics","suggestionDiagnostics","fileName","program","getProgram","effectDiagnostics","getSourceFile","flatMap","sourceFile","forEachPar","values","map","filter","_","file","start","node","pos","length","end","messageText","source","flatten","v","Array","from","provideService","TypeScriptProgram","TypeScriptApi","unsafeRunSync","concat","getApplicableRefactors","applicableRefactors","positionOrRange","textRange","toTextRange","effectRefactors","collectAllWith","refactor","name","description","actions","project","projectService","logger","JSON","stringify","getEditsForRefactor","formatOptions","refactorName","actionName","preferences","gen","$","possibleRefactor","isNone","edits","formatContext","formatting","getFormatContext","languageServiceHost","textChanges","ChangeTracker","with","host","changeTracker","value","ChangeTrackerApi","module","exports"],"sourceRoot":"","sources":["../../src/index.ts"],"sourcesContent":[null]}
@@ -0,0 +1,24 @@
1
+ import * as T from "@effect/core/io/Effect";
2
+ import * as AST from "@effect/language-service/ast";
3
+ import { createRefactor } from "@effect/language-service/refactors/definition";
4
+ import { asPipeArguments, isPipeableCallExpression } from "@effect/language-service/utils";
5
+ import * as Ch from "@tsplus/stdlib/collections/Chunk";
6
+ import { pipe } from "@tsplus/stdlib/data/Function";
7
+ import * as O from "@tsplus/stdlib/data/Maybe";
8
+ export default /*#__PURE__*/createRefactor({
9
+ name: "effect/addPipe",
10
+ description: "Rewrite using pipe",
11
+ apply: (sourceFile, textRange) => T.gen(function* ($) {
12
+ const ts = yield* $(T.service(AST.TypeScriptApi));
13
+ return pipe(AST.getNodesContainingRange(ts)(sourceFile, textRange), Ch.reverse, Ch.from, Ch.filter(AST.isNodeInRange(textRange)), Ch.filter(isPipeableCallExpression(ts)), Ch.head, O.map(node => ({
14
+ description: `Rewrite ${AST.getHumanReadableName(sourceFile, node.expression)} to pipe`,
15
+ apply: T.gen(function* ($) {
16
+ const changeTracker = yield* $(T.service(AST.ChangeTrackerApi));
17
+ const args = asPipeArguments(ts)(node);
18
+ const newNode = ts.factory.createCallExpression(ts.factory.createIdentifier("pipe"), undefined, Array.from(args));
19
+ changeTracker.replaceNode(sourceFile, node, newNode);
20
+ })
21
+ })));
22
+ })
23
+ });
24
+ //# sourceMappingURL=addPipe.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addPipe.mjs","mappings":"AAAA,OAAO,KAAKA,CAAC,MAAM,wBAAwB;AAC3C,OAAO,KAAKC,GAAG,MAAM,8BAA8B;AACnD,SAASC,cAAc,QAAQ,+CAA+C;AAC9E,SAASC,eAAe,EAAEC,wBAAwB,QAAQ,gCAAgC;AAC1F,OAAO,KAAKC,EAAE,MAAM,kCAAkC;AACtD,SAASC,IAAI,QAAQ,8BAA8B;AACnD,OAAO,KAAKC,CAAC,MAAM,2BAA2B;AAE9C,4BAAeL,cAAc,CAAC;EAC5BM,IAAI,EAAE,gBAAgB;EACtBC,WAAW,EAAE,oBAAoB;EACjCC,KAAK,EAAE,CAACC,UAAU,EAAEC,SAAS,KAC3BZ,CAAC,CAACa,GAAG,CAAC,WAAUC,CAAC;IACf,MAAMC,EAAE,GAAG,OAAOD,CAAC,CAACd,CAAC,CAACgB,OAAO,CAACf,GAAG,CAACgB,aAAa,CAAC,CAAC;IAEjD,OAAOX,IAAI,CACTL,GAAG,CAACiB,uBAAuB,CAACH,EAAE,CAAC,CAACJ,UAAU,EAAEC,SAAS,CAAC,EACtDP,EAAE,CAACc,OAAO,EACVd,EAAE,CAACe,IAAI,EACPf,EAAE,CAACgB,MAAM,CAACpB,GAAG,CAACqB,aAAa,CAACV,SAAS,CAAC,CAAC,EACvCP,EAAE,CAACgB,MAAM,CAACjB,wBAAwB,CAACW,EAAE,CAAC,CAAC,EACvCV,EAAE,CAACkB,IAAI,EACPhB,CAAC,CAACiB,GAAG,CAAEC,IAAI,KAAM;MACfhB,WAAW,EAAE,WAAWR,GAAG,CAACyB,oBAAoB,CAACf,UAAU,EAAEc,IAAI,CAACE,UAAU,CAAC,UAAU;MACvFjB,KAAK,EAAEV,CAAC,CAACa,GAAG,CAAC,WAAUC,CAAC;QACtB,MAAMc,aAAa,GAAG,OAAOd,CAAC,CAACd,CAAC,CAACgB,OAAO,CAACf,GAAG,CAAC4B,gBAAgB,CAAC,CAAC;QAC/D,MAAMC,IAAI,GAAG3B,eAAe,CAACY,EAAE,CAAC,CAACU,IAAI,CAAC;QAEtC,MAAMM,OAAO,GAAGhB,EAAE,CAACiB,OAAO,CAACC,oBAAoB,CAC7ClB,EAAE,CAACiB,OAAO,CAACE,gBAAgB,CAAC,MAAM,CAAC,EACnCC,SAAS,EACTC,KAAK,CAAChB,IAAI,CAACU,IAAI,CAAC,CACjB;QAEDF,aAAa,CAACS,WAAW,CAAC1B,UAAU,EAAEc,IAAI,EAAEM,OAAO,CAAC;MACtD,CAAC;KACF,CAAC,CAAC,CACJ;EACH,CAAC;CACJ,CAAC","names":["T","AST","createRefactor","asPipeArguments","isPipeableCallExpression","Ch","pipe","O","name","description","apply","sourceFile","textRange","gen","$","ts","service","TypeScriptApi","getNodesContainingRange","reverse","from","filter","isNodeInRange","head","map","node","getHumanReadableName","expression","changeTracker","ChangeTrackerApi","args","newNode","factory","createCallExpression","createIdentifier","undefined","Array","replaceNode"],"sourceRoot":"","sources":["../../../src/refactors/addPipe.ts"],"sourcesContent":[null]}
@@ -0,0 +1,25 @@
1
+ import * as T from "@effect/core/io/Effect";
2
+ import * as AST from "@effect/language-service/ast";
3
+ import { createRefactor } from "@effect/language-service/refactors/definition";
4
+ import { findModuleImportIdentifierName, transformAsyncAwaitToEffectGen } from "@effect/language-service/utils";
5
+ import * as Ch from "@tsplus/stdlib/collections/Chunk";
6
+ import { pipe } from "@tsplus/stdlib/data/Function";
7
+ import * as O from "@tsplus/stdlib/data/Maybe";
8
+ export default /*#__PURE__*/createRefactor({
9
+ name: "effect/asyncAwaitToGen",
10
+ description: "Convert to Effect.gen",
11
+ apply: (sourceFile, textRange) => T.gen(function* ($) {
12
+ const ts = yield* $(T.service(AST.TypeScriptApi));
13
+ return pipe(AST.getNodesContainingRange(ts)(sourceFile, textRange), Ch.filter(ts.isFunctionDeclaration), Ch.filter(node => !!node.body), Ch.filter(node => !!(ts.getCombinedModifierFlags(node) & ts.ModifierFlags.Async)), Ch.head, O.map(node => ({
14
+ description: "Rewrite to Effect.gen",
15
+ apply: T.gen(function* ($) {
16
+ const changeTracker = yield* $(T.service(AST.ChangeTrackerApi));
17
+ const importedEffectName = findModuleImportIdentifierName(ts)(sourceFile, "@effect/core/io/Effect");
18
+ const effectName = pipe(importedEffectName, O.getOrElse(() => "Effect"));
19
+ const newDeclaration = yield* $(transformAsyncAwaitToEffectGen(node, effectName, expression => ts.factory.createCallExpression(ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier(effectName), "promise"), undefined, [expression])));
20
+ changeTracker.replaceNode(sourceFile, node, newDeclaration);
21
+ })
22
+ })));
23
+ })
24
+ });
25
+ //# sourceMappingURL=asyncAwaitToGen.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asyncAwaitToGen.mjs","mappings":"AAAA,OAAO,KAAKA,CAAC,MAAM,wBAAwB;AAC3C,OAAO,KAAKC,GAAG,MAAM,8BAA8B;AACnD,SAASC,cAAc,QAAQ,+CAA+C;AAC9E,SAASC,8BAA8B,EAAEC,8BAA8B,QAAQ,gCAAgC;AAC/G,OAAO,KAAKC,EAAE,MAAM,kCAAkC;AACtD,SAASC,IAAI,QAAQ,8BAA8B;AACnD,OAAO,KAAKC,CAAC,MAAM,2BAA2B;AAE9C,4BAAeL,cAAc,CAAC;EAC5BM,IAAI,EAAE,wBAAwB;EAC9BC,WAAW,EAAE,uBAAuB;EACpCC,KAAK,EAAE,CAACC,UAAU,EAAEC,SAAS,KAC3BZ,CAAC,CAACa,GAAG,CAAC,WAAUC,CAAC;IACf,MAAMC,EAAE,GAAG,OAAOD,CAAC,CAACd,CAAC,CAACgB,OAAO,CAACf,GAAG,CAACgB,aAAa,CAAC,CAAC;IAEjD,OAAOX,IAAI,CACTL,GAAG,CAACiB,uBAAuB,CAACH,EAAE,CAAC,CAACJ,UAAU,EAAEC,SAAS,CAAC,EACtDP,EAAE,CAACc,MAAM,CAACJ,EAAE,CAACK,qBAAqB,CAAC,EACnCf,EAAE,CAACc,MAAM,CAAEE,IAAI,IAAK,CAAC,CAACA,IAAI,CAACC,IAAI,CAAC,EAChCjB,EAAE,CAACc,MAAM,CAAEE,IAAI,IAAK,CAAC,EAAEN,EAAE,CAACQ,wBAAwB,CAACF,IAAI,CAAC,GAAGN,EAAE,CAACS,aAAa,CAACC,KAAK,CAAC,CAAC,EACnFpB,EAAE,CAACqB,IAAI,EACPnB,CAAC,CAACoB,GAAG,CAAEN,IAAI,KAAM;MACfZ,WAAW,EAAE,uBAAuB;MACpCC,KAAK,EAAEV,CAAC,CAACa,GAAG,CAAC,WAAUC,CAAC;QACtB,MAAMc,aAAa,GAAG,OAAOd,CAAC,CAACd,CAAC,CAACgB,OAAO,CAACf,GAAG,CAAC4B,gBAAgB,CAAC,CAAC;QAC/D,MAAMC,kBAAkB,GAAI3B,8BAA8B,CAACY,EAAE,CAAC,CAACJ,UAAU,EAAE,wBAAwB,CAAE;QACrG,MAAMoB,UAAU,GAAGzB,IAAI,CAACwB,kBAAkB,EAAEvB,CAAC,CAACyB,SAAS,CAAC,MAAM,QAAQ,CAAC,CAAC;QAExE,MAAMC,cAAc,GAAG,OAAOnB,CAAC,CAACV,8BAA8B,CAACiB,IAAI,EAAEU,UAAU,EAAGG,UAAU,IAC1FnB,EAAE,CAACoB,OAAO,CAACC,oBAAoB,CAC7BrB,EAAE,CAACoB,OAAO,CAACE,8BAA8B,CACvCtB,EAAE,CAACoB,OAAO,CAACG,gBAAgB,CAACP,UAAU,CAAC,EACvC,SAAS,CACV,EACDQ,SAAS,EACT,CAACL,UAAU,CAAC,CACb,CAAC,CAAC;QAELN,aAAa,CAACY,WAAW,CAAC7B,UAAU,EAAEU,IAAI,EAAEY,cAAc,CAAC;MAC7D,CAAC;KACF,CAAC,CAAC,CACJ;EACH,CAAC;CACJ,CAAC","names":["T","AST","createRefactor","findModuleImportIdentifierName","transformAsyncAwaitToEffectGen","Ch","pipe","O","name","description","apply","sourceFile","textRange","gen","$","ts","service","TypeScriptApi","getNodesContainingRange","filter","isFunctionDeclaration","node","body","getCombinedModifierFlags","ModifierFlags","Async","head","map","changeTracker","ChangeTrackerApi","importedEffectName","effectName","getOrElse","newDeclaration","expression","factory","createCallExpression","createPropertyAccessExpression","createIdentifier","undefined","replaceNode"],"sourceRoot":"","sources":["../../../src/refactors/asyncAwaitToGen.ts"],"sourcesContent":[null]}
@@ -0,0 +1,30 @@
1
+ import * as T from "@effect/core/io/Effect";
2
+ import * as AST from "@effect/language-service/ast";
3
+ import { createRefactor } from "@effect/language-service/refactors/definition";
4
+ import { findModuleImportIdentifierName, transformAsyncAwaitToEffectGen } from "@effect/language-service/utils";
5
+ import * as Ch from "@tsplus/stdlib/collections/Chunk";
6
+ import { pipe } from "@tsplus/stdlib/data/Function";
7
+ import * as O from "@tsplus/stdlib/data/Maybe";
8
+ export default /*#__PURE__*/createRefactor({
9
+ name: "effect/asyncAwaitToGenTryPromise",
10
+ description: "Convert to Effect.gen with failures",
11
+ apply: (sourceFile, textRange) => T.gen(function* ($) {
12
+ const ts = yield* $(T.service(AST.TypeScriptApi));
13
+ return pipe(AST.getNodesContainingRange(ts)(sourceFile, textRange), Ch.filter(ts.isFunctionDeclaration), Ch.filter(node => !!node.body), Ch.filter(node => !!(ts.getCombinedModifierFlags(node) & ts.ModifierFlags.Async)), Ch.head, O.map(node => ({
14
+ description: "Rewrite to Effect.gen with failures",
15
+ apply: T.gen(function* ($) {
16
+ const changeTracker = yield* $(T.service(AST.ChangeTrackerApi));
17
+ const importedEffectName = findModuleImportIdentifierName(ts)(sourceFile, "@effect/core/io/Effect");
18
+ const effectName = pipe(importedEffectName, O.getOrElse(() => "Effect"));
19
+ let errorCount = 0;
20
+ function createErrorADT() {
21
+ errorCount++;
22
+ return ts.factory.createObjectLiteralExpression([ts.factory.createPropertyAssignment("_tag", ts.factory.createAsExpression(ts.factory.createStringLiteral("Error" + errorCount), ts.factory.createTypeReferenceNode("const"))), ts.factory.createShorthandPropertyAssignment("error")]);
23
+ }
24
+ const newDeclaration = yield* $(transformAsyncAwaitToEffectGen(node, effectName, expression => ts.factory.createCallExpression(ts.factory.createPropertyAccessExpression(ts.factory.createIdentifier(effectName), "tryCatchPromise"), undefined, [ts.factory.createArrowFunction(undefined, undefined, [], undefined, undefined, expression), ts.factory.createArrowFunction(undefined, undefined, [ts.factory.createParameterDeclaration(undefined, undefined, "error")], undefined, undefined, createErrorADT())])));
25
+ changeTracker.replaceNode(sourceFile, node, newDeclaration);
26
+ })
27
+ })));
28
+ })
29
+ });
30
+ //# sourceMappingURL=asyncAwaitToGenTryPromise.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asyncAwaitToGenTryPromise.mjs","mappings":"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","names":["T","AST","createRefactor","findModuleImportIdentifierName","transformAsyncAwaitToEffectGen","Ch","pipe","O","name","description","apply","sourceFile","textRange","gen","$","ts","service","TypeScriptApi","getNodesContainingRange","filter","isFunctionDeclaration","node","body","getCombinedModifierFlags","ModifierFlags","Async","head","map","changeTracker","ChangeTrackerApi","importedEffectName","effectName","getOrElse","errorCount","createErrorADT","factory","createObjectLiteralExpression","createPropertyAssignment","createAsExpression","createStringLiteral","createTypeReferenceNode","createShorthandPropertyAssignment","newDeclaration","expression","createCallExpression","createPropertyAccessExpression","createIdentifier","undefined","createArrowFunction","createParameterDeclaration","replaceNode"],"sourceRoot":"","sources":["../../../src/refactors/asyncAwaitToGenTryPromise.ts"],"sourcesContent":[null]}
@@ -0,0 +1,4 @@
1
+ export function createRefactor(definition) {
2
+ return definition;
3
+ }
4
+ //# sourceMappingURL=definition.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.mjs","mappings":"AAoBA,OAAM,SAAUA,cAAc,CAACC,UAA8B;EAC3D,OAAOA,UAAU;AACnB","names":["createRefactor","definition"],"sourceRoot":"","sources":["../../../src/refactors/definition.ts"],"sourcesContent":[null]}
@@ -0,0 +1,43 @@
1
+ import * as T from "@effect/core/io/Effect";
2
+ import * as AST from "@effect/language-service/ast";
3
+ import { createRefactor } from "@effect/language-service/refactors/definition";
4
+ import * as Ch from "@tsplus/stdlib/collections/Chunk";
5
+ import { pipe } from "@tsplus/stdlib/data/Function";
6
+ import * as O from "@tsplus/stdlib/data/Maybe";
7
+ export default /*#__PURE__*/createRefactor({
8
+ name: "effect/functionToArrow",
9
+ description: "Convert to arrow",
10
+ apply: (sourceFile, textRange) => T.gen(function* ($) {
11
+ const ts = yield* $(T.service(AST.TypeScriptApi));
12
+ return pipe(pipe(AST.getNodesContainingRange(ts)(sourceFile, textRange), Ch.filter(ts.isFunctionDeclaration)), Ch.concat(pipe(AST.getNodesContainingRange(ts)(sourceFile, textRange), Ch.filter(ts.isMethodDeclaration))), Ch.filter(node => !!node.body), Ch.filter(node => !!node.name && AST.isNodeInRange(textRange)(node.name)), Ch.head, O.map(node => ({
13
+ description: "Convert to arrow",
14
+ apply: T.gen(function* ($) {
15
+ const changeTracker = yield* $(T.service(AST.ChangeTrackerApi));
16
+ const body = node.body;
17
+ let newBody = ts.factory.createBlock(body.statements);
18
+ if (body.statements.length === 1) {
19
+ const statement = body.statements[0];
20
+ if (statement && ts.isReturnStatement(statement) && statement.expression) {
21
+ newBody = statement.expression;
22
+ }
23
+ }
24
+ let arrowFlags = ts.getCombinedModifierFlags(node);
25
+ arrowFlags &= ~ts.ModifierFlags.Export;
26
+ arrowFlags &= ~ts.ModifierFlags.Default;
27
+ const arrowModifiers = ts.factory.createModifiersFromModifierFlags(arrowFlags);
28
+ const arrowFunction = ts.factory.createArrowFunction(arrowModifiers, node.typeParameters, node.parameters, undefined, ts.factory.createToken(ts.SyntaxKind.EqualsGreaterThanToken), newBody);
29
+ let constFlags = ts.getCombinedModifierFlags(node);
30
+ constFlags &= ~arrowFlags;
31
+ const constModifiers = ts.factory.createModifiersFromModifierFlags(constFlags);
32
+ let newDeclaration = node;
33
+ if (ts.isMethodDeclaration(node)) {
34
+ newDeclaration = ts.factory.createPropertyDeclaration(constModifiers, node.name, undefined, undefined, arrowFunction);
35
+ } else if (ts.isFunctionDeclaration(node)) {
36
+ newDeclaration = ts.factory.createVariableStatement(constModifiers, ts.factory.createVariableDeclarationList([ts.factory.createVariableDeclaration(node.name, undefined, undefined, arrowFunction)], ts.NodeFlags.Const));
37
+ }
38
+ changeTracker.replaceNode(sourceFile, node, newDeclaration);
39
+ })
40
+ })));
41
+ })
42
+ });
43
+ //# sourceMappingURL=functionToArrow.mjs.map