@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.
- package/README.md +59 -0
- package/_mjs/ast.mjs +80 -0
- package/_mjs/ast.mjs.map +1 -0
- package/_mjs/config.mjs +24 -0
- package/_mjs/config.mjs.map +1 -0
- package/_mjs/diagnostics/definition.mjs +4 -0
- package/_mjs/diagnostics/definition.mjs.map +1 -0
- package/_mjs/diagnostics/ensureGetCallTrace.mjs +49 -0
- package/_mjs/diagnostics/ensureGetCallTrace.mjs.map +1 -0
- package/_mjs/diagnostics/index.mjs +9 -0
- package/_mjs/diagnostics/index.mjs.map +1 -0
- package/_mjs/diagnostics/noSyncWithConstant.mjs +36 -0
- package/_mjs/diagnostics/noSyncWithConstant.mjs.map +1 -0
- package/_mjs/diagnostics/removeCurryArrow.mjs +18 -0
- package/_mjs/diagnostics/removeCurryArrow.mjs.map +1 -0
- package/_mjs/index.mjs +111 -0
- package/_mjs/index.mjs.map +1 -0
- package/_mjs/refactors/addPipe.mjs +24 -0
- package/_mjs/refactors/addPipe.mjs.map +1 -0
- package/_mjs/refactors/asyncAwaitToGen.mjs +25 -0
- package/_mjs/refactors/asyncAwaitToGen.mjs.map +1 -0
- package/_mjs/refactors/asyncAwaitToGenTryPromise.mjs +30 -0
- package/_mjs/refactors/asyncAwaitToGenTryPromise.mjs.map +1 -0
- package/_mjs/refactors/definition.mjs +4 -0
- package/_mjs/refactors/definition.mjs.map +1 -0
- package/_mjs/refactors/functionToArrow.mjs +43 -0
- package/_mjs/refactors/functionToArrow.mjs.map +1 -0
- package/_mjs/refactors/index.mjs +19 -0
- package/_mjs/refactors/index.mjs.map +1 -0
- package/_mjs/refactors/removeCurryArrow.mjs +24 -0
- package/_mjs/refactors/removeCurryArrow.mjs.map +1 -0
- package/_mjs/refactors/removePipe.mjs +23 -0
- package/_mjs/refactors/removePipe.mjs.map +1 -0
- package/_mjs/refactors/toggleReturnTypeAnnotation.mjs +44 -0
- package/_mjs/refactors/toggleReturnTypeAnnotation.mjs.map +1 -0
- package/_mjs/refactors/toggleTypeAnnotation.mjs +37 -0
- package/_mjs/refactors/toggleTypeAnnotation.mjs.map +1 -0
- package/_mjs/utils.mjs +146 -0
- package/_mjs/utils.mjs.map +1 -0
- package/ast.d.ts +116 -0
- package/ast.d.ts.map +1 -0
- package/ast.js +100 -0
- package/ast.js.map +1 -0
- package/config.d.ts +10 -0
- package/config.d.ts.map +1 -0
- package/config.js +31 -0
- package/config.js.map +1 -0
- package/diagnostics/definition.d.ts +15 -0
- package/diagnostics/definition.d.ts.map +1 -0
- package/diagnostics/definition.js +10 -0
- package/diagnostics/definition.js.map +1 -0
- package/diagnostics/ensureGetCallTrace.d.ts +3 -0
- package/diagnostics/ensureGetCallTrace.d.ts.map +1 -0
- package/diagnostics/ensureGetCallTrace.js +58 -0
- package/diagnostics/ensureGetCallTrace.js.map +1 -0
- package/diagnostics/index.d.ts +7 -0
- package/diagnostics/index.d.ts.map +1 -0
- package/diagnostics/index.js +17 -0
- package/diagnostics/index.js.map +1 -0
- package/diagnostics/noSyncWithConstant.d.ts +3 -0
- package/diagnostics/noSyncWithConstant.d.ts.map +1 -0
- package/diagnostics/noSyncWithConstant.js +45 -0
- package/diagnostics/noSyncWithConstant.js.map +1 -0
- package/diagnostics/removeCurryArrow.d.ts +3 -0
- package/diagnostics/removeCurryArrow.d.ts.map +1 -0
- package/diagnostics/removeCurryArrow.js +27 -0
- package/diagnostics/removeCurryArrow.js.map +1 -0
- package/index.d.ts +2 -0
- package/index.d.ts.map +1 -0
- package/index.js +116 -0
- package/index.js.map +1 -0
- package/package.json +43 -0
- package/refactors/addPipe.d.ts +3 -0
- package/refactors/addPipe.d.ts.map +1 -0
- package/refactors/addPipe.js +33 -0
- package/refactors/addPipe.js.map +1 -0
- package/refactors/asyncAwaitToGen.d.ts +3 -0
- package/refactors/asyncAwaitToGen.d.ts.map +1 -0
- package/refactors/asyncAwaitToGen.js +34 -0
- package/refactors/asyncAwaitToGen.js.map +1 -0
- package/refactors/asyncAwaitToGenTryPromise.d.ts +3 -0
- package/refactors/asyncAwaitToGenTryPromise.d.ts.map +1 -0
- package/refactors/asyncAwaitToGenTryPromise.js +39 -0
- package/refactors/asyncAwaitToGenTryPromise.js.map +1 -0
- package/refactors/definition.d.ts +13 -0
- package/refactors/definition.d.ts.map +1 -0
- package/refactors/definition.js +10 -0
- package/refactors/definition.js.map +1 -0
- package/refactors/functionToArrow.d.ts +3 -0
- package/refactors/functionToArrow.d.ts.map +1 -0
- package/refactors/functionToArrow.js +52 -0
- package/refactors/functionToArrow.js.map +1 -0
- package/refactors/index.d.ts +12 -0
- package/refactors/index.d.ts.map +1 -0
- package/refactors/index.js +27 -0
- package/refactors/index.js.map +1 -0
- package/refactors/removeCurryArrow.d.ts +3 -0
- package/refactors/removeCurryArrow.d.ts.map +1 -0
- package/refactors/removeCurryArrow.js +33 -0
- package/refactors/removeCurryArrow.js.map +1 -0
- package/refactors/removePipe.d.ts +3 -0
- package/refactors/removePipe.d.ts.map +1 -0
- package/refactors/removePipe.js +32 -0
- package/refactors/removePipe.js.map +1 -0
- package/refactors/toggleReturnTypeAnnotation.d.ts +3 -0
- package/refactors/toggleReturnTypeAnnotation.d.ts.map +1 -0
- package/refactors/toggleReturnTypeAnnotation.js +53 -0
- package/refactors/toggleReturnTypeAnnotation.js.map +1 -0
- package/refactors/toggleTypeAnnotation.d.ts +3 -0
- package/refactors/toggleTypeAnnotation.d.ts.map +1 -0
- package/refactors/toggleTypeAnnotation.js +46 -0
- package/refactors/toggleTypeAnnotation.js.map +1 -0
- package/utils.d.ts +15 -0
- package/utils.d.ts.map +1 -0
- package/utils.js +163 -0
- 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
|
+

|
|
28
|
+
|
|
29
|
+
Transform a set of function calls to a pipe() call.
|
|
30
|
+
|
|
31
|
+
### Remove pipe
|
|
32
|
+
|
|
33
|
+

|
|
34
|
+
|
|
35
|
+
Transform a pipe() call into a series of regular function calls.
|
|
36
|
+
|
|
37
|
+
### Remove curry arrow
|
|
38
|
+
|
|
39
|
+

|
|
40
|
+
|
|
41
|
+
Removes useless arrow functions.
|
|
42
|
+
|
|
43
|
+
### Toggle type annotation
|
|
44
|
+
|
|
45
|
+

|
|
46
|
+
|
|
47
|
+
With a single refactor, adds or removes type annotations from the definition.
|
|
48
|
+
|
|
49
|
+
### async-await to Effect.gen
|
|
50
|
+
|
|
51
|
+

|
|
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
|
+

|
|
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
|
package/_mjs/ast.mjs.map
ADDED
|
@@ -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]}
|
package/_mjs/config.mjs
ADDED
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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
|