Compare commits
18 Commits
528d7af031
...
v0.0.1-alp
| Author | SHA1 | Date | |
|---|---|---|---|
| cc51807819 | |||
| 8e039037a9 | |||
| ed40f4c77e | |||
| ccddef8ba8 | |||
| 05e31f4b9e | |||
| d2578b8850 | |||
| 392a9ef407 | |||
| 2d2337257f | |||
| 5a95bf3ef0 | |||
| 7e9401d8bb | |||
| 0c4465c91a | |||
| 5f9d49561a | |||
| 253d998b68 | |||
| 9acfd1ccd0 | |||
| 39d23f4a8a | |||
| f41a1b3363 | |||
| 1e649d1f23 | |||
| 5cc1fbe919 |
21
.env-example
21
.env-example
@@ -1,11 +1,18 @@
|
|||||||
|
# uncomment this out to run in productions
|
||||||
|
# APP_ENV=production
|
||||||
|
|
||||||
|
# lstv2 loc
|
||||||
|
LSTV2="C\drive\loc"
|
||||||
|
|
||||||
|
# dev stuff below
|
||||||
|
|
||||||
# Gitea Info
|
# Gitea Info
|
||||||
GITEA_URL=git.tuffraid.net
|
GITEA_URL=git repo
|
||||||
GITEA_USERNAME=cowch
|
GITEA_USERNAME=username
|
||||||
GITEA_REPO=logistics_support_tool
|
GITEA_REPO=logistics_support_tool
|
||||||
GITEA_TOKEN=ad8eac91a01e3a1885a1dc10
|
GITEA_TOKEN=ad8eac91a01e3a1885a1dc10
|
||||||
|
|
||||||
# Build number info
|
# dev locs
|
||||||
BUILD_NAME=rushjnnhj7212n
|
DEV_FOLDER=C\drive\loc
|
||||||
|
ADMUSER=username
|
||||||
# lstv2 loc
|
ADMPASSWORD=password
|
||||||
LSTV2=C\drive\loc
|
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@@ -9,6 +9,7 @@ LstWrapper/publish
|
|||||||
LstWrapper/obj
|
LstWrapper/obj
|
||||||
scripts/tmp
|
scripts/tmp
|
||||||
backend/docs
|
backend/docs
|
||||||
|
backend/frontend
|
||||||
|
|
||||||
# ---> Go
|
# ---> Go
|
||||||
# If you prefer the allow list template instead of the deny list, see community template:
|
# If you prefer the allow list template instead of the deny list, see community template:
|
||||||
|
|||||||
55
CHANGELOG.md
55
CHANGELOG.md
@@ -3,6 +3,61 @@
|
|||||||
All notable changes to LST will be documented in this file.
|
All notable changes to LST will be documented in this file.
|
||||||
|
|
||||||
|
|
||||||
|
## [0.0.1-alpha.5](https://git.tuffraid.net/cowch/logistics_support_tool/compare/v0.0.1-alpha.4...v0.0.1-alpha.5) (2025-07-21)
|
||||||
|
|
||||||
|
### 🌟 Enhancements
|
||||||
|
|
||||||
|
* **backend:** env added ([67b5976](https://git.tuffraid.net/cowch/logistics_support_tool/commit/67b59761769350951bc6b52ef715b592b5d4a862))
|
||||||
|
* **backend:** set the static path to the docs ([5a9636c](https://git.tuffraid.net/cowch/logistics_support_tool/commit/5a9636cdc15f164ed3547f544e34858683b38241))
|
||||||
|
* **docs:** added in the new docs to build alongside the backend ([3fdcc11](https://git.tuffraid.net/cowch/logistics_support_tool/commit/3fdcc110e3b4d7356af1fb025070bdf7413a8e88))
|
||||||
|
* **env-example:** added in an example env ([a23b6a6](https://git.tuffraid.net/cowch/logistics_support_tool/commit/a23b6a6e9eef4dbeb2f84c325ca8dca178ab3ff3))
|
||||||
|
* **env:** new env introduced to handle dev and prodution ([f41a1b3](https://git.tuffraid.net/cowch/logistics_support_tool/commit/f41a1b336389d6100e42681f53d9f618c8726f25))
|
||||||
|
* **services:** just a 1 to 1 from lstv2 ([8e03903](https://git.tuffraid.net/cowch/logistics_support_tool/commit/8e039037a9b40994b9e77f59680a3ce1b6ebc3a0))
|
||||||
|
* **update server:** new update server added with iis stop and old version included ([05e31f4](https://git.tuffraid.net/cowch/logistics_support_tool/commit/05e31f4b9e20799257da244b237420fa2b6435f8))
|
||||||
|
|
||||||
|
### 🐛 Bug fixes
|
||||||
|
|
||||||
|
* **backend:** ignored docs this should be built before running by the user ([fdf14b0](https://git.tuffraid.net/cowch/logistics_support_tool/commit/fdf14b06c88d3057f31184e03fb592bd9a959847))
|
||||||
|
* **builds:** added in the gets/installs for our go project and node portons ([528d7af](https://git.tuffraid.net/cowch/logistics_support_tool/commit/528d7af0312cb3de43ddc93d8af22bde6aadea52))
|
||||||
|
* **docs:** added a copy script to cp the build to the backend with ps1 ([0fb2ec5](https://git.tuffraid.net/cowch/logistics_support_tool/commit/0fb2ec52739def8294a57bbc6c497ba6531568a6))
|
||||||
|
|
||||||
|
### 📚 Documentation
|
||||||
|
|
||||||
|
* **env:** changes to have more clear info on the example doc ([5f9d495](https://git.tuffraid.net/cowch/logistics_support_tool/commit/5f9d49561a7c22a4d2cb85bd06bbbdb9fa952224))
|
||||||
|
* **iiscontrol:** added in an example how to run i t ([ccddef8](https://git.tuffraid.net/cowch/logistics_support_tool/commit/ccddef8ba8f64774db6d99fba3ea7c7c54bea1a5))
|
||||||
|
|
||||||
|
### 🛠️ Code Refactor
|
||||||
|
|
||||||
|
* **backend:** changes to convert the backend to strictly the app ([1e649d1](https://git.tuffraid.net/cowch/logistics_support_tool/commit/1e649d1f23c404252754d746254810386bb0f233))
|
||||||
|
* **build:** changes to remove the build name as it was not really realvent ([392a9ef](https://git.tuffraid.net/cowch/logistics_support_tool/commit/392a9ef407d4e64f573cbfc9109c8a81f55c14d5))
|
||||||
|
* **config:** changes to autoformat go files ([4ef2d90](https://git.tuffraid.net/cowch/logistics_support_tool/commit/4ef2d90aa8595d5e3d18a289c012320bdf0dcc4a))
|
||||||
|
* **createzip:** added in verbage to be clear what was done at the end ([452bdbe](https://git.tuffraid.net/cowch/logistics_support_tool/commit/452bdbedb48cde7fa0ef246fb61e304127c49e58))
|
||||||
|
* **createzip:** changes to the way the app looks for better understanding ([d2578b8](https://git.tuffraid.net/cowch/logistics_support_tool/commit/d2578b885029ca98b750f4c6996e567053b2e517))
|
||||||
|
* **createzip:** renamed the backend to app now that everything is in one ([0c4465c](https://git.tuffraid.net/cowch/logistics_support_tool/commit/0c4465c91a40cbea73048617952df26b476d01f4))
|
||||||
|
* **docker:** removed frontend from being built ([9acfd1c](https://git.tuffraid.net/cowch/logistics_support_tool/commit/9acfd1ccd0b9019d5acc01153ddad15b82b6c74e))
|
||||||
|
* **env-example:** changes to the env example to include the dev stuff ([2d23372](https://git.tuffraid.net/cowch/logistics_support_tool/commit/2d2337257f2b31c740f9eb7064be010528e14c7c))
|
||||||
|
* **frontend:** changes to no longer use server side and only static files ([39d23f4](https://git.tuffraid.net/cowch/logistics_support_tool/commit/39d23f4a8a8af6b1acb87b913e5cd1929fe144e4))
|
||||||
|
* **lstv2build:** changes to not always build the old app if we dont need too ([ed40f4c](https://git.tuffraid.net/cowch/logistics_support_tool/commit/ed40f4c77e9d81e36292f38c342e9c2b062f84b9))
|
||||||
|
* **lstv2:** moved the loc to .env file ([7539b16](https://git.tuffraid.net/cowch/logistics_support_tool/commit/7539b1653d7a48dbe248847ed321ab065e58efa0))
|
||||||
|
* **wrapper:** changes to handle docs and frontned now ([253d998](https://git.tuffraid.net/cowch/logistics_support_tool/commit/253d998b68b5808d6fd2d9731255616238fcdb71))
|
||||||
|
|
||||||
|
### 🚀 Performance
|
||||||
|
|
||||||
|
* **docs:** changes to stop the server from opening a browser when it started up ([f0bcea0](https://git.tuffraid.net/cowch/logistics_support_tool/commit/f0bcea0405db364e1e15471b5db74fc9d8f93788))
|
||||||
|
|
||||||
|
### 📝 Testing Code
|
||||||
|
|
||||||
|
* **app:** added production into the build so we dont fill logs up ([7e9401d](https://git.tuffraid.net/cowch/logistics_support_tool/commit/7e9401d8bb12589de6ce1517e4502d784788ab0f))
|
||||||
|
* **docker:** changes to make all latest now instead of 2 apps ([5a95bf3](https://git.tuffraid.net/cowch/logistics_support_tool/commit/5a95bf3ef0f4d4b125f8e777d57cc96b3d3a894d))
|
||||||
|
|
||||||
|
### 📈 Project changes
|
||||||
|
|
||||||
|
* **wrapper:** changes to clean the publish folder ([5cc1fbe](https://git.tuffraid.net/cowch/logistics_support_tool/commit/5cc1fbe919a8c3fa46617f7b9ed2830559b8978f))
|
||||||
|
|
||||||
|
### 📈 Project Builds
|
||||||
|
|
||||||
|
* **docs:** added building the docs into the build script ([6072afc](https://git.tuffraid.net/cowch/logistics_support_tool/commit/6072afc8c01a4fe4980e0e17cfe41d5a9cd524ef))
|
||||||
|
|
||||||
## [0.0.1-alpha.4](https://git.tuffraid.net/cowch/logistics_support_tool/compare/v0.0.1-alpha.3...v0.0.1-alpha.4) (2025-07-16)
|
## [0.0.1-alpha.4](https://git.tuffraid.net/cowch/logistics_support_tool/compare/v0.0.1-alpha.3...v0.0.1-alpha.4) (2025-07-16)
|
||||||
|
|
||||||
### 📈 Project changes
|
### 📈 Project changes
|
||||||
|
|||||||
@@ -1,85 +1,65 @@
|
|||||||
using Microsoft.AspNetCore.Builder;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
|
||||||
using Microsoft.Extensions.DependencyInjection;
|
|
||||||
using System.Net.Http;
|
|
||||||
|
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
// to build the binary dotnet publish -c Release -o ./publish
|
|
||||||
// Go backend
|
|
||||||
builder.Services.AddHttpClient("GoBackend", client =>
|
|
||||||
{
|
|
||||||
client.BaseAddress = new Uri("http://localhost:8080");
|
|
||||||
client.Timeout = TimeSpan.FromSeconds(30);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Node frontend
|
// Configure clients
|
||||||
builder.Services.AddHttpClient("NodeFrontend", client =>
|
builder.Services.AddHttpClient("GoBackend", client => {
|
||||||
{
|
client.BaseAddress = new Uri("http://localhost:8080");
|
||||||
client.BaseAddress = new Uri("http://localhost:3000");
|
|
||||||
client.Timeout = TimeSpan.FromSeconds(30);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
|
|
||||||
app.UseStaticFiles();
|
// Handle trailing slash redirects
|
||||||
|
app.Use(async (context, next) => {
|
||||||
|
if (context.Request.Path.Equals("/lst", StringComparison.OrdinalIgnoreCase)) {
|
||||||
|
context.Response.Redirect("/lst/", permanent: true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
await next();
|
||||||
|
});
|
||||||
|
|
||||||
app.Use((Func<HttpContext, Func<Task>, Task>)(async (context, next) =>
|
// Proxy all requests to Go backend
|
||||||
{
|
app.Use(async (context, next) => {
|
||||||
var clientFactory = context.RequestServices.GetRequiredService<IHttpClientFactory>();
|
// Skip special paths
|
||||||
|
if (context.Request.Path.StartsWithSegments("/.well-known")) {
|
||||||
var isApiRequest =
|
await next();
|
||||||
context.Request.Path.StartsWithSegments("/api") ||
|
return;
|
||||||
context.Request.Path.StartsWithSegments("/graphql") ||
|
}
|
||||||
context.Request.Path.StartsWithSegments("/auth") ||
|
|
||||||
!context.Request.Method.Equals("GET", StringComparison.OrdinalIgnoreCase);
|
|
||||||
|
|
||||||
var client = clientFactory.CreateClient(isApiRequest ? "GoBackend" : "NodeFrontend");
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
var requestUri = context.Request.Path + context.Request.QueryString;
|
|
||||||
|
|
||||||
|
var client = context.RequestServices.GetRequiredService<IHttpClientFactory>()
|
||||||
|
.CreateClient("GoBackend");
|
||||||
|
|
||||||
|
try {
|
||||||
var request = new HttpRequestMessage(
|
var request = new HttpRequestMessage(
|
||||||
new HttpMethod(context.Request.Method),
|
new HttpMethod(context.Request.Method),
|
||||||
requestUri);
|
context.Request.Path + context.Request.QueryString);
|
||||||
|
|
||||||
foreach (var header in context.Request.Headers)
|
// Copy headers
|
||||||
{
|
foreach (var header in context.Request.Headers) {
|
||||||
if (!request.Headers.TryAddWithoutValidation(header.Key, header.Value.ToArray()))
|
if (!request.Headers.TryAddWithoutValidation(header.Key, header.Value.ToArray())) {
|
||||||
{
|
|
||||||
request.Content ??= new StreamContent(context.Request.Body);
|
request.Content ??= new StreamContent(context.Request.Body);
|
||||||
request.Content.Headers.TryAddWithoutValidation(header.Key, header.Value.ToArray());
|
request.Content.Headers.TryAddWithoutValidation(header.Key, header.Value.ToArray());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (context.Request.ContentLength > 0 || context.Request.Headers.ContainsKey("Transfer-Encoding"))
|
if (context.Request.ContentLength > 0) {
|
||||||
{
|
|
||||||
request.Content = new StreamContent(context.Request.Body);
|
request.Content = new StreamContent(context.Request.Body);
|
||||||
}
|
}
|
||||||
|
|
||||||
var response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, context.RequestAborted);
|
var response = await client.SendAsync(request);
|
||||||
|
|
||||||
context.Response.StatusCode = (int)response.StatusCode;
|
context.Response.StatusCode = (int)response.StatusCode;
|
||||||
|
|
||||||
foreach (var header in response.Headers)
|
foreach (var header in response.Headers) {
|
||||||
{
|
|
||||||
context.Response.Headers[header.Key] = header.Value.ToArray();
|
context.Response.Headers[header.Key] = header.Value.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var header in response.Content.Headers)
|
if (response.Content.Headers.ContentType != null) {
|
||||||
{
|
context.Response.ContentType = response.Content.Headers.ContentType.ToString();
|
||||||
context.Response.Headers[header.Key] = header.Value.ToArray();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
context.Response.Headers.Remove("transfer-encoding");
|
|
||||||
|
|
||||||
await response.Content.CopyToAsync(context.Response.Body);
|
await response.Content.CopyToAsync(context.Response.Body);
|
||||||
}
|
}
|
||||||
catch (HttpRequestException ex)
|
catch (HttpRequestException) {
|
||||||
{
|
context.Response.StatusCode = 502;
|
||||||
context.Response.StatusCode = isApiRequest ? 503 : 502;
|
|
||||||
await context.Response.WriteAsync($"{(isApiRequest ? "Go API" : "Frontend")} unavailable: {ex.Message}");
|
|
||||||
}
|
}
|
||||||
}));
|
});
|
||||||
|
|
||||||
app.Run();
|
app.Run();
|
||||||
@@ -1,15 +1,46 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<configuration>
|
<configuration>
|
||||||
<location path="." inheritInChildApplications="false">
|
<system.webServer>
|
||||||
<system.webServer>
|
<rewrite>
|
||||||
<handlers>
|
<rules>
|
||||||
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
|
<!-- Redirect root to /lst/ -->
|
||||||
</handlers>
|
<rule name="Root Redirect" stopProcessing="true">
|
||||||
<aspNetCore processPath="dotnet"
|
<match url="^$" />
|
||||||
arguments=".\LstWrapper.dll"
|
<action type="Redirect" url="/lst/" redirectType="Permanent" />
|
||||||
stdoutLogEnabled="true"
|
</rule>
|
||||||
stdoutLogFile=".\logs\stdout"
|
|
||||||
hostingModel="inprocess" />
|
<!-- Proxy static assets -->
|
||||||
</system.webServer>
|
<rule name="Static Assets" stopProcessing="true">
|
||||||
</location>
|
<match url="^lst/assets/(.*)" />
|
||||||
|
<action type="Rewrite" url="http://localhost:8080/lst/assets/{R:1}" />
|
||||||
|
</rule>
|
||||||
|
|
||||||
|
<!-- Proxy API requests -->
|
||||||
|
<rule name="API Routes" stopProcessing="true">
|
||||||
|
<match url="^lst/api/(.*)" />
|
||||||
|
<action type="Rewrite" url="http://localhost:8080/lst/api/{R:1}" />
|
||||||
|
</rule>
|
||||||
|
|
||||||
|
<!-- Proxy all other requests -->
|
||||||
|
<rule name="Frontend Routes" stopProcessing="true">
|
||||||
|
<match url="^lst/(.*)" />
|
||||||
|
<action type="Rewrite" url="http://localhost:8080/lst/{R:1}" />
|
||||||
|
</rule>
|
||||||
|
</rules>
|
||||||
|
</rewrite>
|
||||||
|
|
||||||
|
<staticContent>
|
||||||
|
<clear />
|
||||||
|
<mimeMap fileExtension=".js" mimeType="application/javascript" />
|
||||||
|
<mimeMap fileExtension=".mjs" mimeType="application/javascript" />
|
||||||
|
<mimeMap fileExtension=".css" mimeType="text/css" />
|
||||||
|
<mimeMap fileExtension=".svg" mimeType="image/svg+xml" />
|
||||||
|
</staticContent>
|
||||||
|
|
||||||
|
<handlers>
|
||||||
|
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
|
||||||
|
</handlers>
|
||||||
|
|
||||||
|
<aspNetCore processPath="dotnet" arguments=".\LstWrapper.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
|
||||||
|
</system.webServer>
|
||||||
</configuration>
|
</configuration>
|
||||||
2
backend/.dockerignore
Normal file
2
backend/.dockerignore
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
lst_backend.exe
|
||||||
|
lst.net.exe
|
||||||
@@ -3,19 +3,25 @@ FROM golang:1.24.4-alpine3.22 AS builder
|
|||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
COPY go.mod go.sum ./
|
COPY go.mod go.sum ./
|
||||||
# COPY VERSION ./VERSION
|
COPY docs /app/docs/
|
||||||
|
COPY frontend /app/frontend/
|
||||||
|
|
||||||
RUN go mod download
|
RUN go mod download
|
||||||
|
|
||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
RUN CGO_ENABLED=0 GOOS=linux go build -o lst_go ./main.go
|
RUN CGO_ENABLED=0 GOOS=linux go build -o lst_go ./main.go
|
||||||
|
|
||||||
FROM alpine:latest
|
FROM alpine:latest
|
||||||
|
|
||||||
WORKDIR /root/
|
WORKDIR /root/
|
||||||
|
|
||||||
|
# Copy only the binary (no need for source files)
|
||||||
|
RUN mkdir -p ./docs ./frontend
|
||||||
|
|
||||||
COPY --from=builder /app/lst_go .
|
COPY --from=builder /app/lst_go .
|
||||||
# COPY --from=builder /app/VERSION ./
|
COPY --from=builder /app/docs ./docs/
|
||||||
|
COPY --from=builder /app/frontend ./frontend/
|
||||||
|
|
||||||
# create the volume paths
|
# create the volume paths
|
||||||
RUN mkdir -p /data
|
RUN mkdir -p /data
|
||||||
|
|||||||
@@ -4,39 +4,94 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"os"
|
||||||
|
|
||||||
"github.com/gin-gonic/gin"
|
"github.com/gin-gonic/gin"
|
||||||
"github.com/joho/godotenv"
|
"github.com/joho/godotenv"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
// Load .env only in dev (not Docker/production)
|
||||||
err := godotenv.Load("../.env")
|
if os.Getenv("RUNNING_IN_DOCKER") != "true" {
|
||||||
if err != nil {
|
err := godotenv.Load("../.env")
|
||||||
log.Fatal("Error loading .env file")
|
if err != nil {
|
||||||
|
log.Println("Warning: .env file not found (ok in Docker/production)")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// name := os.Getenv("LSTV2")
|
// Set basePath dynamically
|
||||||
|
basePath := "/"
|
||||||
|
|
||||||
|
if os.Getenv("APP_ENV") != "production" {
|
||||||
|
basePath = "/lst" // Dev only
|
||||||
|
}
|
||||||
|
|
||||||
// fmt.Println(name)
|
// fmt.Println(name)
|
||||||
fmt.Println("Welcome to lst backend where all the fun happens.")
|
fmt.Println("Welcome to lst backend where all the fun happens.")
|
||||||
r := gin.Default()
|
r := gin.Default()
|
||||||
|
|
||||||
// Serve Docusaurus static files
|
if os.Getenv("APP_ENV") == "production" {
|
||||||
r.StaticFS("/lst/docs", http.Dir("docs"))
|
gin.SetMode(gin.ReleaseMode)
|
||||||
|
}
|
||||||
|
|
||||||
r.GET("/api/ping", func(c *gin.Context) {
|
// // --- Add Redirects Here ---
|
||||||
|
// // Redirect root ("/") to "/app" or "/lst/app"
|
||||||
|
// r.GET("/", func(c *gin.Context) {
|
||||||
|
// c.Redirect(http.StatusMovedPermanently, basePath+"/app")
|
||||||
|
// })
|
||||||
|
|
||||||
|
// // Redirect "/lst" (if applicable) to "/lst/app"
|
||||||
|
// if basePath == "/lst" {
|
||||||
|
// r.GET("/lst", func(c *gin.Context) {
|
||||||
|
// c.Redirect(http.StatusMovedPermanently, basePath+"/app")
|
||||||
|
// })
|
||||||
|
// }
|
||||||
|
|
||||||
|
// Serve Docusaurus static files
|
||||||
|
r.StaticFS(basePath+"/docs", http.Dir("docs"))
|
||||||
|
r.StaticFS(basePath+"/app", http.Dir("frontend"))
|
||||||
|
|
||||||
|
r.GET(basePath+"/api/ping", func(c *gin.Context) {
|
||||||
c.JSON(200, gin.H{"message": "pong"})
|
c.JSON(200, gin.H{"message": "pong"})
|
||||||
})
|
})
|
||||||
|
|
||||||
r.Any("/api", errorApiLoc)
|
r.Any(basePath+"/api", errorApiLoc)
|
||||||
r.Any("/", errorLoc)
|
|
||||||
|
// // Serve static assets for Vite app
|
||||||
|
// r.Static("/lst/app/assets", "./dist/app/assets")
|
||||||
|
|
||||||
|
// // Catch-all for Vite app routes
|
||||||
|
// r.NoRoute(func(c *gin.Context) {
|
||||||
|
// path := c.Request.URL.Path
|
||||||
|
|
||||||
|
// // Don't handle API, assets, or docs
|
||||||
|
// if strings.HasPrefix(path, "/lst/api") ||
|
||||||
|
// strings.HasPrefix(path, "/lst/app/assets") ||
|
||||||
|
// strings.HasPrefix(path, "/lst/docs") {
|
||||||
|
// c.JSON(404, gin.H{"error": "Not found"})
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
|
||||||
|
// // Serve index.html for all /lst/app routes
|
||||||
|
// if strings.HasPrefix(path, "/lst/app") {
|
||||||
|
// c.File("./dist/app/index.html")
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
|
||||||
|
// c.JSON(404, gin.H{"error": "Not found"})
|
||||||
|
// })
|
||||||
r.Run(":8080")
|
r.Run(":8080")
|
||||||
}
|
}
|
||||||
|
|
||||||
func errorLoc(c *gin.Context) {
|
// func serveViteApp(c *gin.Context) {
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"message": "welcome to lst system you might have just encountered an incorrect area of the app"})
|
// // Set proper Content-Type for HTML
|
||||||
}
|
// c.Header("Content-Type", "text/html")
|
||||||
|
// c.File("./dist/index.html")
|
||||||
|
// }
|
||||||
|
|
||||||
|
// func errorLoc(c *gin.Context) {
|
||||||
|
// c.JSON(http.StatusBadRequest, gin.H{"message": "welcome to lst system you might have just encountered an incorrect area of the app"})
|
||||||
|
// }
|
||||||
func errorApiLoc(c *gin.Context) {
|
func errorApiLoc(c *gin.Context) {
|
||||||
c.JSON(http.StatusBadRequest, gin.H{"message": "looks like you have encountered an api route that dose not exist"})
|
c.JSON(http.StatusBadRequest, gin.H{"message": "looks like you have encountered an api route that dose not exist"})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,27 +1,15 @@
|
|||||||
---
|
---
|
||||||
services:
|
services:
|
||||||
lst_backend:
|
lst_backend:
|
||||||
# build: . # Tell Docker Compose to build the image using the Dockerfile in the current directory
|
|
||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
dockerfile: ./backend/Dockerfile
|
dockerfile: ./backend/Dockerfile
|
||||||
image: git.tuffraid.net/cowch/logistics_support_tool:backend-latest
|
no_cache: true
|
||||||
container_name: lst_backend # A friendly name for your running container
|
image: git.tuffraid.net/cowch/logistics_support_tool:latest
|
||||||
|
container_name: lst_backend
|
||||||
volumes:
|
volumes:
|
||||||
- /path/to/backend/data:/data
|
- /path/to/backend/data:/data
|
||||||
ports:
|
ports:
|
||||||
- "8080:8080"
|
- "8080:8080"
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
|
pull_policy: never
|
||||||
lst_frontend:
|
|
||||||
# build: . # Tell Docker Compose to build the image using the Dockerfile in the current directory
|
|
||||||
build:
|
|
||||||
context: .
|
|
||||||
dockerfile: ./frontend/Dockerfile
|
|
||||||
image: git.tuffraid.net/cowch/logistics_support_tool:frontend-latest
|
|
||||||
container_name: lst_frontend # A friendly name for your running container
|
|
||||||
volumes:
|
|
||||||
- /path/to/frontend/data:/data
|
|
||||||
ports:
|
|
||||||
- "3120:3000"
|
|
||||||
restart: unless-stopped
|
|
||||||
|
|||||||
24
frontend/.gitignore
vendored
Normal file
24
frontend/.gitignore
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Logs
|
||||||
|
logs
|
||||||
|
*.log
|
||||||
|
npm-debug.log*
|
||||||
|
yarn-debug.log*
|
||||||
|
yarn-error.log*
|
||||||
|
pnpm-debug.log*
|
||||||
|
lerna-debug.log*
|
||||||
|
|
||||||
|
node_modules
|
||||||
|
dist
|
||||||
|
dist-ssr
|
||||||
|
*.local
|
||||||
|
|
||||||
|
# Editor directories and files
|
||||||
|
.vscode/*
|
||||||
|
!.vscode/extensions.json
|
||||||
|
.idea
|
||||||
|
.DS_Store
|
||||||
|
*.suo
|
||||||
|
*.ntvs*
|
||||||
|
*.njsproj
|
||||||
|
*.sln
|
||||||
|
*.sw?
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
# Build Stage
|
|
||||||
FROM node:24-alpine AS deps
|
|
||||||
|
|
||||||
WORKDIR /app
|
|
||||||
COPY package*.json ./
|
|
||||||
RUN npm install
|
|
||||||
|
|
||||||
# Build the Next.js app
|
|
||||||
FROM node:24-alpine AS builder
|
|
||||||
WORKDIR /app
|
|
||||||
COPY . ./
|
|
||||||
COPY --from=deps /app/node_modules ./node_modules
|
|
||||||
# Run other commands like prisma or drizzle
|
|
||||||
RUN npm run build
|
|
||||||
|
|
||||||
# if more commands are needed after here do the same
|
|
||||||
|
|
||||||
# Final stage
|
|
||||||
FROM node:24-alpine
|
|
||||||
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
COPY --from=builder /app/.nitro /app/.nitro
|
|
||||||
COPY --from=builder /app/.output /app/.output
|
|
||||||
COPY --from=builder /app/.tanstack /app/.tanstack
|
|
||||||
|
|
||||||
EXPOSE 3000
|
|
||||||
|
|
||||||
CMD ["node", ".output/server/index.mjs"]
|
|
||||||
69
frontend/README.md
Normal file
69
frontend/README.md
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
# React + TypeScript + Vite
|
||||||
|
|
||||||
|
This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules.
|
||||||
|
|
||||||
|
Currently, two official plugins are available:
|
||||||
|
|
||||||
|
- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh
|
||||||
|
- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh
|
||||||
|
|
||||||
|
## Expanding the ESLint configuration
|
||||||
|
|
||||||
|
If you are developing a production application, we recommend updating the configuration to enable type-aware lint rules:
|
||||||
|
|
||||||
|
```js
|
||||||
|
export default tseslint.config([
|
||||||
|
globalIgnores(['dist']),
|
||||||
|
{
|
||||||
|
files: ['**/*.{ts,tsx}'],
|
||||||
|
extends: [
|
||||||
|
// Other configs...
|
||||||
|
|
||||||
|
// Remove tseslint.configs.recommended and replace with this
|
||||||
|
...tseslint.configs.recommendedTypeChecked,
|
||||||
|
// Alternatively, use this for stricter rules
|
||||||
|
...tseslint.configs.strictTypeChecked,
|
||||||
|
// Optionally, add this for stylistic rules
|
||||||
|
...tseslint.configs.stylisticTypeChecked,
|
||||||
|
|
||||||
|
// Other configs...
|
||||||
|
],
|
||||||
|
languageOptions: {
|
||||||
|
parserOptions: {
|
||||||
|
project: ['./tsconfig.node.json', './tsconfig.app.json'],
|
||||||
|
tsconfigRootDir: import.meta.dirname,
|
||||||
|
},
|
||||||
|
// other options...
|
||||||
|
},
|
||||||
|
},
|
||||||
|
])
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also install [eslint-plugin-react-x](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-x) and [eslint-plugin-react-dom](https://github.com/Rel1cx/eslint-react/tree/main/packages/plugins/eslint-plugin-react-dom) for React-specific lint rules:
|
||||||
|
|
||||||
|
```js
|
||||||
|
// eslint.config.js
|
||||||
|
import reactX from 'eslint-plugin-react-x'
|
||||||
|
import reactDom from 'eslint-plugin-react-dom'
|
||||||
|
|
||||||
|
export default tseslint.config([
|
||||||
|
globalIgnores(['dist']),
|
||||||
|
{
|
||||||
|
files: ['**/*.{ts,tsx}'],
|
||||||
|
extends: [
|
||||||
|
// Other configs...
|
||||||
|
// Enable lint rules for React
|
||||||
|
reactX.configs['recommended-typescript'],
|
||||||
|
// Enable lint rules for React DOM
|
||||||
|
reactDom.configs.recommended,
|
||||||
|
],
|
||||||
|
languageOptions: {
|
||||||
|
parserOptions: {
|
||||||
|
project: ['./tsconfig.node.json', './tsconfig.app.json'],
|
||||||
|
tsconfigRootDir: import.meta.dirname,
|
||||||
|
},
|
||||||
|
// other options...
|
||||||
|
},
|
||||||
|
},
|
||||||
|
])
|
||||||
|
```
|
||||||
23
frontend/eslint.config.js
Normal file
23
frontend/eslint.config.js
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
import js from '@eslint/js'
|
||||||
|
import globals from 'globals'
|
||||||
|
import reactHooks from 'eslint-plugin-react-hooks'
|
||||||
|
import reactRefresh from 'eslint-plugin-react-refresh'
|
||||||
|
import tseslint from 'typescript-eslint'
|
||||||
|
import { globalIgnores } from 'eslint/config'
|
||||||
|
|
||||||
|
export default tseslint.config([
|
||||||
|
globalIgnores(['dist']),
|
||||||
|
{
|
||||||
|
files: ['**/*.{ts,tsx}'],
|
||||||
|
extends: [
|
||||||
|
js.configs.recommended,
|
||||||
|
tseslint.configs.recommended,
|
||||||
|
reactHooks.configs['recommended-latest'],
|
||||||
|
reactRefresh.configs.vite,
|
||||||
|
],
|
||||||
|
languageOptions: {
|
||||||
|
ecmaVersion: 2020,
|
||||||
|
globals: globals.browser,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
])
|
||||||
13
frontend/index.html
Normal file
13
frontend/index.html
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||||
|
<title>Vite + React + TS</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="root"></div>
|
||||||
|
<script type="module" src="/src/main.tsx"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
9620
frontend/package-lock.json
generated
9620
frontend/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -1,27 +1,29 @@
|
|||||||
{
|
{
|
||||||
"name": "frontend",
|
"name": "frontend",
|
||||||
"version": "1.0.0",
|
"private": true,
|
||||||
"description": "",
|
"version": "0.0.0",
|
||||||
"main": "index.js",
|
|
||||||
"type": "module",
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite dev",
|
"dev": "vite",
|
||||||
"build": "vite build"
|
"build": "tsc -b && vite build",
|
||||||
|
"lint": "eslint .",
|
||||||
|
"preview": "vite preview"
|
||||||
},
|
},
|
||||||
"keywords": [],
|
|
||||||
"author": "",
|
|
||||||
"license": "ISC",
|
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@tanstack/react-router": "^1.127.3",
|
|
||||||
"@tanstack/react-start": "^1.127.4",
|
|
||||||
"react": "^19.1.0",
|
"react": "^19.1.0",
|
||||||
"react-dom": "^19.1.0",
|
"react-dom": "^19.1.0"
|
||||||
"vite": "^7.0.4"
|
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@eslint/js": "^9.30.1",
|
||||||
"@types/react": "^19.1.8",
|
"@types/react": "^19.1.8",
|
||||||
"@types/react-dom": "^19.1.6",
|
"@types/react-dom": "^19.1.6",
|
||||||
"typescript": "^5.8.3",
|
"@vitejs/plugin-react-swc": "^3.10.2",
|
||||||
"vite-tsconfig-paths": "^5.1.4"
|
"eslint": "^9.30.1",
|
||||||
|
"eslint-plugin-react-hooks": "^5.2.0",
|
||||||
|
"eslint-plugin-react-refresh": "^0.4.20",
|
||||||
|
"globals": "^16.3.0",
|
||||||
|
"typescript": "~5.8.3",
|
||||||
|
"typescript-eslint": "^8.35.1",
|
||||||
|
"vite": "^7.0.4"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
1
frontend/public/vite.svg
Normal file
1
frontend/public/vite.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
42
frontend/src/App.css
Normal file
42
frontend/src/App.css
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
#root {
|
||||||
|
max-width: 1280px;
|
||||||
|
margin: 0 auto;
|
||||||
|
padding: 2rem;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.logo {
|
||||||
|
height: 6em;
|
||||||
|
padding: 1.5em;
|
||||||
|
will-change: filter;
|
||||||
|
transition: filter 300ms;
|
||||||
|
}
|
||||||
|
.logo:hover {
|
||||||
|
filter: drop-shadow(0 0 2em #646cffaa);
|
||||||
|
}
|
||||||
|
.logo.react:hover {
|
||||||
|
filter: drop-shadow(0 0 2em #61dafbaa);
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes logo-spin {
|
||||||
|
from {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-reduced-motion: no-preference) {
|
||||||
|
a:nth-of-type(2) .logo {
|
||||||
|
animation: logo-spin infinite 20s linear;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.card {
|
||||||
|
padding: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.read-the-docs {
|
||||||
|
color: #888;
|
||||||
|
}
|
||||||
35
frontend/src/App.tsx
Normal file
35
frontend/src/App.tsx
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
import { useState } from 'react'
|
||||||
|
import reactLogo from './assets/react.svg'
|
||||||
|
import viteLogo from '/vite.svg'
|
||||||
|
import './App.css'
|
||||||
|
|
||||||
|
function App() {
|
||||||
|
const [count, setCount] = useState(0)
|
||||||
|
|
||||||
|
return (
|
||||||
|
<>
|
||||||
|
<div>
|
||||||
|
<a href="https://vite.dev" target="_blank">
|
||||||
|
<img src={viteLogo} className="logo" alt="Vite logo" />
|
||||||
|
</a>
|
||||||
|
<a href="https://react.dev" target="_blank">
|
||||||
|
<img src={reactLogo} className="logo react" alt="React logo" />
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<h1>Vite + React</h1>
|
||||||
|
<div className="card">
|
||||||
|
<button onClick={() => setCount((count) => count + 1)}>
|
||||||
|
count is {count}
|
||||||
|
</button>
|
||||||
|
<p>
|
||||||
|
Edit <code>src/App.tsx</code> and save to test HMR
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<p className="read-the-docs">
|
||||||
|
Click on the Vite and React logos to learn more
|
||||||
|
</p>
|
||||||
|
</>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default App
|
||||||
1
frontend/src/assets/react.svg
Normal file
1
frontend/src/assets/react.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="35.93" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 228"><path fill="#00D8FF" d="M210.483 73.824a171.49 171.49 0 0 0-8.24-2.597c.465-1.9.893-3.777 1.273-5.621c6.238-30.281 2.16-54.676-11.769-62.708c-13.355-7.7-35.196.329-57.254 19.526a171.23 171.23 0 0 0-6.375 5.848a155.866 155.866 0 0 0-4.241-3.917C100.759 3.829 77.587-4.822 63.673 3.233C50.33 10.957 46.379 33.89 51.995 62.588a170.974 170.974 0 0 0 1.892 8.48c-3.28.932-6.445 1.924-9.474 2.98C17.309 83.498 0 98.307 0 113.668c0 15.865 18.582 31.778 46.812 41.427a145.52 145.52 0 0 0 6.921 2.165a167.467 167.467 0 0 0-2.01 9.138c-5.354 28.2-1.173 50.591 12.134 58.266c13.744 7.926 36.812-.22 59.273-19.855a145.567 145.567 0 0 0 5.342-4.923a168.064 168.064 0 0 0 6.92 6.314c21.758 18.722 43.246 26.282 56.54 18.586c13.731-7.949 18.194-32.003 12.4-61.268a145.016 145.016 0 0 0-1.535-6.842c1.62-.48 3.21-.974 4.76-1.488c29.348-9.723 48.443-25.443 48.443-41.52c0-15.417-17.868-30.326-45.517-39.844Zm-6.365 70.984c-1.4.463-2.836.91-4.3 1.345c-3.24-10.257-7.612-21.163-12.963-32.432c5.106-11 9.31-21.767 12.459-31.957c2.619.758 5.16 1.557 7.61 2.4c23.69 8.156 38.14 20.213 38.14 29.504c0 9.896-15.606 22.743-40.946 31.14Zm-10.514 20.834c2.562 12.94 2.927 24.64 1.23 33.787c-1.524 8.219-4.59 13.698-8.382 15.893c-8.067 4.67-25.32-1.4-43.927-17.412a156.726 156.726 0 0 1-6.437-5.87c7.214-7.889 14.423-17.06 21.459-27.246c12.376-1.098 24.068-2.894 34.671-5.345a134.17 134.17 0 0 1 1.386 6.193ZM87.276 214.515c-7.882 2.783-14.16 2.863-17.955.675c-8.075-4.657-11.432-22.636-6.853-46.752a156.923 156.923 0 0 1 1.869-8.499c10.486 2.32 22.093 3.988 34.498 4.994c7.084 9.967 14.501 19.128 21.976 27.15a134.668 134.668 0 0 1-4.877 4.492c-9.933 8.682-19.886 14.842-28.658 17.94ZM50.35 144.747c-12.483-4.267-22.792-9.812-29.858-15.863c-6.35-5.437-9.555-10.836-9.555-15.216c0-9.322 13.897-21.212 37.076-29.293c2.813-.98 5.757-1.905 8.812-2.773c3.204 10.42 7.406 21.315 12.477 32.332c-5.137 11.18-9.399 22.249-12.634 32.792a134.718 134.718 0 0 1-6.318-1.979Zm12.378-84.26c-4.811-24.587-1.616-43.134 6.425-47.789c8.564-4.958 27.502 2.111 47.463 19.835a144.318 144.318 0 0 1 3.841 3.545c-7.438 7.987-14.787 17.08-21.808 26.988c-12.04 1.116-23.565 2.908-34.161 5.309a160.342 160.342 0 0 1-1.76-7.887Zm110.427 27.268a347.8 347.8 0 0 0-7.785-12.803c8.168 1.033 15.994 2.404 23.343 4.08c-2.206 7.072-4.956 14.465-8.193 22.045a381.151 381.151 0 0 0-7.365-13.322Zm-45.032-43.861c5.044 5.465 10.096 11.566 15.065 18.186a322.04 322.04 0 0 0-30.257-.006c4.974-6.559 10.069-12.652 15.192-18.18ZM82.802 87.83a323.167 323.167 0 0 0-7.227 13.238c-3.184-7.553-5.909-14.98-8.134-22.152c7.304-1.634 15.093-2.97 23.209-3.984a321.524 321.524 0 0 0-7.848 12.897Zm8.081 65.352c-8.385-.936-16.291-2.203-23.593-3.793c2.26-7.3 5.045-14.885 8.298-22.6a321.187 321.187 0 0 0 7.257 13.246c2.594 4.48 5.28 8.868 8.038 13.147Zm37.542 31.03c-5.184-5.592-10.354-11.779-15.403-18.433c4.902.192 9.899.29 14.978.29c5.218 0 10.376-.117 15.453-.343c-4.985 6.774-10.018 12.97-15.028 18.486Zm52.198-57.817c3.422 7.8 6.306 15.345 8.596 22.52c-7.422 1.694-15.436 3.058-23.88 4.071a382.417 382.417 0 0 0 7.859-13.026a347.403 347.403 0 0 0 7.425-13.565Zm-16.898 8.101a358.557 358.557 0 0 1-12.281 19.815a329.4 329.4 0 0 1-23.444.823c-7.967 0-15.716-.248-23.178-.732a310.202 310.202 0 0 1-12.513-19.846h.001a307.41 307.41 0 0 1-10.923-20.627a310.278 310.278 0 0 1 10.89-20.637l-.001.001a307.318 307.318 0 0 1 12.413-19.761c7.613-.576 15.42-.876 23.31-.876H128c7.926 0 15.743.303 23.354.883a329.357 329.357 0 0 1 12.335 19.695a358.489 358.489 0 0 1 11.036 20.54a329.472 329.472 0 0 1-11 20.722Zm22.56-122.124c8.572 4.944 11.906 24.881 6.52 51.026c-.344 1.668-.73 3.367-1.15 5.09c-10.622-2.452-22.155-4.275-34.23-5.408c-7.034-10.017-14.323-19.124-21.64-27.008a160.789 160.789 0 0 1 5.888-5.4c18.9-16.447 36.564-22.941 44.612-18.3ZM128 90.808c12.625 0 22.86 10.235 22.86 22.86s-10.235 22.86-22.86 22.86s-22.86-10.235-22.86-22.86s10.235-22.86 22.86-22.86Z"></path></svg>
|
||||||
|
After Width: | Height: | Size: 4.0 KiB |
68
frontend/src/index.css
Normal file
68
frontend/src/index.css
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
:root {
|
||||||
|
font-family: system-ui, Avenir, Helvetica, Arial, sans-serif;
|
||||||
|
line-height: 1.5;
|
||||||
|
font-weight: 400;
|
||||||
|
|
||||||
|
color-scheme: light dark;
|
||||||
|
color: rgba(255, 255, 255, 0.87);
|
||||||
|
background-color: #242424;
|
||||||
|
|
||||||
|
font-synthesis: none;
|
||||||
|
text-rendering: optimizeLegibility;
|
||||||
|
-webkit-font-smoothing: antialiased;
|
||||||
|
-moz-osx-font-smoothing: grayscale;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
font-weight: 500;
|
||||||
|
color: #646cff;
|
||||||
|
text-decoration: inherit;
|
||||||
|
}
|
||||||
|
a:hover {
|
||||||
|
color: #535bf2;
|
||||||
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
display: flex;
|
||||||
|
place-items: center;
|
||||||
|
min-width: 320px;
|
||||||
|
min-height: 100vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
font-size: 3.2em;
|
||||||
|
line-height: 1.1;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
border-radius: 8px;
|
||||||
|
border: 1px solid transparent;
|
||||||
|
padding: 0.6em 1.2em;
|
||||||
|
font-size: 1em;
|
||||||
|
font-weight: 500;
|
||||||
|
font-family: inherit;
|
||||||
|
background-color: #1a1a1a;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: border-color 0.25s;
|
||||||
|
}
|
||||||
|
button:hover {
|
||||||
|
border-color: #646cff;
|
||||||
|
}
|
||||||
|
button:focus,
|
||||||
|
button:focus-visible {
|
||||||
|
outline: 4px auto -webkit-focus-ring-color;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (prefers-color-scheme: light) {
|
||||||
|
:root {
|
||||||
|
color: #213547;
|
||||||
|
background-color: #ffffff;
|
||||||
|
}
|
||||||
|
a:hover {
|
||||||
|
color: #747bff;
|
||||||
|
}
|
||||||
|
button {
|
||||||
|
background-color: #f9f9f9;
|
||||||
|
}
|
||||||
|
}
|
||||||
10
frontend/src/main.tsx
Normal file
10
frontend/src/main.tsx
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
import { StrictMode } from 'react'
|
||||||
|
import { createRoot } from 'react-dom/client'
|
||||||
|
import './index.css'
|
||||||
|
import App from './App.tsx'
|
||||||
|
|
||||||
|
createRoot(document.getElementById('root')!).render(
|
||||||
|
<StrictMode>
|
||||||
|
<App />
|
||||||
|
</StrictMode>,
|
||||||
|
)
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
/* eslint-disable */
|
|
||||||
|
|
||||||
// @ts-nocheck
|
|
||||||
|
|
||||||
// noinspection JSUnusedGlobalSymbols
|
|
||||||
|
|
||||||
// This file was automatically generated by TanStack Router.
|
|
||||||
// You should NOT make any changes in this file as it will be overwritten.
|
|
||||||
// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.
|
|
||||||
|
|
||||||
import { Route as rootRouteImport } from './routes/__root'
|
|
||||||
import { Route as IndexRouteImport } from './routes/index'
|
|
||||||
|
|
||||||
const IndexRoute = IndexRouteImport.update({
|
|
||||||
id: '/',
|
|
||||||
path: '/',
|
|
||||||
getParentRoute: () => rootRouteImport,
|
|
||||||
} as any)
|
|
||||||
|
|
||||||
export interface FileRoutesByFullPath {
|
|
||||||
'/': typeof IndexRoute
|
|
||||||
}
|
|
||||||
export interface FileRoutesByTo {
|
|
||||||
'/': typeof IndexRoute
|
|
||||||
}
|
|
||||||
export interface FileRoutesById {
|
|
||||||
__root__: typeof rootRouteImport
|
|
||||||
'/': typeof IndexRoute
|
|
||||||
}
|
|
||||||
export interface FileRouteTypes {
|
|
||||||
fileRoutesByFullPath: FileRoutesByFullPath
|
|
||||||
fullPaths: '/'
|
|
||||||
fileRoutesByTo: FileRoutesByTo
|
|
||||||
to: '/'
|
|
||||||
id: '__root__' | '/'
|
|
||||||
fileRoutesById: FileRoutesById
|
|
||||||
}
|
|
||||||
export interface RootRouteChildren {
|
|
||||||
IndexRoute: typeof IndexRoute
|
|
||||||
}
|
|
||||||
|
|
||||||
declare module '@tanstack/react-router' {
|
|
||||||
interface FileRoutesByPath {
|
|
||||||
'/': {
|
|
||||||
id: '/'
|
|
||||||
path: '/'
|
|
||||||
fullPath: '/'
|
|
||||||
preLoaderRoute: typeof IndexRouteImport
|
|
||||||
parentRoute: typeof rootRouteImport
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const rootRouteChildren: RootRouteChildren = {
|
|
||||||
IndexRoute: IndexRoute,
|
|
||||||
}
|
|
||||||
export const routeTree = rootRouteImport
|
|
||||||
._addFileChildren(rootRouteChildren)
|
|
||||||
._addFileTypes<FileRouteTypes>()
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
// src/router.tsx
|
|
||||||
import { createRouter as createTanStackRouter } from '@tanstack/react-router'
|
|
||||||
import { routeTree } from './routeTree.gen'
|
|
||||||
|
|
||||||
export function createRouter() {
|
|
||||||
const router = createTanStackRouter({
|
|
||||||
basepath: '/lst',
|
|
||||||
routeTree,
|
|
||||||
scrollRestoration: true,
|
|
||||||
})
|
|
||||||
|
|
||||||
return router
|
|
||||||
}
|
|
||||||
|
|
||||||
declare module '@tanstack/react-router' {
|
|
||||||
interface Register {
|
|
||||||
router: ReturnType<typeof createRouter>
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
/// <reference types="vite/client" />
|
|
||||||
import type { ReactNode } from 'react'
|
|
||||||
import {
|
|
||||||
Outlet,
|
|
||||||
createRootRoute,
|
|
||||||
HeadContent,
|
|
||||||
Scripts,
|
|
||||||
} from '@tanstack/react-router'
|
|
||||||
|
|
||||||
export const Route = createRootRoute({
|
|
||||||
head: () => ({
|
|
||||||
meta: [
|
|
||||||
{
|
|
||||||
charSet: 'utf-8',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'viewport',
|
|
||||||
content: 'width=device-width, initial-scale=1',
|
|
||||||
},
|
|
||||||
{
|
|
||||||
title: 'TanStack Start Starter',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
}),
|
|
||||||
component: RootComponent,
|
|
||||||
})
|
|
||||||
|
|
||||||
function RootComponent() {
|
|
||||||
return (
|
|
||||||
<RootDocument>
|
|
||||||
<Outlet />
|
|
||||||
</RootDocument>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
function RootDocument({ children }: Readonly<{ children: ReactNode }>) {
|
|
||||||
return (
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<HeadContent />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
{children}
|
|
||||||
<Scripts />
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
)
|
|
||||||
}
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
// src/routes/index.tsx
|
|
||||||
import * as fs from "node:fs";
|
|
||||||
import { createFileRoute, useRouter } from "@tanstack/react-router";
|
|
||||||
import { createServerFn } from "@tanstack/react-start";
|
|
||||||
|
|
||||||
const filePath = "count.txt";
|
|
||||||
|
|
||||||
async function readCount() {
|
|
||||||
return parseInt(
|
|
||||||
await fs.promises.readFile(filePath, "utf-8").catch(() => "0")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
const getCount = createServerFn({
|
|
||||||
method: "GET",
|
|
||||||
}).handler(() => {
|
|
||||||
return readCount();
|
|
||||||
});
|
|
||||||
|
|
||||||
const updateCount = createServerFn({ method: "POST" })
|
|
||||||
.validator((d: number) => d)
|
|
||||||
.handler(async ({ data }) => {
|
|
||||||
const count = await readCount();
|
|
||||||
await fs.promises.writeFile(filePath, `${count + data}`);
|
|
||||||
});
|
|
||||||
|
|
||||||
export const Route = createFileRoute("/")({
|
|
||||||
component: Home,
|
|
||||||
loader: async () => await getCount(),
|
|
||||||
});
|
|
||||||
|
|
||||||
function Home() {
|
|
||||||
const router = useRouter();
|
|
||||||
const state = Route.useLoaderData();
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div>
|
|
||||||
<p>This is just something to put in here</p>
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
onClick={() => {
|
|
||||||
updateCount({ data: 1 }).then(() => {
|
|
||||||
router.invalidate();
|
|
||||||
});
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
Add 1 to {state}?
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
}
|
|
||||||
1
frontend/src/vite-env.d.ts
vendored
Normal file
1
frontend/src/vite-env.d.ts
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/// <reference types="vite/client" />
|
||||||
27
frontend/tsconfig.app.json
Normal file
27
frontend/tsconfig.app.json
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
|
||||||
|
"target": "ES2022",
|
||||||
|
"useDefineForClassFields": true,
|
||||||
|
"lib": ["ES2022", "DOM", "DOM.Iterable"],
|
||||||
|
"module": "ESNext",
|
||||||
|
"skipLibCheck": true,
|
||||||
|
|
||||||
|
/* Bundler mode */
|
||||||
|
"moduleResolution": "bundler",
|
||||||
|
"allowImportingTsExtensions": true,
|
||||||
|
"verbatimModuleSyntax": true,
|
||||||
|
"moduleDetection": "force",
|
||||||
|
"noEmit": true,
|
||||||
|
"jsx": "react-jsx",
|
||||||
|
|
||||||
|
/* Linting */
|
||||||
|
"strict": true,
|
||||||
|
"noUnusedLocals": true,
|
||||||
|
"noUnusedParameters": true,
|
||||||
|
"erasableSyntaxOnly": true,
|
||||||
|
"noFallthroughCasesInSwitch": true,
|
||||||
|
"noUncheckedSideEffectImports": true
|
||||||
|
},
|
||||||
|
"include": ["src"]
|
||||||
|
}
|
||||||
@@ -1,10 +1,7 @@
|
|||||||
{
|
{
|
||||||
"compilerOptions": {
|
"files": [],
|
||||||
"jsx": "react-jsx",
|
"references": [
|
||||||
"moduleResolution": "Bundler",
|
{ "path": "./tsconfig.app.json" },
|
||||||
"module": "ESNext",
|
{ "path": "./tsconfig.node.json" }
|
||||||
"target": "ES2022",
|
]
|
||||||
"skipLibCheck": true,
|
}
|
||||||
"strictNullChecks": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
25
frontend/tsconfig.node.json
Normal file
25
frontend/tsconfig.node.json
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
|
||||||
|
"target": "ES2023",
|
||||||
|
"lib": ["ES2023"],
|
||||||
|
"module": "ESNext",
|
||||||
|
"skipLibCheck": true,
|
||||||
|
|
||||||
|
/* Bundler mode */
|
||||||
|
"moduleResolution": "bundler",
|
||||||
|
"allowImportingTsExtensions": true,
|
||||||
|
"verbatimModuleSyntax": true,
|
||||||
|
"moduleDetection": "force",
|
||||||
|
"noEmit": true,
|
||||||
|
|
||||||
|
/* Linting */
|
||||||
|
"strict": true,
|
||||||
|
"noUnusedLocals": true,
|
||||||
|
"noUnusedParameters": true,
|
||||||
|
"erasableSyntaxOnly": true,
|
||||||
|
"noFallthroughCasesInSwitch": true,
|
||||||
|
"noUncheckedSideEffectImports": true
|
||||||
|
},
|
||||||
|
"include": ["vite.config.ts"]
|
||||||
|
}
|
||||||
@@ -1,11 +1,13 @@
|
|||||||
import { defineConfig } from 'vite'
|
import { defineConfig } from "vite";
|
||||||
import tsConfigPaths from 'vite-tsconfig-paths'
|
import react from "@vitejs/plugin-react-swc";
|
||||||
import { tanstackStart } from '@tanstack/react-start/plugin/vite'
|
|
||||||
|
|
||||||
|
// https://vite.dev/config/
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
base: '/lst/',
|
plugins: [react()],
|
||||||
server: {
|
base: "/lst/app/",
|
||||||
port: 3000,
|
build: {
|
||||||
},
|
outDir: "../backend/frontend",
|
||||||
plugins: [tsConfigPaths(), tanstackStart({ target: 'node-server' })],
|
assetsDir: "assets",
|
||||||
})
|
emptyOutDir: true,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|||||||
35
package-lock.json
generated
35
package-lock.json
generated
@@ -1,21 +1,21 @@
|
|||||||
{
|
{
|
||||||
"name": "logistics_support_tool",
|
"name": "logistics_support_tool",
|
||||||
"version": "0.0.1-alpha.4",
|
"version": "0.0.1-alpha.5",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "logistics_support_tool",
|
"name": "logistics_support_tool",
|
||||||
"version": "0.0.1-alpha.4",
|
"version": "0.0.1-alpha.5",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"concurrently": "^9.2.0",
|
|
||||||
"dotenv": "^17.2.0",
|
"dotenv": "^17.2.0",
|
||||||
"fs-extra": "^11.3.0",
|
"fs-extra": "^11.3.0",
|
||||||
"node-fetch": "^3.3.2"
|
"node-fetch": "^3.3.2"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@release-it/conventional-changelog": "^10.0.1",
|
"@release-it/conventional-changelog": "^10.0.1",
|
||||||
|
"concurrently": "^9.2.0",
|
||||||
"cz-conventional-changelog": "^3.3.0",
|
"cz-conventional-changelog": "^3.3.0",
|
||||||
"release-it": "^19.0.3",
|
"release-it": "^19.0.3",
|
||||||
"standard-version": "^9.5.0"
|
"standard-version": "^9.5.0"
|
||||||
@@ -1294,6 +1294,7 @@
|
|||||||
"version": "5.0.1",
|
"version": "5.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
|
||||||
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
|
"integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
@@ -1814,6 +1815,7 @@
|
|||||||
"version": "9.2.0",
|
"version": "9.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.2.0.tgz",
|
||||||
"integrity": "sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ==",
|
"integrity": "sha512-IsB/fiXTupmagMW4MNp2lx2cdSN2FfZq78vF90LBB+zZHArbIQZjQtzXCiXnvTxCZSvXanTqFLWBjw2UkLx1SQ==",
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"chalk": "^4.1.2",
|
"chalk": "^4.1.2",
|
||||||
@@ -1839,6 +1841,7 @@
|
|||||||
"version": "4.3.0",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
|
||||||
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
|
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"color-convert": "^2.0.1"
|
"color-convert": "^2.0.1"
|
||||||
@@ -1854,6 +1857,7 @@
|
|||||||
"version": "4.1.2",
|
"version": "4.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
|
||||||
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
|
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ansi-styles": "^4.1.0",
|
"ansi-styles": "^4.1.0",
|
||||||
@@ -1870,6 +1874,7 @@
|
|||||||
"version": "7.2.0",
|
"version": "7.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
|
||||||
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
|
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"has-flag": "^4.0.0"
|
"has-flag": "^4.0.0"
|
||||||
@@ -1882,6 +1887,7 @@
|
|||||||
"version": "8.0.1",
|
"version": "8.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
|
||||||
"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
|
"integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
|
||||||
|
"dev": true,
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"string-width": "^4.2.0",
|
"string-width": "^4.2.0",
|
||||||
@@ -1896,6 +1902,7 @@
|
|||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
||||||
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"color-name": "~1.1.4"
|
"color-name": "~1.1.4"
|
||||||
@@ -1908,12 +1915,14 @@
|
|||||||
"version": "1.1.4",
|
"version": "1.1.4",
|
||||||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
||||||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
||||||
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/concurrently/node_modules/has-flag": {
|
"node_modules/concurrently/node_modules/has-flag": {
|
||||||
"version": "4.0.0",
|
"version": "4.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
|
||||||
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
|
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
@@ -1923,6 +1932,7 @@
|
|||||||
"version": "8.1.1",
|
"version": "8.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
|
||||||
"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
|
"integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"has-flag": "^4.0.0"
|
"has-flag": "^4.0.0"
|
||||||
@@ -1938,6 +1948,7 @@
|
|||||||
"version": "17.7.2",
|
"version": "17.7.2",
|
||||||
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
|
"resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
|
||||||
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
|
"integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"cliui": "^8.0.1",
|
"cliui": "^8.0.1",
|
||||||
@@ -1956,6 +1967,7 @@
|
|||||||
"version": "21.1.1",
|
"version": "21.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
|
||||||
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
|
"integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
|
||||||
|
"dev": true,
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=12"
|
"node": ">=12"
|
||||||
@@ -2690,6 +2702,7 @@
|
|||||||
"version": "8.0.0",
|
"version": "8.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
|
||||||
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
|
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
|
||||||
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/env-paths": {
|
"node_modules/env-paths": {
|
||||||
@@ -2717,6 +2730,7 @@
|
|||||||
"version": "3.2.0",
|
"version": "3.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
|
||||||
"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
|
"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=6"
|
"node": ">=6"
|
||||||
@@ -3108,6 +3122,7 @@
|
|||||||
"version": "2.0.5",
|
"version": "2.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
|
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
|
||||||
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
|
"integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
|
||||||
|
"dev": true,
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": "6.* || 8.* || >= 10.*"
|
"node": "6.* || 8.* || >= 10.*"
|
||||||
@@ -3835,6 +3850,7 @@
|
|||||||
"version": "3.0.0",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
|
||||||
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
|
"integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
@@ -4218,6 +4234,7 @@
|
|||||||
"version": "4.17.21",
|
"version": "4.17.21",
|
||||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
|
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
|
||||||
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
|
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
|
||||||
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/lodash.capitalize": {
|
"node_modules/lodash.capitalize": {
|
||||||
@@ -6052,6 +6069,7 @@
|
|||||||
"version": "2.1.1",
|
"version": "2.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
|
||||||
"integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
|
"integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
@@ -6165,6 +6183,7 @@
|
|||||||
"version": "7.8.2",
|
"version": "7.8.2",
|
||||||
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
|
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
|
||||||
"integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
|
"integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
|
||||||
|
"dev": true,
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"tslib": "^2.1.0"
|
"tslib": "^2.1.0"
|
||||||
@@ -6238,6 +6257,7 @@
|
|||||||
"version": "1.8.3",
|
"version": "1.8.3",
|
||||||
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz",
|
"resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz",
|
||||||
"integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==",
|
"integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==",
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.4"
|
"node": ">= 0.4"
|
||||||
@@ -6464,6 +6484,7 @@
|
|||||||
"version": "4.2.3",
|
"version": "4.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
|
||||||
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
|
"integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"emoji-regex": "^8.0.0",
|
"emoji-regex": "^8.0.0",
|
||||||
@@ -6486,6 +6507,7 @@
|
|||||||
"version": "6.0.1",
|
"version": "6.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
|
||||||
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
|
"integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ansi-regex": "^5.0.1"
|
"ansi-regex": "^5.0.1"
|
||||||
@@ -6678,6 +6700,7 @@
|
|||||||
"version": "1.2.2",
|
"version": "1.2.2",
|
||||||
"resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
|
||||||
"integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
|
"integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"bin": {
|
"bin": {
|
||||||
"tree-kill": "cli.js"
|
"tree-kill": "cli.js"
|
||||||
@@ -6697,6 +6720,7 @@
|
|||||||
"version": "2.8.1",
|
"version": "2.8.1",
|
||||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
|
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
|
||||||
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
|
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
|
||||||
|
"dev": true,
|
||||||
"license": "0BSD"
|
"license": "0BSD"
|
||||||
},
|
},
|
||||||
"node_modules/type-fest": {
|
"node_modules/type-fest": {
|
||||||
@@ -6900,6 +6924,7 @@
|
|||||||
"version": "7.0.0",
|
"version": "7.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
|
||||||
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
|
"integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ansi-styles": "^4.0.0",
|
"ansi-styles": "^4.0.0",
|
||||||
@@ -6917,6 +6942,7 @@
|
|||||||
"version": "4.3.0",
|
"version": "4.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
|
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
|
||||||
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
|
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"color-convert": "^2.0.1"
|
"color-convert": "^2.0.1"
|
||||||
@@ -6932,6 +6958,7 @@
|
|||||||
"version": "2.0.1",
|
"version": "2.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
|
||||||
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
|
||||||
|
"dev": true,
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"color-name": "~1.1.4"
|
"color-name": "~1.1.4"
|
||||||
@@ -6944,6 +6971,7 @@
|
|||||||
"version": "1.1.4",
|
"version": "1.1.4",
|
||||||
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
|
||||||
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
|
||||||
|
"dev": true,
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
"node_modules/wrappy": {
|
"node_modules/wrappy": {
|
||||||
@@ -6967,6 +6995,7 @@
|
|||||||
"version": "5.0.8",
|
"version": "5.0.8",
|
||||||
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
|
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
|
||||||
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
|
"integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
|
||||||
|
"dev": true,
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=10"
|
"node": ">=10"
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "logistics_support_tool",
|
"name": "logistics_support_tool",
|
||||||
"version": "0.0.1-alpha.4",
|
"version": "0.0.1-alpha.5",
|
||||||
"description": "This is the new logisitcs support tool",
|
"description": "This is the new logisitcs support tool",
|
||||||
"private": true,
|
"private": true,
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
|
|||||||
@@ -26,10 +26,10 @@ if (Test-Path $envFile) {
|
|||||||
Write-Host ".env file not found at $envFile"
|
Write-Host ".env file not found at $envFile"
|
||||||
}
|
}
|
||||||
|
|
||||||
if (-not $env:BUILD_NAME) {
|
# if (-not $env:BUILD_NAME) {
|
||||||
Write-Warning "BUILD_NAME environment variable is not set. Please make sure you have entered the correct info the env"
|
# Write-Warning "BUILD_NAME environment variable is not set. Please make sure you have entered the correct info the env"
|
||||||
exit 1
|
# exit 1
|
||||||
}
|
# }
|
||||||
|
|
||||||
function Get-PackageVersion {
|
function Get-PackageVersion {
|
||||||
param (
|
param (
|
||||||
@@ -78,7 +78,7 @@ function Update-BuildNumber {
|
|||||||
$name = $matches[2]
|
$name = $matches[2]
|
||||||
|
|
||||||
$newNumber = $number + 1
|
$newNumber = $number + 1
|
||||||
$newBuildNumber = "$newNumber-$name"
|
$newBuildNumber = "$newNumber"
|
||||||
|
|
||||||
Set-Content -Path $buildNumberFile -Value $newBuildNumber
|
Set-Content -Path $buildNumberFile -Value $newBuildNumber
|
||||||
|
|
||||||
@@ -95,14 +95,14 @@ function Update-BuildNumber {
|
|||||||
Push-Location $rootDir/backend
|
Push-Location $rootDir/backend
|
||||||
Write-Host "Building the app"
|
Write-Host "Building the app"
|
||||||
go get
|
go get
|
||||||
go build -ldflags "-X main.version=$($version)-$($initialBuildValue)" -o lst_backend.exe ./main.go
|
go build -ldflags "-X main.version=$($version)-$($initialBuildValue)" -o lst_app.exe ./main.go
|
||||||
if ($LASTEXITCODE -ne 0) {
|
if ($LASTEXITCODE -ne 0) {
|
||||||
Write-Warning "Backend build failed!"
|
Write-Warning "app build failed!"
|
||||||
Pop-Location
|
Pop-Location
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
Write-Host "Backend build finished successfully."
|
Write-Host "app build finished successfully."
|
||||||
|
|
||||||
Pop-Location
|
Pop-Location
|
||||||
|
|
||||||
@@ -122,6 +122,13 @@ function Update-BuildNumber {
|
|||||||
|
|
||||||
Write-Host "Building wrapper"
|
Write-Host "Building wrapper"
|
||||||
Push-Location $rootDir/LstWrapper
|
Push-Location $rootDir/LstWrapper
|
||||||
|
#remove the publish folder as we done need it
|
||||||
|
if (-not (Test-Path "publish")) {
|
||||||
|
Write-Host "The publish folder is already deleted nothing else to do"
|
||||||
|
} else {
|
||||||
|
Remove-Item -LiteralPath "publish" -Force -Recurse
|
||||||
|
}
|
||||||
|
|
||||||
dotnet publish -c Release -o ./publish
|
dotnet publish -c Release -o ./publish
|
||||||
|
|
||||||
Pop-Location
|
Pop-Location
|
||||||
@@ -156,7 +163,7 @@ try {
|
|||||||
npm run release
|
npm run release
|
||||||
|
|
||||||
# deleteing the temp folder so we always cleaned up
|
# deleteing the temp folder so we always cleaned up
|
||||||
Delete-Tmp-Folder
|
|
||||||
if ($LASTEXITCODE -ne 0) {
|
if ($LASTEXITCODE -ne 0) {
|
||||||
throw "Failed to create Gitea release"
|
throw "Failed to create Gitea release"
|
||||||
}
|
}
|
||||||
@@ -166,10 +173,10 @@ try {
|
|||||||
Write-Warning "Release process failed: $_"
|
Write-Warning "Release process failed: $_"
|
||||||
|
|
||||||
# deleteing the temp folder so we always cleaned up
|
# deleteing the temp folder so we always cleaned up
|
||||||
Delete-Tmp-Folder
|
|
||||||
exit 1
|
exit 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Delete-Tmp-Folder
|
||||||
break
|
break
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -71,18 +71,21 @@ $tempStageDir = New-Item -ItemType Directory -Path (Join-Path $env:TEMP "lst_sta
|
|||||||
|
|
||||||
# Copy files to organized structure
|
# Copy files to organized structure
|
||||||
$filesToCopy = @(
|
$filesToCopy = @(
|
||||||
@{ Source = "backend\lst_backend.exe"; Destination = "backend\lst_backend.exe" },
|
@{ Source = "backend\lst_app.exe"; Destination = "app\lst_app.exe" },
|
||||||
|
@{ Source = "backend\docs"; Destination = "app\docs\" },
|
||||||
|
@{ Source = "backend\frontend"; Destination = "app\frontend\" },
|
||||||
@{ Source = "LstWrapper\publish"; Destination = "lstwrapper\" },
|
@{ Source = "LstWrapper\publish"; Destination = "lstwrapper\" },
|
||||||
@{ Source = "frontend\.nitro"; Destination = "frontend\.nitro" },
|
#@{ Source = "frontend\.nitro"; Destination = "frontend\.nitro" },
|
||||||
@{ Source = "frontend\.tanstack"; Destination = "frontend\.tanstack" },
|
#@{ Source = "frontend\.tanstack"; Destination = "frontend\.tanstack" },
|
||||||
@{ Source = "frontend\.output"; Destination = "frontend\.output" },
|
#@{ Source = "frontend\.output"; Destination = "frontend\.output" },
|
||||||
@{ Source = "frontend\public"; Destination = "frontend\public" },
|
#@{ Source = "frontend\public"; Destination = "frontend\public" },
|
||||||
@{ Source = "package.json"; Destination = "package.json" },
|
@{ Source = "package.json"; Destination = "package.json" },
|
||||||
@{ Source = "CHANGELOG.md"; Destination = "CHANGELOG.md" },
|
@{ Source = "CHANGELOG.md"; Destination = "CHANGELOG.md" },
|
||||||
@{ Source = "README.md"; Destination = "README.md" },
|
@{ Source = "README.md"; Destination = "README.md" },
|
||||||
# scripts to be copied over
|
# scripts to be copied over
|
||||||
@{ Source = "scripts\tmp"; Destination = "scripts\tmp" }
|
@{ Source = "scripts\tmp"; Destination = "tmp" }
|
||||||
@{ Source = "scripts\iisControls.ps1"; Destination = "scripts\iisControls.ps1" }
|
@{ Source = "scripts\iisControls.ps1"; Destination = "scripts\iisControls.ps1" }
|
||||||
|
@{ Source = "scripts\services.ps1"; Destination = "scripts\services.ps1" }
|
||||||
# docs
|
# docs
|
||||||
# @{ Source = "lst-docs\build"; Destination = "lst-docs\build" }
|
# @{ Source = "lst-docs\build"; Destination = "lst-docs\build" }
|
||||||
)
|
)
|
||||||
@@ -101,7 +104,7 @@ Remove-Item $tempStageDir -Recurse -Force
|
|||||||
|
|
||||||
Write-Host "`nRelease package created at: $($zipPath)"
|
Write-Host "`nRelease package created at: $($zipPath)"
|
||||||
Write-Host "Organized structure:"
|
Write-Host "Organized structure:"
|
||||||
Write-Host "- backend/"
|
Write-Host "- app/"
|
||||||
Write-Host "- frontend/"
|
Write-Host "- frontend/"
|
||||||
Write-Host "- lstwrapper/"
|
Write-Host "- lstwrapper/"
|
||||||
Write-Host "- scripts/"
|
Write-Host "- scripts/"
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
Write-Host "Building the docker images for front and backend"
|
Write-Host "Building the docker images for front and backend"
|
||||||
docker build -t logistics_support_tool:frontend-latest -f ./frontend/Dockerfile --no-cache ./frontend
|
#docker build -t logistics_support_tool:frontend-latest -f ./frontend/Dockerfile --no-cache ./frontend
|
||||||
docker build -t logistics_support_tool:backend-latest -f ./backend/Dockerfile --no-cache ./backend
|
docker build -t logistics_support_tool:latest -f ./backend/Dockerfile --no-cache ./backend
|
||||||
|
|
||||||
Write-Host "Tagging the builds with latest this is for testing test basically."
|
Write-Host "Tagging the builds with latest this is for testing test basically."
|
||||||
docker tag logistics_support_tool:frontend-latest git.tuffraid.net/cowch/logistics_support_tool:frontend-latest
|
#docker tag logistics_support_tool:frontend-latest git.tuffraid.net/cowch/logistics_support_tool:frontend-latest
|
||||||
docker tag logistics_support_tool:backend-latest git.tuffraid.net/cowch/logistics_support_tool:backend-latest
|
docker tag logistics_support_tool:latest git.tuffraid.net/cowch/logistics_support_tool:latest
|
||||||
|
|
||||||
# docker build -t logistics_support_tool:frontend-latest --no-cache .
|
# docker build -t logistics_support_tool:frontend-latest --no-cache .
|
||||||
Write-Host "Push both builds to our gitea server."
|
Write-Host "Push both builds to our gitea server."
|
||||||
docker push git.tuffraid.net/cowch/logistics_support_tool:frontend-latest
|
#docker push git.tuffraid.net/cowch/logistics_support_tool:frontend-latest
|
||||||
docker push git.tuffraid.net/cowch/logistics_support_tool:backend-latest
|
docker push git.tuffraid.net/cowch/logistics_support_tool:latest
|
||||||
|
|
||||||
Write-Host "Pull the new images to our docker system"
|
Write-Host "Pull the new images to our docker system"
|
||||||
docker compose -f ./docker-compose.yml up -d --force-recreate
|
docker compose -f ./docker-compose.yml up -d --force-recreate
|
||||||
@@ -4,6 +4,9 @@ param (
|
|||||||
[string]$StopOrStart
|
[string]$StopOrStart
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Example string to run with the parameters in it.
|
||||||
|
# .\iisControls.ps1 -ServerName "usmcd1vms036" -AppPoolName "LogisticsSupportTool" -StopOrStart "stop"
|
||||||
|
|
||||||
write-host $StopOrStart
|
write-host $StopOrStart
|
||||||
if ($StopOrStart -eq "stop") {
|
if ($StopOrStart -eq "stop") {
|
||||||
Invoke-Command -ComputerName $ServerName -Credential $cred -ScriptBlock {
|
Invoke-Command -ComputerName $ServerName -Credential $cred -ScriptBlock {
|
||||||
|
|||||||
@@ -36,11 +36,20 @@ function Build-LstV2-And-Copy {
|
|||||||
New-Item -Path $scriptDir -Name "tmp" -ItemType "Directory"
|
New-Item -Path $scriptDir -Name "tmp" -ItemType "Directory"
|
||||||
}
|
}
|
||||||
|
|
||||||
Write-Host "Jumping into lstV2 to build it."
|
$defaultChoice = "n"
|
||||||
|
$input = Read-Host "Do we want to build lstV2? (Y/n) [$defaultChoice]"
|
||||||
|
|
||||||
|
$choice = if ([string]::IsNullOrWhiteSpace($input)) { $defaultChoice } else { $input.ToLower() }
|
||||||
|
|
||||||
|
if($choice -eq "n"){
|
||||||
|
Write-Host "Just going to copy the latest build over as we dont want to build a new one."
|
||||||
|
} else {
|
||||||
|
Write-Host "Jumping into lstV2 to build it."
|
||||||
Push-Location $lstv2Loc
|
Push-Location $lstv2Loc
|
||||||
npm run build
|
npm run build
|
||||||
|
|
||||||
Write-Host "LSTV2 Finished building."
|
Write-Host "LSTV2 Finished building."
|
||||||
|
}
|
||||||
|
|
||||||
Write-Host "Copy the latest build to the tmpLoc"
|
Write-Host "Copy the latest build to the tmpLoc"
|
||||||
|
|
||||||
|
|||||||
0
scripts/serviceController.ps1
Normal file
0
scripts/serviceController.ps1
Normal file
207
scripts/services.ps1
Normal file
207
scripts/services.ps1
Normal file
@@ -0,0 +1,207 @@
|
|||||||
|
param (
|
||||||
|
[string]$serviceName,
|
||||||
|
[string]$option,
|
||||||
|
[string]$appPath,
|
||||||
|
[string]$command, # just the command like run start or what ever you have in npm.
|
||||||
|
[string]$description,
|
||||||
|
[string]$remote,
|
||||||
|
[string]$server,
|
||||||
|
[string]$username,
|
||||||
|
[string]$admpass
|
||||||
|
)
|
||||||
|
|
||||||
|
# Example string to run with the parameters in it.
|
||||||
|
# .\scripts\services.ps1 -serviceName "LST_app" -option "install" -appPath "E:\LST" -description "Logistics Support Tool in go" -command "E:\LST\app\lst_app.exe"
|
||||||
|
|
||||||
|
$nssmPath = $AppPath + "\nssm.exe"
|
||||||
|
$npmPath = "C:\Program Files\nodejs\npm.cmd" # Path to npm.cmd
|
||||||
|
|
||||||
|
# Convert the plain-text password to a SecureString
|
||||||
|
$securePass = ConvertTo-SecureString $admpass -AsPlainText -Force
|
||||||
|
$credentials = New-Object System.Management.Automation.PSCredential($username, $securePass)
|
||||||
|
|
||||||
|
if($remote -eq "true"){
|
||||||
|
|
||||||
|
# if(-not $username -or -not $admpass){
|
||||||
|
# Write-host "Missing adm account info please try again."
|
||||||
|
# exit 1
|
||||||
|
# }
|
||||||
|
|
||||||
|
$plantFunness = {
|
||||||
|
param ($service, $processType, $location)
|
||||||
|
# Call your PowerShell script inside plantFunness
|
||||||
|
# & "$($location)\dist\server\scripts\services.ps1" -serviceName $service -option $processType -appPath $location
|
||||||
|
|
||||||
|
if (-not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
|
||||||
|
Write-Host "Error: This script must be run as Administrator."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if(-not $service -or -not $processType){
|
||||||
|
Write-host "The service name or option is missing please enter one of them and try again."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($processType -eq "start"){
|
||||||
|
write-host "Starting $($service)."
|
||||||
|
Start-Service $service
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($processType -eq "stop"){
|
||||||
|
write-host "Stoping $($service)."
|
||||||
|
Stop-Service $service
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($processType -eq "restart"){
|
||||||
|
write-host "Stoping $($service) to be restarted"
|
||||||
|
Stop-Service $service
|
||||||
|
Start-Sleep 3 # so we give it enough time to fully stop
|
||||||
|
write-host "Starting $($service)"
|
||||||
|
Start-Service $service
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($processType -eq "prodStop"){
|
||||||
|
if(-not $location){
|
||||||
|
Write-host "The path to the app is missing please add it in and try again."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
& $nssmPath stop $service
|
||||||
|
write-host "Removing $($service)"
|
||||||
|
#& $nssmPath remove $serviceName confirm
|
||||||
|
sc.exe config $service start= disabled
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($processType -eq "prodStart"){
|
||||||
|
if(-not $location){
|
||||||
|
Write-host "The path to the app is missing please add it in and try again."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
& $nssmPath start $service
|
||||||
|
write-host "Removing $($service)"
|
||||||
|
#& $nssmPath remove $serviceName confirm
|
||||||
|
sc.exe config $service start= auto
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Invoke-Command -ComputerName $server -ScriptBlock $plantFunness -ArgumentList $serviceName, $option, $appPath -Credential $credentials
|
||||||
|
} else {
|
||||||
|
|
||||||
|
if (-not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
|
||||||
|
Write-Host "Error: This script must be run as Administrator."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if(-not $serviceName -or -not $option){
|
||||||
|
Write-host "The service name or option is missing please enter one of them and try again."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($option -eq "start"){
|
||||||
|
write-host "Starting $($serviceName)."
|
||||||
|
Start-Service $serviceName
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($option -eq "stop"){
|
||||||
|
write-host "Stoping $($serviceName)."
|
||||||
|
Stop-Service $serviceName
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($option -eq "restart"){
|
||||||
|
write-host "Stoping $($serviceName) to be restarted"
|
||||||
|
Stop-Service $serviceName
|
||||||
|
Start-Sleep 3 # so we give it enough time to fully stop
|
||||||
|
write-host "Starting $($serviceName)"
|
||||||
|
Start-Service $serviceName
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($option -eq "delete"){
|
||||||
|
if(-not $appPath){
|
||||||
|
Write-host "The path to the app is missing please add it in and try again."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
& $nssmPath stop $serviceName
|
||||||
|
write-host "Removing $($serviceName)"
|
||||||
|
& $nssmPath remove $serviceName confirm
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($option -eq "prodStop"){
|
||||||
|
if(-not $appPath){
|
||||||
|
Write-host "The path to the app is missing please add it in and try again."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
& $nssmPath stop $serviceName
|
||||||
|
write-host "Removing $($serviceName)"
|
||||||
|
#& $nssmPath remove $serviceName confirm
|
||||||
|
sc.exe config $serviceName start= disabled
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($option -eq "prodStart"){
|
||||||
|
if(-not $appPath){
|
||||||
|
Write-host "The path to the app is missing please add it in and try again."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
& $nssmPath start $serviceName
|
||||||
|
write-host "Removing $($serviceName)"
|
||||||
|
#& $nssmPath remove $serviceName confirm
|
||||||
|
sc.exe config $serviceName start= auto
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if($option -eq "install"){
|
||||||
|
if(-not $appPath -or -not $description -or -not $command){
|
||||||
|
Write-host "Please check all parameters are passed to install the app.."
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
$service = Get-Service -Name $serviceName -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
if(-not $service){
|
||||||
|
write-host $serviceName "is not installed we will install it now"
|
||||||
|
|
||||||
|
Write-Host "Installing $serviceName..."
|
||||||
|
if($command.Contains(".exe")){
|
||||||
|
|
||||||
|
& $nssmPath install $serviceName $command
|
||||||
|
|
||||||
|
$fullAppPath = "$appPath\app"
|
||||||
|
& $nssmPath set $serviceName AppDirectory $fullAppPath
|
||||||
|
}else {
|
||||||
|
& $nssmPath install $serviceName $npmPath $command
|
||||||
|
& $nssmPath set $serviceName AppDirectory $appPath
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
& $nssmPath set $serviceName Description $description
|
||||||
|
& $nssmPath set $serviceName AppStdout "E:\LST\logs\service.log"
|
||||||
|
& $nssmPath set $serviceName AppStderr "E:\LST\logs\service-error.log"
|
||||||
|
& $nssmPath set $serviceName DependOnService "MSSQLSERVER"
|
||||||
|
# Set recovery options
|
||||||
|
sc.exe failure $serviceName reset= 0 actions= restart/5000/restart/5000/restart/5000
|
||||||
|
& $nssmPath start $serviceName
|
||||||
|
}else{
|
||||||
|
write-host $serviceName "is already installed will push the updated info"
|
||||||
|
Write-Host "Updating $serviceName..."
|
||||||
|
& $nssmPath stop $serviceName
|
||||||
|
|
||||||
|
if($command.Contains(".exe")){
|
||||||
|
$fullAppPath = "$appPath\app"
|
||||||
|
& $nssmPath set $serviceName AppDirectory $fullAppPath
|
||||||
|
}else {
|
||||||
|
& $nssmPath set $serviceName AppDirectory $appPath
|
||||||
|
}
|
||||||
|
|
||||||
|
& $nssmPath set $serviceName Description $description
|
||||||
|
# & $nssmPath set $serviceName DependOnService "IISADMIN MSSQLSERVER"
|
||||||
|
# Set recovery options
|
||||||
|
sc.exe failure $serviceName reset= 0 actions= restart/5000/restart/5000/restart/5000
|
||||||
|
Start-Sleep 4
|
||||||
|
& $nssmPath start $serviceName
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
245
scripts/updateServer.ps1
Normal file
245
scripts/updateServer.ps1
Normal file
@@ -0,0 +1,245 @@
|
|||||||
|
param (
|
||||||
|
[string]$server,
|
||||||
|
[string]$token,
|
||||||
|
[string]$location,
|
||||||
|
[string]$devFolder,
|
||||||
|
[string]$serverIP,
|
||||||
|
[string]$build,
|
||||||
|
[string]$type,
|
||||||
|
[string]$username,
|
||||||
|
[string]$admpass,
|
||||||
|
[string]$obslst,
|
||||||
|
[string]$obsBuild
|
||||||
|
)
|
||||||
|
|
||||||
|
$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Definition
|
||||||
|
$rootDir = Join-Path $scriptDir ".."
|
||||||
|
|
||||||
|
# example run script is
|
||||||
|
# .\updateServer.ps1 -username "username" -admpass "password" -token "test3" -server "usmcd1vms036" -serverIP "10.193.0.56" -build "C:\Users\matthes01\Documents\logistics_support_tool\releases" -location "E:\LST"
|
||||||
|
|
||||||
|
# Convert the plain-text password to a SecureString
|
||||||
|
$securePass = ConvertTo-SecureString $admpass -AsPlainText -Force
|
||||||
|
$credentials = New-Object System.Management.Automation.PSCredential($username, $securePass)
|
||||||
|
|
||||||
|
# lets get the version of the app we are updating
|
||||||
|
$pkgFile = "$rootDir\package.json"
|
||||||
|
$package = Get-Content -Path $pkgFile -Raw | ConvertFrom-Json
|
||||||
|
$buildNumberFile = Join-Path $rootDir "BUILD_NUMBER"
|
||||||
|
|
||||||
|
if (Test-Path $buildNumberFile) {
|
||||||
|
$buildNumber = Get-Content $buildNumberFile -Raw
|
||||||
|
$buildNumber = $buildNumber.Trim()
|
||||||
|
Write-Host "Current build number: $buildNumber"
|
||||||
|
} else {
|
||||||
|
Write-Warning "BUILD_NUMBER file not found at $buildNumberFile"
|
||||||
|
}
|
||||||
|
|
||||||
|
$version = "$($package.version)-$($buildNumber)"
|
||||||
|
|
||||||
|
# Checking to make sure the server is up and online
|
||||||
|
Write-Output "Checking if $($token) is online to update."
|
||||||
|
$pingResult = Test-Connection -ComputerName $serverIP -Count 2 -Quiet
|
||||||
|
|
||||||
|
if (-not $pingResult) {
|
||||||
|
Write-Output "Server $($server) $($serverIP) is NOT reachable. Exiting script."
|
||||||
|
exit 1 # Terminate the script with a non-zero exit code
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Output "Server $($server) ($serverIP) is online."
|
||||||
|
|
||||||
|
|
||||||
|
$buildZip = "release-v$version.zip"
|
||||||
|
if (-Not (Test-Path -Path "$($build)\$($buildZip)")) {
|
||||||
|
Write-Host "Build is missing from the build folder."
|
||||||
|
Write-host $buildZip
|
||||||
|
exit
|
||||||
|
} else {
|
||||||
|
Write-Host "We have the build lets move to next step"
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Write-Host "Starting the update Process"
|
||||||
|
Write-Host "File to be copied over is $buildZip"
|
||||||
|
Write-Host "Coping files to $($server)"
|
||||||
|
$destination = "\\$($server)\$($location)" -replace ":", "$"
|
||||||
|
Write-Host $destination
|
||||||
|
Write-Host "Forcing the removal of the mapped drive, just incase it was lingering"
|
||||||
|
|
||||||
|
Get-PSDrive -Name "z" -ErrorAction SilentlyContinue | Remove-PSDrive -Force
|
||||||
|
|
||||||
|
|
||||||
|
# Create a mapped drive with credentials using New-PSDrive for the current session
|
||||||
|
|
||||||
|
try {
|
||||||
|
net use $server /delete /y 2>$null
|
||||||
|
#New-PSDrive -Name "z" -PSProvider FileSystem -Root $destination -Credential $credentials
|
||||||
|
New-PSDrive -Name "Z" -PSProvider FileSystem -Root $destination -Persist -Credential $credentials
|
||||||
|
|
||||||
|
# Create the update folder if it doesn't exist
|
||||||
|
if (-not (Test-Path -Path $destination)) {
|
||||||
|
New-Item -ItemType Directory -Path $destination -Force
|
||||||
|
}
|
||||||
|
|
||||||
|
# Copying files to the server
|
||||||
|
Write-Host "Copying files to $($server)"
|
||||||
|
Copy-Item -Path "$($build)\$($buildZip)" -Destination "Z:\" -Recurse -Force
|
||||||
|
Write-Host "Files copied to $($server)"
|
||||||
|
} catch {
|
||||||
|
Write-Host "Error: $_"
|
||||||
|
} finally {
|
||||||
|
# Remove the mapped drive after copying
|
||||||
|
if (Get-PSDrive -Name "Z" -ErrorAction SilentlyContinue) {
|
||||||
|
Write-Host "Removing mapped drive..."
|
||||||
|
Remove-PSDrive -Name "Z"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
# create the extracted path
|
||||||
|
$extractedFolderPath = "$server\$location$(if ($token -eq "usiow2") { "_2" })"
|
||||||
|
|
||||||
|
$plantFunness = {
|
||||||
|
param ($server, $token, $location, $buildFile, $buildLoc)
|
||||||
|
|
||||||
|
$localPath = $location -replace '\$', ':'
|
||||||
|
$serverFile = "$($localPath)\$buildFile"
|
||||||
|
$serverPath = "$($localPath)"
|
||||||
|
|
||||||
|
|
||||||
|
# $appPath = $extractedFolderPath
|
||||||
|
$nssmPath = $serverPath + "\nssm.exe"
|
||||||
|
$npmPath = "C:\Program Files\nodejs\npm.cmd"
|
||||||
|
|
||||||
|
$serviceApp = "LST_app$(if ($token -eq "usiow2") { "_2" })"
|
||||||
|
#$serviceFrontEnd = "LST-frontend$(if ($token -eq "usiow2") { "_2" })"
|
||||||
|
$serviceOcme = "LST-Ocme$(if ($token -eq "usiow2") { "_2" })"
|
||||||
|
$serviceLstV2 = "LSTV2$(if ($token -eq "usiow2") { "_2" })"
|
||||||
|
|
||||||
|
Write-Host "In the plant we go!!!!!"
|
||||||
|
# $servicesScript = Join-Path $PSScriptRoot "scripts\services.ps1"
|
||||||
|
# $iisContorl = Join-Path $PSScriptRoot "scripts\iisControls.ps1"
|
||||||
|
######################################################################################
|
||||||
|
# Stop the services and iis to do the updates.
|
||||||
|
######################################################################################
|
||||||
|
Write-Host "Stopping the services to do the updates, pkgs and db changes."
|
||||||
|
|
||||||
|
Write-Host "Stopping $serviceApp"
|
||||||
|
Stop-Service -DisplayName $serviceApp -Force
|
||||||
|
Start-Sleep -Seconds 1
|
||||||
|
|
||||||
|
Write-Host "Stopping $serviceLstV2"
|
||||||
|
Stop-Service -DisplayName $serviceLstV2 -Force
|
||||||
|
Start-Sleep -Seconds 1
|
||||||
|
|
||||||
|
if($token -eq "usday1"){
|
||||||
|
Write-Host "Stopping $($serviceOcme)"
|
||||||
|
Stop-Service -DisplayName $serviceOcme -Force
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host "Stopping iis application"
|
||||||
|
Stop-WebAppPool -Name LogisticsSupportTool #-ErrorAction Stop
|
||||||
|
|
||||||
|
|
||||||
|
######################################################################################
|
||||||
|
# Removing the cashed stuff to keep the folder clean.
|
||||||
|
######################################################################################
|
||||||
|
|
||||||
|
# Delete the directories after extraction
|
||||||
|
Write-Host "Deleting app and other cache stuff"
|
||||||
|
|
||||||
|
Set-Location $serverPath
|
||||||
|
if (-not (Test-Path "app")) {
|
||||||
|
Write-Host "The app folder is already deleted nothing else to do"
|
||||||
|
} else {
|
||||||
|
Remove-Item -LiteralPath "app" -Force -Recurse
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not (Test-Path "lstWrapper")) {
|
||||||
|
Write-Host "The lstWrapper folder is already deleted nothing else to do"
|
||||||
|
} else {
|
||||||
|
Remove-Item -LiteralPath "lstWrapper" -Force -Recurse
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not (Test-Path "scripts")) {
|
||||||
|
Write-Host "The scripts folder is already deleted nothing else to do"
|
||||||
|
} else {
|
||||||
|
Remove-Item -LiteralPath "scripts" -Force -Recurse
|
||||||
|
}
|
||||||
|
|
||||||
|
if (-not (Test-Path "tmp")) {
|
||||||
|
Write-Host "The scripts folder is already deleted nothing else to do"
|
||||||
|
} else {
|
||||||
|
Remove-Item -LiteralPath "tmp" -Force -Recurse
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
######################################################################################
|
||||||
|
# Extract everything the cashed stuff to keep the folder clean.
|
||||||
|
######################################################################################
|
||||||
|
|
||||||
|
Write-Host "Unzipping the folder..."
|
||||||
|
try {
|
||||||
|
# Expand the archive
|
||||||
|
Expand-Archive -Path $serverFile -DestinationPath $serverPath -Force
|
||||||
|
|
||||||
|
# Delete the zip file after extraction
|
||||||
|
Write-Host "Deleting the zip file..."
|
||||||
|
Remove-Item -Path $serverFile -Force
|
||||||
|
} catch {
|
||||||
|
Write-Host "Error: $_"
|
||||||
|
exit 1 # Exit with a non-zero code if there's an error
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host "Unzip the LSTV2 app"
|
||||||
|
|
||||||
|
#lstv2 loc
|
||||||
|
$lstv2 = Get-ChildItem -Path "$($localPath)\tmp" -Filter *.zip
|
||||||
|
|
||||||
|
write-host $lstv2[0].FullName
|
||||||
|
|
||||||
|
if ($lstv2.Count -eq 0) {
|
||||||
|
Write-Host "No zip files found in $localPath\tmp"
|
||||||
|
|
||||||
|
} else {
|
||||||
|
$zipToExtract = $lstv2[0].FullName
|
||||||
|
$destination = "$localPath\lstv2"
|
||||||
|
|
||||||
|
Expand-Archive -Path $zipToExtract -DestinationPath $destination -Force
|
||||||
|
Write-Host "Extracted $zipToExtract to $destination"
|
||||||
|
|
||||||
|
$removePath = "$($localPath)\tmp"
|
||||||
|
Remove-Item -Path $removePath -Force /Y
|
||||||
|
}
|
||||||
|
|
||||||
|
######################################################################################
|
||||||
|
# Doing the update stuff.
|
||||||
|
# for now just on the old version.
|
||||||
|
######################################################################################
|
||||||
|
Push-Location $serverPath/lstv2
|
||||||
|
npm i
|
||||||
|
npm run db:migrate
|
||||||
|
|
||||||
|
######################################################################################
|
||||||
|
# Start the services and iis backup.
|
||||||
|
######################################################################################
|
||||||
|
Write-Host "Starting the services up."
|
||||||
|
|
||||||
|
Write-Host "Starting $serviceApp"
|
||||||
|
Start-Service -DisplayName $serviceApp
|
||||||
|
Start-Sleep -Seconds 1
|
||||||
|
|
||||||
|
Write-Host "Starting $serviceLstV2"
|
||||||
|
Start-Service -DisplayName $serviceLstV2
|
||||||
|
Start-Sleep -Seconds 1
|
||||||
|
|
||||||
|
if($token -eq "usday1"){
|
||||||
|
Write-Host "Starting $($serviceOcme)"
|
||||||
|
Start-Service -DisplayName $serviceOcme
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host "Starting iis application"
|
||||||
|
Start-WebAppPool -Name LogisticsSupportTool
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
Invoke-Command -ComputerName $server -ScriptBlock $plantFunness -ArgumentList $server, $token, $location, $buildZip, $buildLoc -Credential $credentials
|
||||||
Reference in New Issue
Block a user