@effect/language-service 0.49.0 → 0.50.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 +1 -0
- package/cli.js +69 -3
- package/cli.js.map +1 -1
- package/effect-lsp-patch-utils.js +69 -3
- package/effect-lsp-patch-utils.js.map +1 -1
- package/index.js +69 -3
- package/index.js.map +1 -1
- package/package.json +1 -1
- package/transform.js +69 -3
- package/transform.js.map +1 -1
|
@@ -1197,7 +1197,8 @@ var defaults = {
|
|
|
1197
1197
|
pattern: "default",
|
|
1198
1198
|
skipLeadingPath: ["src/"]
|
|
1199
1199
|
}],
|
|
1200
|
-
extendedKeyDetection: false
|
|
1200
|
+
extendedKeyDetection: false,
|
|
1201
|
+
pipeableMinArgCount: 1
|
|
1201
1202
|
};
|
|
1202
1203
|
function parseKeyPatterns(patterns) {
|
|
1203
1204
|
const result = [];
|
|
@@ -1232,7 +1233,8 @@ function parse(config) {
|
|
|
1232
1233
|
renames: isObject(config) && hasProperty(config, "renames") && isBoolean(config.renames) ? config.renames : defaults.renames,
|
|
1233
1234
|
noExternal: isObject(config) && hasProperty(config, "noExternal") && isBoolean(config.noExternal) ? config.noExternal : defaults.noExternal,
|
|
1234
1235
|
keyPatterns: isObject(config) && hasProperty(config, "keyPatterns") && isArray(config.keyPatterns) ? parseKeyPatterns(config.keyPatterns) : defaults.keyPatterns,
|
|
1235
|
-
extendedKeyDetection: isObject(config) && hasProperty(config, "extendedKeyDetection") && isBoolean(config.extendedKeyDetection) ? config.extendedKeyDetection : defaults.extendedKeyDetection
|
|
1236
|
+
extendedKeyDetection: isObject(config) && hasProperty(config, "extendedKeyDetection") && isBoolean(config.extendedKeyDetection) ? config.extendedKeyDetection : defaults.extendedKeyDetection,
|
|
1237
|
+
pipeableMinArgCount: isObject(config) && hasProperty(config, "pipeableMinArgCount") && isNumber(config.pipeableMinArgCount) ? config.pipeableMinArgCount : defaults.pipeableMinArgCount
|
|
1236
1238
|
};
|
|
1237
1239
|
}
|
|
1238
1240
|
|
|
@@ -4271,6 +4273,69 @@ More info at https://effect.website/docs/requirements-management/layers/#avoidin
|
|
|
4271
4273
|
})
|
|
4272
4274
|
});
|
|
4273
4275
|
|
|
4276
|
+
// src/diagnostics/missedPipeableOpportunity.ts
|
|
4277
|
+
var missedPipeableOpportunity = createDiagnostic({
|
|
4278
|
+
name: "missedPipeableOpportunity",
|
|
4279
|
+
code: 26,
|
|
4280
|
+
severity: "off",
|
|
4281
|
+
apply: fn("missedPipeableOpportunity.apply")(function* (sourceFile, report) {
|
|
4282
|
+
const ts = yield* service(TypeScriptApi);
|
|
4283
|
+
const typeChecker = yield* service(TypeCheckerApi);
|
|
4284
|
+
const typeParser = yield* service(TypeParser);
|
|
4285
|
+
const options = yield* service(LanguageServicePluginOptions);
|
|
4286
|
+
const nodeToVisit = [sourceFile];
|
|
4287
|
+
const prependNodeToVisit = (node) => {
|
|
4288
|
+
nodeToVisit.unshift(node);
|
|
4289
|
+
return void 0;
|
|
4290
|
+
};
|
|
4291
|
+
const callChainNodes = /* @__PURE__ */ new WeakMap();
|
|
4292
|
+
while (nodeToVisit.length > 0) {
|
|
4293
|
+
const node = nodeToVisit.shift();
|
|
4294
|
+
if (ts.isCallExpression(node) && node.arguments.length === 1 && node.parent) {
|
|
4295
|
+
const parentChain = callChainNodes.get(node.parent) || [];
|
|
4296
|
+
callChainNodes.set(node, parentChain.concat(node));
|
|
4297
|
+
} else if (node.parent && callChainNodes.has(node.parent) && ts.isExpression(node)) {
|
|
4298
|
+
const parentChain = callChainNodes.get(node.parent) || [];
|
|
4299
|
+
const originalParentChain = parentChain.slice();
|
|
4300
|
+
parentChain.push(node);
|
|
4301
|
+
while (parentChain.length > options.pipeableMinArgCount) {
|
|
4302
|
+
const subject = parentChain.pop();
|
|
4303
|
+
const resultType = typeChecker.getTypeAtLocation(subject);
|
|
4304
|
+
const pipeableType = yield* pipe(typeParser.pipeableType(resultType, subject), orElse2(() => void_));
|
|
4305
|
+
if (pipeableType) {
|
|
4306
|
+
report({
|
|
4307
|
+
location: parentChain[0],
|
|
4308
|
+
messageText: `Nested function calls can be converted to pipeable style for better readability.`,
|
|
4309
|
+
fixes: [{
|
|
4310
|
+
fixName: "missedPipeableOpportunity_fix",
|
|
4311
|
+
description: "Convert to pipe style",
|
|
4312
|
+
apply: gen(function* () {
|
|
4313
|
+
const changeTracker = yield* service(ChangeTracker);
|
|
4314
|
+
changeTracker.replaceNode(
|
|
4315
|
+
sourceFile,
|
|
4316
|
+
parentChain[0],
|
|
4317
|
+
ts.factory.createCallExpression(
|
|
4318
|
+
ts.factory.createPropertyAccessExpression(
|
|
4319
|
+
subject,
|
|
4320
|
+
"pipe"
|
|
4321
|
+
),
|
|
4322
|
+
void 0,
|
|
4323
|
+
parentChain.filter(ts.isCallExpression).map((call) => call.expression)
|
|
4324
|
+
)
|
|
4325
|
+
);
|
|
4326
|
+
})
|
|
4327
|
+
}]
|
|
4328
|
+
});
|
|
4329
|
+
originalParentChain.forEach((node2) => callChainNodes.delete(node2));
|
|
4330
|
+
break;
|
|
4331
|
+
}
|
|
4332
|
+
}
|
|
4333
|
+
}
|
|
4334
|
+
ts.forEachChild(node, prependNodeToVisit);
|
|
4335
|
+
}
|
|
4336
|
+
})
|
|
4337
|
+
});
|
|
4338
|
+
|
|
4274
4339
|
// src/diagnostics/missingEffectContext.ts
|
|
4275
4340
|
var missingEffectContext = createDiagnostic({
|
|
4276
4341
|
name: "missingEffectContext",
|
|
@@ -5839,7 +5904,8 @@ var diagnostics = [
|
|
|
5839
5904
|
overriddenSchemaConstructor,
|
|
5840
5905
|
unsupportedServiceAccessors,
|
|
5841
5906
|
nonObjectEffectServiceType,
|
|
5842
|
-
deterministicKeys
|
|
5907
|
+
deterministicKeys,
|
|
5908
|
+
missedPipeableOpportunity
|
|
5843
5909
|
];
|
|
5844
5910
|
|
|
5845
5911
|
// src/effect-lsp-patch-utils.ts
|