@effect/language-service 0.23.3 → 0.23.5
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 -1
- package/index.js +116 -60
- package/index.js.map +1 -1
- package/package.json +1 -1
- package/transform.js +112 -14
- package/transform.js.map +1 -1
package/package.json
CHANGED
package/transform.js
CHANGED
|
@@ -734,6 +734,9 @@ var isRight2 = isRight;
|
|
|
734
734
|
var map = /* @__PURE__ */ dual(2, (self, f) => isRight2(self) ? right2(f(self.right)) : left2(self.left));
|
|
735
735
|
var getOrElse = /* @__PURE__ */ dual(2, (self, onLeft) => isLeft2(self) ? onLeft(self.left) : self.right);
|
|
736
736
|
|
|
737
|
+
// node_modules/.pnpm/effect@3.16.5/node_modules/effect/dist/esm/internal/array.js
|
|
738
|
+
var isNonEmptyArray = (self) => self.length > 0;
|
|
739
|
+
|
|
737
740
|
// node_modules/.pnpm/effect@3.16.5/node_modules/effect/dist/esm/Order.js
|
|
738
741
|
var make = (compare) => (self, that) => self === that ? 0 : compare(self, that);
|
|
739
742
|
|
|
@@ -754,6 +757,19 @@ var fromIterable = (collection) => Array.isArray(collection) ? collection : Arra
|
|
|
754
757
|
var append = /* @__PURE__ */ dual(2, (self, last) => [...self, last]);
|
|
755
758
|
var appendAll = /* @__PURE__ */ dual(2, (self, that) => fromIterable(self).concat(fromIterable(that)));
|
|
756
759
|
var isArray = Array.isArray;
|
|
760
|
+
var isEmptyArray = (self) => self.length === 0;
|
|
761
|
+
var isEmptyReadonlyArray = isEmptyArray;
|
|
762
|
+
var isNonEmptyReadonlyArray = isNonEmptyArray;
|
|
763
|
+
var isOutOfBounds = (i, as) => i < 0 || i >= as.length;
|
|
764
|
+
var unsafeGet = /* @__PURE__ */ dual(2, (self, index) => {
|
|
765
|
+
const i = Math.floor(index);
|
|
766
|
+
if (isOutOfBounds(i, self)) {
|
|
767
|
+
throw new Error(`Index ${i} out of bounds`);
|
|
768
|
+
}
|
|
769
|
+
return self[i];
|
|
770
|
+
});
|
|
771
|
+
var headNonEmpty = /* @__PURE__ */ unsafeGet(0);
|
|
772
|
+
var tailNonEmpty = (self) => self.slice(1);
|
|
757
773
|
var sort = /* @__PURE__ */ dual(2, (self, O) => {
|
|
758
774
|
const out = Array.from(self);
|
|
759
775
|
out.sort(O);
|
|
@@ -775,6 +791,20 @@ var intersectionWith = (isEquivalent) => {
|
|
|
775
791
|
var intersection = /* @__PURE__ */ intersectionWith(_equivalence);
|
|
776
792
|
var empty = () => [];
|
|
777
793
|
var map2 = /* @__PURE__ */ dual(2, (self, f) => self.map(f));
|
|
794
|
+
var flatMap = /* @__PURE__ */ dual(2, (self, f) => {
|
|
795
|
+
if (isEmptyReadonlyArray(self)) {
|
|
796
|
+
return [];
|
|
797
|
+
}
|
|
798
|
+
const out = [];
|
|
799
|
+
for (let i = 0; i < self.length; i++) {
|
|
800
|
+
const inner = f(self[i], i);
|
|
801
|
+
for (let j = 0; j < inner.length; j++) {
|
|
802
|
+
out.push(inner[j]);
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
return out;
|
|
806
|
+
});
|
|
807
|
+
var flatten = /* @__PURE__ */ flatMap(identity);
|
|
778
808
|
var filter = /* @__PURE__ */ dual(2, (self, predicate) => {
|
|
779
809
|
const as = fromIterable(self);
|
|
780
810
|
const out = [];
|
|
@@ -785,6 +815,21 @@ var filter = /* @__PURE__ */ dual(2, (self, predicate) => {
|
|
|
785
815
|
}
|
|
786
816
|
return out;
|
|
787
817
|
});
|
|
818
|
+
var dedupeWith = /* @__PURE__ */ dual(2, (self, isEquivalent) => {
|
|
819
|
+
const input = fromIterable(self);
|
|
820
|
+
if (isNonEmptyReadonlyArray(input)) {
|
|
821
|
+
const out = [headNonEmpty(input)];
|
|
822
|
+
const rest = tailNonEmpty(input);
|
|
823
|
+
for (const r of rest) {
|
|
824
|
+
if (out.every((a) => !isEquivalent(r, a))) {
|
|
825
|
+
out.push(r);
|
|
826
|
+
}
|
|
827
|
+
}
|
|
828
|
+
return out;
|
|
829
|
+
}
|
|
830
|
+
return [];
|
|
831
|
+
});
|
|
832
|
+
var dedupe = (self) => dedupeWith(self, equivalence());
|
|
788
833
|
|
|
789
834
|
// src/core/Nano.ts
|
|
790
835
|
function makeInternalSuccess(value) {
|
|
@@ -861,7 +906,7 @@ var sync = (value) => {
|
|
|
861
906
|
};
|
|
862
907
|
return nano;
|
|
863
908
|
};
|
|
864
|
-
var
|
|
909
|
+
var flatMap2 = dual(2, (fa, f) => make2((ctx) => {
|
|
865
910
|
const result = fa.run(ctx);
|
|
866
911
|
if (result._tag !== "Right") return result;
|
|
867
912
|
return f(result.value).run(ctx);
|
|
@@ -1010,14 +1055,43 @@ function parsePackageContentNameAndVersionFromScope(v) {
|
|
|
1010
1055
|
if (!isString(name)) return;
|
|
1011
1056
|
if (!isString(version)) return;
|
|
1012
1057
|
const hasEffectInPeerDependencies = hasProperty(packageJsonContent, "peerDependencies") && isObject(packageJsonContent.peerDependencies) && hasProperty(packageJsonContent.peerDependencies, "effect");
|
|
1058
|
+
const referencedPackages = Object.keys({
|
|
1059
|
+
...hasProperty(packageJsonContent, "dependencies") && isObject(packageJsonContent.dependencies) ? packageJsonContent.dependencies : {},
|
|
1060
|
+
...hasProperty(packageJsonContent, "peerDependencies") && isObject(packageJsonContent.peerDependencies) ? packageJsonContent.peerDependencies : {},
|
|
1061
|
+
...hasProperty(packageJsonContent, "devDependencies") && isObject(packageJsonContent.devDependencies) ? packageJsonContent.devDependencies : {}
|
|
1062
|
+
});
|
|
1013
1063
|
return {
|
|
1014
1064
|
name: name.toLowerCase(),
|
|
1015
1065
|
version: version.toLowerCase(),
|
|
1016
1066
|
hasEffectInPeerDependencies,
|
|
1017
1067
|
contents: packageJsonContent,
|
|
1018
|
-
packageDirectory: packageJsonScope.packageDirectory
|
|
1068
|
+
packageDirectory: packageJsonScope.packageDirectory,
|
|
1069
|
+
referencedPackages
|
|
1019
1070
|
};
|
|
1020
1071
|
}
|
|
1072
|
+
var resolveModulePattern = fn("resolveModulePattern")(
|
|
1073
|
+
function* (sourceFile, pattern) {
|
|
1074
|
+
if (pattern.indexOf("*") === -1) return [pattern.toLowerCase()];
|
|
1075
|
+
const ts = yield* service(TypeScriptApi);
|
|
1076
|
+
const packageJsonScope = parsePackageContentNameAndVersionFromScope(sourceFile);
|
|
1077
|
+
const referencedPackages = [];
|
|
1078
|
+
for (const statement of sourceFile.statements) {
|
|
1079
|
+
if (ts.isImportDeclaration(statement) && ts.isStringLiteral(statement.moduleSpecifier)) {
|
|
1080
|
+
const moduleSpecifier = statement.moduleSpecifier.text.toLowerCase();
|
|
1081
|
+
const packageName = moduleSpecifier.startsWith("@") ? moduleSpecifier.split("/", 2).join("/") : moduleSpecifier.split("/", 1).join("/");
|
|
1082
|
+
referencedPackages.push(packageName);
|
|
1083
|
+
}
|
|
1084
|
+
}
|
|
1085
|
+
return pipe(
|
|
1086
|
+
referencedPackages.concat(packageJsonScope?.referencedPackages || []),
|
|
1087
|
+
dedupe,
|
|
1088
|
+
map2((packageName) => packageName.toLowerCase()),
|
|
1089
|
+
filter(
|
|
1090
|
+
(packageName) => pattern.endsWith("*") && packageName.startsWith(pattern.toLowerCase().substring(0, pattern.length - 1))
|
|
1091
|
+
)
|
|
1092
|
+
);
|
|
1093
|
+
}
|
|
1094
|
+
);
|
|
1021
1095
|
function makeGetModuleSpecifier(ts) {
|
|
1022
1096
|
if (!(hasProperty(ts, "moduleSpecifiers") && hasProperty(ts.moduleSpecifiers, "getModuleSpecifier") && isFunction2(ts.moduleSpecifiers.getModuleSpecifier))) return;
|
|
1023
1097
|
const _internal = ts.moduleSpecifiers.getModuleSpecifier;
|
|
@@ -1187,7 +1261,7 @@ var createDiagnosticExecutor = fn("LSP.createCommentDirectivesProcessor")(
|
|
|
1187
1261
|
const fixByDisableNextLine = (_) => ({
|
|
1188
1262
|
fixName: rule.name + "_skipNextLine",
|
|
1189
1263
|
description: "Disable " + rule.name + " for this line",
|
|
1190
|
-
apply:
|
|
1264
|
+
apply: flatMap2(
|
|
1191
1265
|
service(ChangeTracker),
|
|
1192
1266
|
(changeTracker) => sync(() => {
|
|
1193
1267
|
const disableAtNode = findParentStatementForDisableNextLine(_.node);
|
|
@@ -1204,7 +1278,7 @@ var createDiagnosticExecutor = fn("LSP.createCommentDirectivesProcessor")(
|
|
|
1204
1278
|
const fixByDisableEntireFile = {
|
|
1205
1279
|
fixName: rule.name + "_skipFile",
|
|
1206
1280
|
description: "Disable " + rule.name + " for this entire file",
|
|
1207
|
-
apply:
|
|
1281
|
+
apply: flatMap2(
|
|
1208
1282
|
service(ChangeTracker),
|
|
1209
1283
|
(changeTracker) => sync(
|
|
1210
1284
|
() => changeTracker.insertText(
|
|
@@ -2500,7 +2574,14 @@ var importFromBarrel = createDiagnostic({
|
|
|
2500
2574
|
const ts = yield* service(TypeScriptApi);
|
|
2501
2575
|
const typeChecker = yield* service(TypeCheckerApi);
|
|
2502
2576
|
const program = yield* service(TypeScriptProgram);
|
|
2503
|
-
const
|
|
2577
|
+
const packageNamesToCheck = flatten(
|
|
2578
|
+
yield* all(
|
|
2579
|
+
...languageServicePluginOptions.namespaceImportPackages.map(
|
|
2580
|
+
(packageName) => resolveModulePattern(sourceFile, packageName)
|
|
2581
|
+
)
|
|
2582
|
+
)
|
|
2583
|
+
);
|
|
2584
|
+
const isImportedFromBarrelExport = (element) => {
|
|
2504
2585
|
const getModuleSpecifier = makeGetModuleSpecifier(ts);
|
|
2505
2586
|
const resolveExternalModuleName = makeResolveExternalModuleName(typeChecker);
|
|
2506
2587
|
if (!(getModuleSpecifier && resolveExternalModuleName)) return;
|
|
@@ -2513,12 +2594,14 @@ var importFromBarrel = createDiagnostic({
|
|
|
2513
2594
|
if (!namedBindings) return;
|
|
2514
2595
|
if (!ts.isNamedImports(namedBindings)) return;
|
|
2515
2596
|
const barrelModuleName = importDeclaration.moduleSpecifier.text;
|
|
2516
|
-
if (
|
|
2597
|
+
if (packageNamesToCheck.indexOf(barrelModuleName.toLowerCase()) === -1) return;
|
|
2517
2598
|
const moduleSymbol = resolveExternalModuleName(importDeclaration.moduleSpecifier);
|
|
2518
2599
|
if (!moduleSymbol) return;
|
|
2519
2600
|
if (!moduleSymbol.exports) return;
|
|
2520
2601
|
const sourceFile2 = importDeclaration.getSourceFile();
|
|
2521
2602
|
const nodeForSymbol = element.propertyName || element.name;
|
|
2603
|
+
const aliasSymbol = element.name || element.propertyName;
|
|
2604
|
+
const aliasedName = aliasSymbol.text;
|
|
2522
2605
|
if (!ts.isIdentifier(nodeForSymbol)) return;
|
|
2523
2606
|
const importedName = nodeForSymbol.text;
|
|
2524
2607
|
const reexportedSymbol = moduleSymbol.exports.get(ts.escapeLeadingUnderscores(importedName));
|
|
@@ -2541,7 +2624,15 @@ var importFromBarrel = createDiagnostic({
|
|
|
2541
2624
|
program
|
|
2542
2625
|
);
|
|
2543
2626
|
if (unbarrelledFileName.toLowerCase().indexOf(barrelModuleName.toLowerCase() + "/") === -1) return;
|
|
2544
|
-
return {
|
|
2627
|
+
return {
|
|
2628
|
+
unbarrelledFileName,
|
|
2629
|
+
importedName,
|
|
2630
|
+
barrelModuleName,
|
|
2631
|
+
importClause,
|
|
2632
|
+
namedBindings,
|
|
2633
|
+
importDeclaration,
|
|
2634
|
+
aliasedName
|
|
2635
|
+
};
|
|
2545
2636
|
};
|
|
2546
2637
|
const nodeToVisit = [];
|
|
2547
2638
|
const appendNodeToVisit = (node) => {
|
|
@@ -2556,16 +2647,23 @@ var importFromBarrel = createDiagnostic({
|
|
|
2556
2647
|
ts.forEachChild(node, appendNodeToVisit);
|
|
2557
2648
|
continue;
|
|
2558
2649
|
}
|
|
2559
|
-
const result = isImportedFromBarrelExport(node
|
|
2650
|
+
const result = isImportedFromBarrelExport(node);
|
|
2560
2651
|
if (!result) continue;
|
|
2561
|
-
const {
|
|
2652
|
+
const {
|
|
2653
|
+
aliasedName,
|
|
2654
|
+
barrelModuleName,
|
|
2655
|
+
importClause,
|
|
2656
|
+
importDeclaration,
|
|
2657
|
+
namedBindings,
|
|
2658
|
+
unbarrelledFileName
|
|
2659
|
+
} = result;
|
|
2562
2660
|
report({
|
|
2563
2661
|
node,
|
|
2564
2662
|
messageText: `Importing from barrel module ${barrelModuleName} is not allowed.`,
|
|
2565
2663
|
fixes: [
|
|
2566
2664
|
{
|
|
2567
2665
|
fixName: "replaceWithUnbarrelledImport",
|
|
2568
|
-
description: `Import * as ${
|
|
2666
|
+
description: `Import * as ${aliasedName} from ${unbarrelledFileName}`,
|
|
2569
2667
|
apply: gen(function* () {
|
|
2570
2668
|
const changeTracker = yield* service(ChangeTracker);
|
|
2571
2669
|
const newImport = ts.factory.createImportDeclaration(
|
|
@@ -2573,7 +2671,7 @@ var importFromBarrel = createDiagnostic({
|
|
|
2573
2671
|
ts.factory.createImportClause(
|
|
2574
2672
|
importClause.isTypeOnly || node.isTypeOnly,
|
|
2575
2673
|
void 0,
|
|
2576
|
-
ts.factory.createNamespaceImport(ts.factory.createIdentifier(
|
|
2674
|
+
ts.factory.createNamespaceImport(ts.factory.createIdentifier(aliasedName))
|
|
2577
2675
|
),
|
|
2578
2676
|
ts.factory.createStringLiteral(unbarrelledFileName)
|
|
2579
2677
|
);
|
|
@@ -2694,7 +2792,7 @@ More info at https://effect.website/docs/requirements-management/layers/#avoidin
|
|
|
2694
2792
|
for (const [type, reportAt] of typesToCheck) {
|
|
2695
2793
|
yield* pipe(
|
|
2696
2794
|
typeParser.contextTag(type, node),
|
|
2697
|
-
|
|
2795
|
+
flatMap2(
|
|
2698
2796
|
({ Service }) => pipe(
|
|
2699
2797
|
parseLeakedRequirements(Service, node),
|
|
2700
2798
|
map3((requirements) => reportLeakingRequirements(reportAt, sort(requirements, typeOrder)))
|
|
@@ -2722,7 +2820,7 @@ var missingEffectContext = createDiagnostic({
|
|
|
2722
2820
|
typeParser.effectType(expectedType, node),
|
|
2723
2821
|
typeParser.effectType(realType, valueNode)
|
|
2724
2822
|
),
|
|
2725
|
-
|
|
2823
|
+
flatMap2(
|
|
2726
2824
|
([expectedEffect, realEffect]) => getMissingTypeEntriesInTargetType(
|
|
2727
2825
|
realEffect.R,
|
|
2728
2826
|
expectedEffect.R
|
|
@@ -2770,7 +2868,7 @@ var missingEffectError = createDiagnostic({
|
|
|
2770
2868
|
typeParser.effectType(expectedType, node),
|
|
2771
2869
|
typeParser.effectType(realType, valueNode)
|
|
2772
2870
|
),
|
|
2773
|
-
|
|
2871
|
+
flatMap2(
|
|
2774
2872
|
([expectedEffect, realEffect]) => getMissingTypeEntriesInTargetType(
|
|
2775
2873
|
realEffect.E,
|
|
2776
2874
|
expectedEffect.E
|