<?xml version="1.0" encoding="UTF-8"?>
<!--
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                        http://maven.apache.org/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>org.apache.guacamole</groupId>
    <artifactId>guacamole-common-js</artifactId>
    <packaging>pom</packaging>
    <version>1.5.2</version>
    <name>guacamole-common-js</name>
    <url>http://guacamole.apache.org/</url>

    <parent>
        <groupId>org.apache.guacamole</groupId>
        <artifactId>guacamole-client</artifactId>
        <version>1.5.2</version>
        <relativePath>../</relativePath>
    </parent>

    <properties>

        <!--
        The location where temporary files should be stored for communicating
        between karma and firefox. The default location, /tmp, does not work
        if firefox is installed via snap.
        -->
        <firefox.temp.dir>${project.build.directory}/tmp</firefox.temp.dir>

        <!--
        Skip tests unless requested otherwise with -DskipTests=false.
        Skipped by default because these tests require firefox to be installed.
        -->
        <skipTests>true</skipTests>
        
    </properties>

    <description>
        The base JavaScript API of the Guacamole project, providing JavaScript
        support for the Guacamole stack, including a full client
        implementation for the Guacamole protocol.
    </description>

    <!-- All applicable licenses -->
    <licenses>
        <license>
            <name>Apache License, Version 2.0</name>
            <url>https://www.apache.org/licenses/LICENSE-2.0.txt</url>
            <distribution>repo</distribution>
        </license>
    </licenses>

    <!-- Git repository -->
    <scm>
        <url>https://github.com/apache/guacamole-client</url>
        <connection>scm:git:https://git.wip-us.apache.org/repos/asf/guacamole-client.git</connection>

    </scm>

    <build>
        <plugins>

            <!-- Assemble JS files into single .zip -->
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <appendAssemblyId>false</appendAssemblyId>
                    <descriptors>
                        <descriptor>static.xml</descriptor>
                    </descriptors>
                </configuration>
                <executions>
                    <execution>
                        <id>make-zip</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <!-- JS/CSS Minification Plugin -->
            <plugin>
                <groupId>com.github.buckelieg</groupId>
                <artifactId>minify-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>default-minify</id>
                        <configuration>

                            <charset>UTF-8</charset>
                            <jsEngine>CLOSURE</jsEngine>

                            <jsSourceDir>/</jsSourceDir>
                            <jsTargetDir>/</jsTargetDir>
                            <jsFinalFile>all.js</jsFinalFile>

                            <jsSourceFiles>
                                <jsSourceFile>common/license.js</jsSourceFile> 
                            </jsSourceFiles>

                            <jsSourceIncludes>
                                <jsSourceInclude>modules/**/*.js</jsSourceInclude>
                            </jsSourceIncludes>

                        </configuration>
                        <goals>
                            <goal>minify</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <!-- Skip tests if configured to do so -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>3.0.0</version>
                <configuration>
                    <skipTests>${skipTests}</skipTests>
                </configuration>
            </plugin>

            <!-- Ensure the firefox temp directory exists -->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-antrun-plugin</artifactId>
                <version>3.1.0</version>
                <executions>
                    <execution>
                        <id>createFirefoxTempdir</id>
                        <phase>test</phase>
                        <configuration>
                            <target>
                                <mkdir dir="${firefox.temp.dir}"/>
                            </target>
                        </configuration>
                        <goals>
                            <goal>run</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

            <!-- Unit test using Jasmin and Firefox -->
            <plugin>
                <groupId>com.github.eirslett</groupId>
                <artifactId>frontend-maven-plugin</artifactId>
                <version>1.12.1</version>
                
                <configuration>

                    <!-- The version of node to use for running tests -->
                    <nodeVersion>v16.19.1</nodeVersion>

                    <!-- Install dependencies with "npm ci" for repeatability -->
                    <arguments>ci</arguments>

                    <!-- The location of the karma config file -->
                    <karmaConfPath>karma-ci.conf.js</karmaConfPath>

                    <!-- Tell karma to use the custom temp directory -->
                    <environmentVariables>
                        <TMPDIR>${firefox.temp.dir}</TMPDIR>
                    </environmentVariables>
                    
                </configuration>

                <executions>

                    <!-- Install node.js and NPM before running tests -->
                    <execution>
                        <id>install node and npm</id>
                        <phase>test</phase>
                        <goals>
                            <goal>install-node-and-npm</goal>
                        </goals>
                    </execution>

                    <!-- Install test dependencies -->
                    <execution>
                        <id>npm install</id>
                        <phase>test</phase>
                        <goals>
                            <goal>npm</goal>
                        </goals>
                    </execution>

                    <!-- Run all tests non-interactively -->
                    <execution>
                        <id>run tests</id>
                        <phase>test</phase>
                        <goals>
                            <goal>karma</goal>
                        </goals>
                    </execution>
                    
                </executions>
                
            </plugin>

        </plugins>
    </build>

</project>
