All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.carrotgarden.maven.scalor.ScalaJsLinkMojo.scala Maven / Gradle / Ivy

package com.carrotgarden.maven.scalor

import java.io.File

import scala.collection.JavaConverters.asScalaSetConverter

import org.apache.maven.artifact.Artifact
import org.apache.maven.plugin.AbstractMojo
import org.apache.maven.plugins.annotations.Mojo
import org.apache.maven.plugins.annotations.Parameter
import org.apache.maven.plugins.annotations.LifecyclePhase
import org.apache.maven.plugins.annotations.ResolutionScope

import com.carrotgarden.maven.scalor.base.Context.UpdateResult
import com.carrotgarden.maven.scalor.scalajs.Linker
import com.carrotgarden.maven.tools.Description

/**
 * Shared linker mojo interface.
 * Generate Scala.js runtime.js JavaScript.
 */
trait ScalaJsLinkAnyMojo extends AbstractMojo
  with base.Mojo
  with base.Params
  with base.Logging
  with base.SkipMojo
  with base.Context
  with scalajs.Build
  with scalajs.Linker
  with scalajs.ParamsLinkAny {

  @Description( """
  Flag to skip this execution: scala-js-link-*.
  """ )
  @Parameter(
    property     = "scalor.skipLinker",
    defaultValue = "false"
  )
  var skipLinker : Boolean = _

  /**
   * Provide linker project build class path.
   */
  lazy val linkerClassPath : Array[ File ] = {
    buildDependencyFolders ++ projectClassPath( buildDependencyScopes )
  }

  /**
   * Discover Scala.js library on project class path.
   */
  lazy val libraryArtifactOption : Option[ Artifact ] = {
    util.Maven.locateArtifact( project, linkerLibraryRegex )
  }

  /**
   * Produce user reports.
   */
  def linkerReport( context : Linker.Context ) : Unit = {
    import context._
    if ( linkerLogRuntime ) {
      logger.info( s"Linker runtime: ${runtime}" )
    }
    if ( linkerLogOptions ) {
      logger.info( s"Linker options:\n${Linker.newConfig( options )}" )
    }
    if ( linkerLogClassPath ) {
      loggerReportFileList( "Linker classpath:", classpath )
    }
    if ( linkerLogUpdateResult ) {
      val report = if ( hasUpdate ) {
        updateList.filter( _.hasUpdate ).map( _.report ).mkString( "\n", "\n", "" )
      } else {
        "None"
      }
      logger.info( s"Linker update result: ${report}" )
    }
  }

  /**
   * Produce linker runtime.js.
   */
  def linkerInvoke(
    runtime :    File,
    options :    String,
    updateList : Array[ UpdateResult ]
  ) : Unit = {
    val linkerOptions = Linker.Options.parse( options )
    val context = Linker.Context(
      options          = linkerOptions,
      classpath        = linkerClassPath,
      runtime          = runtime,
      updateList       = updateList,
      initializerList  = linkerInitializerList,
      initializerRegex = linkerInitializerRegex,
      hasLogStats      = linkerLogBuildStats
    )
    linkerReport( context )
    linkerPerform( context )
  }

  /**
   * Generate runtime.js and runtime.min.js.
   */
  def performLinker( updateList : Array[ UpdateResult ] ) : Unit = {
    val hasBuild = linkerHasBuild( hasIncremental )
    if ( hasBuild ) {
      linkerInvoke( linkerRuntimeFile, linkerRuntimeOptions, updateList )
    }
    val hasBuildMin = linkerHasBuildMin( hasIncremental )
    if ( hasBuildMin ) {
      linkerInvoke( linkerRuntimeMinFile, linkerRuntimeMinOptions, updateList )
    }
  }

  def performInvocation() : Unit = {
    if ( linkerLibraryDetect && libraryArtifactOption.isEmpty ) {
      reportSkipReason( s"Skipping execution: Scala.js library missing: ${linkerLibraryRegex}." )
      return
    }
    val updateList = if ( hasIncremental ) {
      contextUpdateResult( buildDependencyFolders, linkerClassRegex.r )
    } else {
      Array.empty[ UpdateResult ]
    }
    if ( hasIncremental ) {
      logger.info( s"Incremental build request." )
      val hasUpdate = updateList.count( _.hasUpdate ) > 0
      if ( hasUpdate ) {
        performLinker( updateList )
      }
    } else {
      logger.info( s"Full linker build request." )
      performLinker( updateList )
    }
  }

  override def perform() : Unit = {
    if ( skipLinker || hasSkipMojo ) {
      reportSkipReason( "Skipping disabled goal execution." )
      return
    }
    performInvocation()
  }

}

@Description( """
Generate Scala.js runtime JavaScript for all scopes.
Invokes goals: scala-js-link-*.
""" )
@Mojo(
  name                         = A.mojo.`scala-js-link`,
  defaultPhase                 = LifecyclePhase.PROCESS_CLASSES,
  requiresDependencyResolution = ResolutionScope.TEST
)
class ScalaJsLinkArkonMojo extends ScalaJsLinkAnyMojo
  with scalajs.BuildMain
  with scalajs.BuildTest
  with scalajs.ParamsLinkMain
  with scalajs.ParamsLinkTest {

  override def mojoName = A.mojo.`scala-js-link`

  override def performInvocation() : Unit = {
    executeSelfMojo( A.mojo.`scala-js-link-main` )
    executeSelfMojo( A.mojo.`scala-js-link-test` )
  }

}

@Description( """
Generate Scala.js runtime JavaScript for scope=main.
Provides incremental linking in M2E.
A member of goal=scala-js-link.
""" )
@Mojo(
  name                         = A.mojo.`scala-js-link-main`,
  defaultPhase                 = LifecyclePhase.PROCESS_CLASSES,
  requiresDependencyResolution = ResolutionScope.COMPILE
)
class ScalaJsLinkMainMojo extends ScalaJsLinkAnyMojo
  with scalajs.BuildMain
  with scalajs.ParamsLinkMain {

  override def mojoName = A.mojo.`scala-js-link-main`

  @Description( """
  Flag to skip goal execution: scala-js-link-main.
  """ )
  @Parameter(
    property     = "scalor.skipLinkerMain",
    defaultValue = "false"
  )
  var skipLinkerMain : Boolean = _

  override def hasSkipMojo = skipLinkerMain

}

@Description( """
Generate Scala.js runtime JavaScript for scope=test.
Provides incremental linking in M2E.
A member of goal=scala-js-link.
""" )
@Mojo(
  name                         = A.mojo.`scala-js-link-test`,
  defaultPhase                 = LifecyclePhase.PROCESS_TEST_CLASSES,
  requiresDependencyResolution = ResolutionScope.TEST
)
class ScalaJsLinkTestMojo extends ScalaJsLinkAnyMojo
  with scalajs.BuildTest
  with scalajs.ParamsLinkTest {

  override def mojoName = A.mojo.`scala-js-link-test`

  @Description( """
  Flag to skip this goal execution: scala-js-link-test.
  """ )
  @Parameter(
    property     = "scalor.skipLinkerTest",
    defaultValue = "false"
  )
  var skipLinkerTest : Boolean = _

  override def hasSkipMojo = skipLinkerTest

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy