diff --git a/cli/src/main/scala/org/scalablytyped/converter/cli/Main.scala b/cli/src/main/scala/org/scalablytyped/converter/cli/Main.scala index a49eb2a4dd..5c5b537837 100644 --- a/cli/src/main/scala/org/scalablytyped/converter/cli/Main.scala +++ b/cli/src/main/scala/org/scalablytyped/converter/cli/Main.scala @@ -37,6 +37,7 @@ object Main { enableScalaJsDefined = Selection.All, flavour = Flavour.Normal, ignored = SortedSet("typescript"), + explicitlyIncluded = None, stdLibs = SortedSet("es6"), expandTypeMappings = EnabledTypeMappingExpansion.DefaultSelection, versions = Versions(Versions.Scala3, Versions.ScalaJs1), @@ -155,6 +156,9 @@ object Main { opt[Seq[String]]("ignoredLibs") .action((x, c) => c.mapConversion(_.copy(ignored = x.toSet.sorted))) .text(s"Libraries you want to ignore"), + opt[Seq[String]]("explicitlyIncludedLibs") + .action((x, c) => c.mapConversion(_.copy(explicitlyIncluded = Some(x.toSet.sorted)))) + .text(s"Libraries you want to explicitly include"), opt[String]("privateWithin") .action((x, c) => c.mapConversion(_.copy(privateWithin = Some(Name(x))))) .text(s"Libraries you want to ignore"), @@ -263,6 +267,7 @@ object Main { resolve = bootstrapped.libraryResolver, ignored = conversion.ignoredLibs, ignoredModulePrefixes = conversion.ignoredModulePrefixes, + explicitlyIncluded = conversion.explicitlyIncludedLibs, pedantic = false, parser = PersistingParser(parseCachePath, bootstrapped.inputFolders, logger.void), expandTypeMappings = conversion.expandTypeMappings, diff --git a/docs/conversion-options.md b/docs/conversion-options.md index c48a1391f4..75c9ce3593 100644 --- a/docs/conversion-options.md +++ b/docs/conversion-options.md @@ -40,6 +40,28 @@ project.settings( ) ``` +### `stExplicitInclude` +With many js dependencies, you might want to not automatically generate code for every depenendency, that you then need to ignore. +You can explicitly list the packages or modules that should be processed instead: + +```scala +project.settings( + stExplicitInclude := Some(List( + "is-object", + "is-number", + )) +) +``` + +Be aware, that `stIgnore` takes precedence if you use it together with `stExplicitInclude`. + +Switch back to default behavior of processing every dependency: +```scala +project.settings( + stExplicitInclude := None +) +``` + ### `stIncludeDev` By default the plugin only includes dependencies defined with `npmDependencies`. diff --git a/importer-portable/src/main/scala/org/scalablytyped/converter/internal/importer/ConversionOptions.scala b/importer-portable/src/main/scala/org/scalablytyped/converter/internal/importer/ConversionOptions.scala index 31020d52e7..b59fe91b40 100644 --- a/importer-portable/src/main/scala/org/scalablytyped/converter/internal/importer/ConversionOptions.scala +++ b/importer-portable/src/main/scala/org/scalablytyped/converter/internal/importer/ConversionOptions.scala @@ -17,6 +17,7 @@ case class ConversionOptions( stdLibs: SortedSet[String], expandTypeMappings: Selection[TsIdentLibrary], ignored: SortedSet[String], + explicitlyIncluded: Option[SortedSet[String]], versions: Versions, organization: String, enableReactTreeShaking: Selection[Name], @@ -24,6 +25,9 @@ case class ConversionOptions( privateWithin: Option[Name], useDeprecatedModuleNames: Boolean, ) { + val explicitlyIncludedLibs: Option[Set[TsIdentLibrary]] = + explicitlyIncluded.map(_.map(TsIdentLibrary.apply)) + val ignoredLibs: Set[TsIdentLibrary] = ignored.map(TsIdentLibrary.apply) diff --git a/importer-portable/src/main/scala/org/scalablytyped/converter/internal/importer/Phase1ReadTypescript.scala b/importer-portable/src/main/scala/org/scalablytyped/converter/internal/importer/Phase1ReadTypescript.scala index 5617e562bd..343e15da64 100644 --- a/importer-portable/src/main/scala/org/scalablytyped/converter/internal/importer/Phase1ReadTypescript.scala +++ b/importer-portable/src/main/scala/org/scalablytyped/converter/internal/importer/Phase1ReadTypescript.scala @@ -21,6 +21,7 @@ class Phase1ReadTypescript( calculateLibraryVersion: CalculateLibraryVersion, ignored: Set[TsIdentLibrary], ignoredModulePrefixes: Set[List[String]], + explicitlyIncluded: Option[Set[TsIdentLibrary]], pedantic: Boolean, parser: InFile => Either[String, TsParsedFile], expandTypeMappings: Selection[TsIdentLibrary], @@ -47,7 +48,7 @@ class Phase1ReadTypescript( ): PhaseRes[LibTsSource, LibTs] = { source match { case source if ignored(source.libName) || isCircular => PhaseRes.Ignore() - case source => + case source if explicitlyIncluded.forall(_(source.libName)) => val includedFiles: IArray[InFile] = source match { case LibTsSource.StdLibSource(_, files, _) => diff --git a/importer/src/main/scala/org/scalablytyped/converter/internal/importer/Ci.scala b/importer/src/main/scala/org/scalablytyped/converter/internal/importer/Ci.scala index c029b6b2a4..57f1fbb36b 100644 --- a/importer/src/main/scala/org/scalablytyped/converter/internal/importer/Ci.scala +++ b/importer/src/main/scala/org/scalablytyped/converter/internal/importer/Ci.scala @@ -105,6 +105,7 @@ object Ci { enableScalaJsDefined = Selection.All, flavour = flavour, ignored = Libraries.ignored.map(_.value), + explicitlyIncluded = None, stdLibs = SortedSet("esnext.full"), expandTypeMappings = EnabledTypeMappingExpansion.DefaultSelection, versions = Versions( @@ -264,6 +265,7 @@ class Ci(config: Ci.Config, paths: Ci.Paths, pool: ForkJoinPool, ec: ExecutionCo resolve = bootstrapped.libraryResolver, ignored = config.conversion.ignoredLibs, ignoredModulePrefixes = config.conversion.ignoredModulePrefixes, + explicitlyIncluded = config.conversion.explicitlyIncludedLibs, pedantic = config.pedantic, parser = PersistingParser(paths.parseCache, IArray(externalsFolder, dtFolder), logger.void), expandTypeMappings = config.conversion.expandTypeMappings, diff --git a/importer/src/test/scala/org/scalablytyped/converter/internal/importer/ImporterHarness.scala b/importer/src/test/scala/org/scalablytyped/converter/internal/importer/ImporterHarness.scala index 7628fae22d..9dcb66bb75 100644 --- a/importer/src/test/scala/org/scalablytyped/converter/internal/importer/ImporterHarness.scala +++ b/importer/src/test/scala/org/scalablytyped/converter/internal/importer/ImporterHarness.scala @@ -87,6 +87,7 @@ trait ImporterHarness extends AnyFunSuite { calculateLibraryVersion = new DTVersions(DTLastChangedIndex.No, includeGitPart = false), ignored = ignored, ignoredModulePrefixes = Set.empty, + explicitlyIncluded = None, pedantic = pedantic, parser = parser.parseFile, expandTypeMappings = EnabledTypeMappingExpansion.DefaultSelection, diff --git a/sbt-converter/src/main/scala/org/scalablytyped/converter/internal/ImportTypings.scala b/sbt-converter/src/main/scala/org/scalablytyped/converter/internal/ImportTypings.scala index e6959eefc8..9757e1267f 100644 --- a/sbt-converter/src/main/scala/org/scalablytyped/converter/internal/ImportTypings.scala +++ b/sbt-converter/src/main/scala/org/scalablytyped/converter/internal/ImportTypings.scala @@ -83,6 +83,7 @@ object ImportTypings { calculateLibraryVersion = CalculateLibraryVersion.PackageJsonOnly, ignored = input.conversion.ignoredLibs, ignoredModulePrefixes = input.conversion.ignoredModulePrefixes, + explicitlyIncluded = input.conversion.explicitlyIncludedLibs, pedantic = false, parser = cachedParser, expandTypeMappings = input.conversion.expandTypeMappings, diff --git a/sbt-converter/src/main/scala/org/scalablytyped/converter/internal/ImportTypingsGenSources.scala b/sbt-converter/src/main/scala/org/scalablytyped/converter/internal/ImportTypingsGenSources.scala index 337e4c86d6..a84a4c2e93 100644 --- a/sbt-converter/src/main/scala/org/scalablytyped/converter/internal/ImportTypingsGenSources.scala +++ b/sbt-converter/src/main/scala/org/scalablytyped/converter/internal/ImportTypingsGenSources.scala @@ -69,6 +69,7 @@ object ImportTypingsGenSources { calculateLibraryVersion = CalculateLibraryVersion.PackageJsonOnly, ignored = input.conversion.ignoredLibs, ignoredModulePrefixes = input.conversion.ignoredModulePrefixes, + explicitlyIncluded = input.conversion.explicitlyIncludedLibs, pedantic = false, parser = cachedParser, expandTypeMappings = input.conversion.expandTypeMappings, @@ -182,6 +183,7 @@ object ImportTypingsGenSources { stdLibs = SortedSet("es5", "dom"), expandTypeMappings = EnabledTypeMappingExpansion.DefaultSelection, ignored = SortedSet(), + explicitlyIncluded = None, versions = Versions(Versions.Scala213, Versions.ScalaJs1), organization = "org.scalablytyped", enableReactTreeShaking = Selection.None, diff --git a/sbt-converter/src/main/scala/org/scalablytyped/converter/plugin/ScalablyTypedPluginBase.scala b/sbt-converter/src/main/scala/org/scalablytyped/converter/plugin/ScalablyTypedPluginBase.scala index 3af4c263b8..40372526c6 100644 --- a/sbt-converter/src/main/scala/org/scalablytyped/converter/plugin/ScalablyTypedPluginBase.scala +++ b/sbt-converter/src/main/scala/org/scalablytyped/converter/plugin/ScalablyTypedPluginBase.scala @@ -30,6 +30,7 @@ object ScalablyTypedPluginBase extends AutoPlugin { val stConversionOptions = settingKey[ConversionOptions]("All conversion options") val stDir = settingKey[File]("Directory used for caches, built artifacts and so on") val stIgnore = settingKey[List[String]]("completely ignore libraries or modules") + val stExplicitInclude = settingKey[Option[List[String]]]("explicitly select libraries or modules") val stFlavour = settingKey[Flavour]("The type of react binding to use") val stEnableScalaJsDefined = settingKey[Selection[String]]( "Whether to generate @ScalaJSDefined traits when possible", @@ -67,6 +68,7 @@ object ScalablyTypedPluginBase extends AutoPlugin { }, stFlavour := converter.Flavour.Normal, stIgnore := List("typescript"), + stExplicitInclude := None, stOutputPackage := Name.typings.unescaped, stStdlib := List("es6", "dom"), stTypescriptVersion := "4.3", @@ -97,6 +99,7 @@ object ScalablyTypedPluginBase extends AutoPlugin { stdLibs = SortedSet.empty ++ stStdlib.value, expandTypeMappings = stInternalExpandTypeMappings.value.map(TsIdentLibrary.apply), ignored = stIgnore.value.to[Set].sorted, + explicitlyIncluded = stExplicitInclude.value.map(_.to[Set].sorted), versions = versions, organization = organization, enableReactTreeShaking = stReactEnableTreeShaking.value.map(name => ImportName(TsIdentLibrary(name))),