/*
 * 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.
 */

plugins {
    id 'ofbiz-node-conventions'
}

dependencies {
    pluginLibsCompile 'org.apache.tomcat.embed:tomcat-embed-websocket:9.0.74'
}

node {
    nodeProjectDir = file("vite-react-app")
}

task buildReactApp (type: NpmTask) {
    inputs.files(fileTree('vite-react-app'))

    outputs.dir('webapp/example/vite-react-app')

    dependsOn npmInstall
    args = ['run', 'build', '--', '--emptyOutDir']
}

// Build the react app when the classes task is run.
project.rootProject.tasks.getByName('classes').dependsOn buildReactApp

// Hook into the root project's clean task to clean up the output from the
// buildReactApp task.
project.rootProject.tasks.clean.dependsOn cleanBuildReactApp
