<!--
  ~ 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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.apache.streampipes</groupId>
        <artifactId>streampipes-parent</artifactId>
        <version>0.98.0-SNAPSHOT</version>
    </parent>

    <artifactId>streampipes-model-client</artifactId>
    <packaging>jar</packaging>

    <dependencies>
        <!-- StreamPipes dependencies -->
        <dependency>
            <groupId>org.apache.streampipes</groupId>
            <artifactId>streampipes-commons</artifactId>
            <version>0.98.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.apache.streampipes</groupId>
            <artifactId>streampipes-model-shared</artifactId>
            <version>0.98.0-SNAPSHOT</version>
        </dependency>

        <!-- External dependencies -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
        </dependency>
        <dependency>
            <groupId>com.google.code.gson</groupId>
            <artifactId>gson</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>cz.habarta.typescript-generator</groupId>
                <artifactId>typescript-generator-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <id>generate</id>
                        <goals>
                            <goal>generate</goal>
                        </goals>
                        <phase>process-classes</phase>
                    </execution>
                </executions>
                <configuration>
                    <jsonLibrary>jackson2</jsonLibrary>
                    <classesWithAnnotations>
                        <annotation>org.apache.streampipes.model.shared.annotation.TsModel</annotation>
                    </classesWithAnnotations>
                    <excludePropertyAnnotations>
                        <annotation>org.apache.streampipes.model.shared.annotation.TsIgnore</annotation>
                    </excludePropertyAnnotations>
                    <excludeClasses>
                        <class>io.fogsy.empire.core.empire.SupportsRdfId</class>
                        <class>java.io.Serializable</class>
                    </excludeClasses>
                    <outputKind>module</outputKind>
                    <outputFileType>implementationFile</outputFileType>
                    <outputKind>module</outputKind>
                    <disableTaggedUnions>false</disableTaggedUnions>
                    <mapClasses>asClasses</mapClasses>
                    <sortDeclarations>true</sortDeclarations>
                    <tsNoCheck>true</tsNoCheck>
                    <importDeclarations>
                        <import>import { Storable } from '@streampipes/platform-services'</import>
                    </importDeclarations>
                    <extensions>
                        <extension>cz.habarta.typescript.generator.ext.JsonDeserializationExtension</extension>
                    </extensions>
                </configuration>
            </plugin>

            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-checkstyle-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
