diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index be1e740ebe..e6495d66d9 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -38,6 +38,11 @@ } }, + // It seems that if the .npmrc file is not present, then the container can't + // be open. To not force, contributor to have an NPM account, + // we create a dummy .npmrc file if it doesn't exist + "initializeCommand": "if [ ! -f ~/.npmrc ]; then touch ~/.npmrc; fi", + "mounts": [ // Mount .npmrc from the host machine, to be able to use the host session // This allow the user to login on their own machine once and not each time diff --git a/.fantomasignore b/.fantomasignore index 1dbcd51f14..890dc8d1cd 100644 --- a/.fantomasignore +++ b/.fantomasignore @@ -1,3 +1,4 @@ src/** tests/** tests_external/** +!src/Fable.Build/** diff --git a/.vscode/settings.json b/.vscode/settings.json index c33642fdef..bc38a09f63 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -8,7 +8,6 @@ "**/bin": true, "**/obj": true, "**/.fake": true, - "**/packages": true, "**/node_modules": true, "**/bower_components": true }, diff --git a/build copy.fsx b/build copy.fsx deleted file mode 100644 index 6ab551a2df..0000000000 --- a/build copy.fsx +++ /dev/null @@ -1,383 +0,0 @@ -#load "src/Fable.PublishUtils/PublishUtils.fs" - -open System -open System.Text.RegularExpressions -open PublishUtils - -// ncave FCS fork -let FCS_REPO = "https://github.com/ncave/fsharp" -let FCS_REPO_LOCAL = "../fsharp_fable" -let FCS_REPO_FABLE_BRANCH = "fable" -let FCS_REPO_SERVICE_SLIM_BRANCH = "service_slim" - -let BUILD_ARGS = - fsi.CommandLineArgs - |> Array.skip 1 - |> List.ofArray - -let BUILD_ARGS_LOWER = - BUILD_ARGS - |> List.map (fun x -> x.ToLower()) - -module Util = - let cleanDirs dirs = - for dir in dirs do - printfn $"Clean {dir}" - removeDirRecursive dir - - // TODO: move to PublishUtils.fs ? - let copyFiles sourceDir searchPattern destDir = - printfn $"Copy {sourceDir searchPattern} to {destDir}" - for source in IO.Directory.GetFiles(sourceDir, searchPattern) do - let fileName = IO.Path.GetFileName(source) - let target = destDir fileName - IO.File.Copy(source, target, true) - - let resolveDir dir = - __SOURCE_DIRECTORY__ dir - - let updateVersionsInFableTransforms compilerVersion (libraryVersions: (string * string) list) = - let mutable updated = Set.empty - - let replaceVersion (lang: string option) version fileContent = - let prefix = - match lang with - | None -> "" - | Some lang -> $"{lang.ToUpperInvariant()}_LIBRARY_" - - Regex.Replace( - fileContent, - $@"^(\s*)let \[] {prefix}VERSION = ""(.*?)""", - (fun (m: Match) -> - match lang with - | Some lang when m.Groups[2].Value <> version -> - updated <- Set.add lang updated - | _ -> () - m.Groups[1].Value + $"let [] {prefix}VERSION = \"{version}\"" - ), - RegexOptions.Multiline) - - let filePath = "src/Fable.Transforms/Global/Compiler.fs" - readFile filePath - |> replaceVersion None compilerVersion - |> List.foldBack (fun (lang, version) fileContent -> - replaceVersion (Some lang) version fileContent) libraryVersions - |> writeFile filePath - - updated - - let updatePkgVersionInFsproj projFile version = - readFile projFile - |> replaceRegex Publish.NUGET_PACKAGE_VERSION (fun m -> - m.Groups[1].Value + version + m.Groups[3].Value) - |> writeFile projFile - - let runTSLint projectDir = - run ("npm run tslint -- --project " + projectDir) - - let runTypeScript projectDir = - run ("npm run tsc -- --project " + projectDir) - - let runTypeScriptWithArgs projectDir args = - run ("npm run tsc -- --project " + projectDir + " " + String.concat " " args) - - let runFableWithArgs projectDir args = - run ("dotnet run -c Release --project src/Fable.Cli -- " + projectDir + " " + String.concat " " args) - - let watchFableWithArgs projectDir args = - run ("dotnet watch --project src/Fable.Cli run -- " + projectDir + " --cwd ../.. " + String.concat " " args) - - let runFableWithArgsInDirAs release projectDir args = - let cliDir = resolveDir "src/Fable.Cli" - let cliArgs = args |> String.concat " " - let cliCmd = $"""dotnet run {if release then "-c Release" else ""} --project {cliDir} -- {cliArgs}""" - runInDir (resolveDir projectDir) cliCmd - - let runFableWithArgsInDir projectDir args = - runFableWithArgsInDirAs true projectDir args - - let runFableWithArgsAsync projectDir args = - runAsync ("dotnet run -c Release --project src/Fable.Cli -- " + projectDir + " " + String.concat " " args) - - let runNpx command args = - run ("npx " + command + " " + (String.concat " " args)) - - let runNpmScript script args = - run ("npm run " + script + " -- " + (String.concat " " args)) - - let runNpmScriptAsync script args = - runAsync ("npm run " + script + " -- " + (String.concat " " args)) - - let runFable projectDir = - runFableWithArgs projectDir [] - - let runMocha testDir = - runNpmScript "mocha" [$"{testDir} --reporter dot -t 10000"] - -open Util - -module Unused = - let downloadAndExtractTo (url: string) (targetDir: string) = - $"npx download --extract --out %s{targetDir} \"%s{url}\"" |> run - - let coverage() = - // report converter - // https://github.com/danielpalme/ReportGenerator - // dotnet tool install dotnet-reportgenerator-globaltool --tool-path tools - if not (pathExists "./bin/tools/reportgenerator") && not (pathExists "./bin/tools/reportgenerator.exe") then - runInDir "." "dotnet tool install dotnet-reportgenerator-globaltool --tool-path bin/tools" - let reportGen = - if pathExists "./bin/tools/reportgenerator" then "bin/tools/reportgenerator" - else "bin\\tools\\reportgenerator.exe" - - // if not (pathExists "build/fable-library") then - // buildLibrary() - - cleanDirs ["build/tests"] - runFable "tests" - - // JS - run "npx nyc mocha build/tests --require source-map-support/register --reporter dot -t 10000" - runInDir "." (reportGen + " \"-reports:build/coverage/nyc/lcov.info\" -reporttypes:Html \"-targetdir:build/coverage/nyc/html\" ") - - // .NET - //runInDir "tests/Main" "dotnet build /t:Collect_Coverage" - cleanDirs ["build/coverage/netcoreapp2.0/out"] - runInDir "." (reportGen + " \"-reports:build/coverage/netcoreapp2.0/coverage.xml\" -reporttypes:Html \"-targetdir:build/coverage/netcoreapp2.0/html\" ") - - - -let buildWorker (opts: {| minify: bool; watch: bool |}) = - printfn "Building worker%s..." (if opts.minify then "" else " (no minification)") - - let projectDir = "src/fable-standalone/src" - let buildDir = "build/fable-standalone" - let distDir = "src/fable-standalone/dist" - - runFableWithArgs (projectDir + "/Worker") [ - "--outDir " + buildDir + "/worker" - ] - - let rollupTarget = - match opts.minify with - | true -> buildDir "worker.js" - | false -> distDir "worker.min.js" - - // make standalone worker dist - runNpmScript "rollup" [$"""{buildDir}/worker/Worker.js -o {rollupTarget} --format iife"""] - - if opts.minify then - // runNpx "webpack" [sprintf "--entry ./%s/worker.js --output ./%s/worker.min.js --config ./%s/../worker.config.js" buildDir distDir projectDir] - runNpmScript "terser" [$"{buildDir}/worker.js -o {distDir}/worker.min.js --mangle --compress"] - - // Put fable-library files next to bundle - printfn "Copying fable-library..." - // buildLibraryTsIfNotExists() - let libraryDir = "build/fable-library" - let libraryTarget = distDir "fable-library" - copyDirRecursive libraryDir libraryTarget - -let buildStandalone (opts: {| minify: bool; watch: bool |}) = - // buildLibraryTs() - - printfn "Building standalone%s..." (if opts.minify then "" else " (no minification)") - - let projectDir = "src/fable-standalone/src" - let buildDir = "build/fable-standalone" - let distDir = "src/fable-standalone/dist" - - let rollupTarget = - match opts.watch, opts.minify with - | true, _ -> - match BUILD_ARGS with - | _::rollupTarget::_ -> rollupTarget - | _ -> failwith "Pass the bundle output, e.g.: npm run build watch-standalone ../repl3/public/js/repl/bundle.min.js" - | false, true -> buildDir "bundle.js" - | false, false -> distDir "bundle.min.js" - - let rollupArgs = [ - buildDir "bundle/Main.js" - "-o " + rollupTarget - "--format umd" - "--name __FABLE_STANDALONE__" - ] - - // cleanup - if not opts.watch then - cleanDirs [buildDir; distDir] - makeDirRecursive distDir - - // build standalone bundle - runFableWithArgs projectDir [ - "--outDir " + buildDir "bundle" - if opts.watch then - "--watch" - "--run rollup" - yield! rollupArgs - "--watch" - ] - - // make standalone bundle dist - runNpmScript "rollup" rollupArgs - if opts.minify then - runNpmScript "terser" [ - buildDir "bundle.js" - "-o " + distDir "bundle.min.js" - "--mangle" - "--compress" - ] - - // build standalone worker - buildWorker opts - - // print bundle size - fileSizeInBytes (distDir "bundle.min.js") / 1000. |> printfn "Bundle size: %fKB" - fileSizeInBytes (distDir "worker.min.js") / 1000. |> printfn "Worker size: %fKB" - -let buildCompilerJs(minify: bool) = - let projectDir = "src/fable-compiler-js/src" - let buildDir = "build/fable-compiler-js" - let distDir = "src/fable-compiler-js/dist" - - if not (pathExists "build/fable-standalone") then - buildStandalone {|minify=minify; watch=false|} - - cleanDirs [buildDir; distDir] - makeDirRecursive distDir - - runFableWithArgs projectDir [ - "--outDir " + buildDir - "--exclude Fable.Core" - ] - - let rollupTarget = if minify then distDir "app.js" else distDir "app.min.js" - run $"npx rollup {buildDir}/app.js -o {rollupTarget} --format umd --name Fable" - if minify then - run $"npx terser {distDir}/app.js -o {distDir}/app.min.js --mangle --compress" - - // Copy fable-library - copyDirRecursive ("build/fable-library") (distDir "fable-library") - // Copy fable-metadata - copyDirRecursive ("src/fable-metadata/lib") (distDir "fable-metadata") - -let testStandalone(minify) = - let fableDir = "src/fable-compiler-js" - let buildDir = "build/tests/Standalone" - - if not (pathExists "build/fable-compiler-js") then - buildCompilerJs(minify) - - cleanDirs [buildDir] - - // Link fable-compiler-js to local packages - runInDir fableDir "npm link ../fable-metadata" - runInDir fableDir "npm link ../fable-standalone" - - // Test fable-compiler-js locally - run $"node {fableDir} tests/Js/Main/Fable.Tests.fsproj {buildDir}" - runMocha buildDir - - // // Another local fable-compiler-js test - // runInDir (fableDir "test") "node .. test_script.fsx" - // runInDir (fableDir "test") "node test_script.fsx.js" - - // Unlink local packages after test - runInDir fableDir "npm unlink ../fable-metadata && cd ../fable-metadata && npm unlink" - runInDir fableDir "npm unlink ../fable-standalone && cd ../fable-standalone && npm unlink" - -let buildLocalPackageWith pkgDir pkgCommand fsproj action = - let version = Publish.loadReleaseVersion "src/Fable.Cli" + "-local-build-" + DateTime.Now.ToString("yyyyMMdd-HHmm") - action version - updatePkgVersionInFsproj fsproj version - run $"dotnet pack {fsproj} -p:Pack=true -c Release -o {pkgDir}" - - // Return install command - $"""dotnet {pkgCommand} --version "{version}" --add-source {fullPath pkgDir}""" - -let buildLocalPackage pkgDir = - buildLocalPackageWith pkgDir - "tool install fable" - (resolveDir "src/Fable.Cli/Fable.Cli.fsproj") (fun version -> - updateVersionsInFableTransforms version [] |> ignore - // buildLibraryTs() - ) - -let testRepos() = - let repos = [ - "https://github.com/alfonsogarciacaro/FsToolkit.ErrorHandling:update-fable-3", "npm i && npm test" - "https://github.com/fable-compiler/fable-promise:master", "npm i && npm test" - "https://github.com/alfonsogarciacaro/Thoth.Json:nagareyama", "dotnet paket restore && npm i && dotnet fable tests -o tests/bin --run mocha tests/bin" - "https://github.com/alfonsogarciacaro/FSharp.Control.AsyncSeq:nagareyama", "cd tests/fable && npm i && npm test" - "https://github.com/alfonsogarciacaro/Fable.Extras:nagareyama", "dotnet paket restore && npm i && npm test" - "https://github.com/alfonsogarciacaro/Fable.Jester:nagareyama", "npm i && npm test" - "https://github.com/Zaid-Ajaj/Fable.SimpleJson:master", "npm i && npm run test-nagareyama" - ] - - let testDir = tempPath() "fable-repos" - printfn $"Cloning repos to: {testDir}" - - cleanDirs [testDir] - makeDirRecursive testDir - let pkgInstallCmd = buildLocalPackage (testDir "pkg") - - for (repo, command) in repos do - let url, branch = let i = repo.LastIndexOf(":") in repo[..i-1], repo[i+1..] - let name = url[url.LastIndexOf("/") + 1..] - runInDir testDir $"git clone {url} {name}" - let repoDir = testDir name - runInDir repoDir ("git checkout " + branch) - runInDir repoDir "dotnet tool uninstall fable" - runInDir repoDir pkgInstallCmd - runInDir repoDir "dotnet tool restore" - runInDir repoDir command - - -let hasFlag flag = - BUILD_ARGS_LOWER |> List.contains flag - -match BUILD_ARGS_LOWER with -// | "check-sourcemaps"::_ -> -// ("src/quicktest/Quicktest.fs", "src/quicktest/bin/Quicktest.js", "src/quicktest/bin/Quicktest.js.map") -// |||> sprintf "nodemon --watch src/quicktest/bin/Quicktest.js --exec 'source-map-visualization --sm=\"%s;%s;%s\"'" -// |> List.singleton |> quicktest -// | "coverage"::_ -> coverage() - -// | "test-standalone-fast"::_ -> testStandaloneFast() -| "test-repos"::_ -> testRepos() - -| "package"::_ -> - let pkgInstallCmd = buildLocalPackage (resolveDir "temp/pkg") - printfn $"\nPackage has been created, use the following command to install it:\n {pkgInstallCmd}\n" -| "package-core"::_ -> - let pkgInstallCmd = buildLocalPackageWith (resolveDir "temp/pkg") "add package Fable.Core" (resolveDir "src/Fable.Core/Fable.Core.fsproj") ignore - printfn $"\nFable.Core package has been created, use the following command to install it:\n {pkgInstallCmd}\n" - -| ("fable-compiler-js"|"compiler-js")::_ -> - let minify = hasFlag "--no-minify" |> not - buildCompilerJs(minify) -| ("fable-standalone"|"standalone")::_ -> - let minify = hasFlag "--no-minify" |> not - buildStandalone {|minify=minify; watch=false|} -| ("fable-worker"|"worker")::_ -> - let minify = hasFlag "--no-minify" |> not - buildWorker {|minify=minify; watch=false|} -| "watch-standalone"::_ -> buildStandalone {|minify=false; watch=true|} - - -| _ -> - printfn """Please pass a target name. Examples: - -- Use `test` to run tests: - dotnet fsi build.fsx test - -- Use `package` to build a local package: - dotnet fsi build.fsx package - -- Use `run` to compile a project with development version: - dotnet fsi build.fsx run ../path/to/my/project [Fable options] - -- Use `quicktest` to quickly test development version with src/quicktest project: - dotnet fsi build.fsx quicktest -""" - -printfn "Build finished successfully" diff --git a/package-lock.json b/package-lock.json index cef414f75f..69d71be0f6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "fable", + "name": "Fable", "lockfileVersion": 3, "requires": true, "packages": { diff --git a/src/Fable.Build/CompilerJs.fs b/src/Fable.Build/CompilerJs.fs new file mode 100644 index 0000000000..52a2cfca96 --- /dev/null +++ b/src/Fable.Build/CompilerJs.fs @@ -0,0 +1,83 @@ +module Build.CompilerJs + +open Build.FableLibrary +open System.IO +open System +open BlackFox.CommandLine +open Build.Utils +open Build +open SimpleExec +open Fake.IO + +let private fableCompilerJsDir = Path.Resolve("src", "fable-compiler-js") +let private buildDir = Path.Combine(fableCompilerJsDir, "temp") +let private distDir = Path.Combine(fableCompilerJsDir, "dist") + +module private FableLib = + + let source = Path.Resolve("temp", "fable-library") + let destination = Path.Combine(distDir, "fable-library") + +module private FableMetadata = + + let source = Path.Resolve("src", "fable-metadata", "lib") + let destination = Path.Combine(distDir, "fable-metadata") + +let handle (args: string list) = + let minify = args |> List.contains "--no-minify" |> not + // Note: + // We don't need to build fable-library, because it will be + // build as part of Standalone.build + + Command.Run("npm", "install", workingDirectory = fableCompilerJsDir) + + Standalone.handle args + + // Clean up temp folders + Directory.clean buildDir + Directory.clean distDir + // Clean up destination folders and make sure they exist + Directory.clean FableLib.destination + Directory.clean FableMetadata.destination + + Command.Fable( + CmdLine.empty + |> CmdLine.appendRaw "src" + |> CmdLine.appendPrefix "--outDir" buildDir + |> CmdLine.appendPrefix "--exclude" "Fable.Core", + workingDirectory = fableCompilerJsDir + ) + + Command.Run( + "npx", + CmdLine.empty + |> CmdLine.appendRaw "rollup" + |> CmdLine.appendRaw (buildDir "app.js") + |> CmdLine.appendPrefix "-o" (buildDir "app.rollup.js") + |> CmdLine.appendPrefix "--format" "esm" + |> CmdLine.appendPrefix "--name" "Fable" + |> CmdLine.toString, + workingDirectory = fableCompilerJsDir + ) + + Command.Run( + "npx", + CmdLine.empty + |> CmdLine.appendRaw "esbuild" + |> CmdLine.appendRaw (buildDir "app.rollup.js") + // When bundling with esbuild, there are errors about: + // Cannot assign to "XXX" because it is a constant + // Beause this is a CLI tool, I don't think bundling is important here + // |> CmdLine.appendRaw "--bundle" + |> CmdLine.appendRaw $"""--outfile={(distDir "app.min.js")}""" + |> CmdLine.appendRaw "--format=esm" + |> CmdLine.appendRaw "--platform=node" + |> CmdLine.appendIf minify "--minify" + |> CmdLine.toString, + workingDirectory = fableCompilerJsDir + ) + + Shell.copyRecursive FableLib.source FableLib.destination true |> ignore + + Shell.copyRecursive FableMetadata.source FableMetadata.destination true + |> ignore diff --git a/src/Fable.Build/Fable.Build.fsproj b/src/Fable.Build/Fable.Build.fsproj index eaa0fc09ca..73aa2468a9 100644 --- a/src/Fable.Build/Fable.Build.fsproj +++ b/src/Fable.Build/Fable.Build.fsproj @@ -19,6 +19,9 @@ + + + @@ -26,6 +29,7 @@ + @@ -33,9 +37,9 @@ - + diff --git a/src/Fable.Build/Main.fs b/src/Fable.Build/Main.fs index 00236e28b1..f09ce71441 100644 --- a/src/Fable.Build/Main.fs +++ b/src/Fable.Build/Main.fs @@ -57,13 +57,33 @@ Available commands: --no_std Compile and run the tests without the standard library --threaded Compile and run the tests with the threaded runtime - standalone Compile standalone version of Fable running + standalone Compile standalone + worker version of Fable running on top of of Node.js Options: + --skip-fable-library Skip building fable-library if folder already exists --no-minify Don't minify the JavaScript output --watch Watch for changes and recompile + worker-js Compile the worker for the standalone version of Fable + + Options: + --skip-fable-library Skip building fable-library if folder already exists + --no-minify Don't minify the JavaScript output + + compiler-js Compile the Fable compiler to JavaScript + + Options: + --skip-fable-library Skip building fable-library if folder already exists + --no-minify Don't minify the JavaScript output + + package Generate local package for Fable.Cli and Fable.Core + allowing to use this local package for testing + inside of other projects + + Options: + --skip-fable-library Skip building fable-library if folder already exists + publish Publish the different packages to NuGet and NPM based on the CHANGELOG.md files If the last version in the CHANGELOG.md is @@ -99,6 +119,9 @@ let main argv = | "rust" :: args -> Test.Rust.handle args | "integration" :: args -> Test.Integration.handle args | "standalone" :: _ -> Test.Standalone.handle args + // This test is using quicktest project for now, + // because it can't compile (yet?) the Main JavaScript tests + | "compiler-js" :: _ -> Test.CompilerJs.handle args | _ -> printHelp () | "quicktest" :: args -> match args with @@ -109,10 +132,14 @@ let main argv = | "rust" :: _ -> Quicktest.Rust.handle args | _ -> printHelp () | "standalone" :: args -> Standalone.handle args + | "compiler-js" :: args -> CompilerJs.handle args + | "worker-js" :: args -> WorkerJs.handle args | "sync-fcs-repo":: _ -> FcsRepo.sync () | "copy-fcs-repo":: _ -> FcsRepo.copy () | "publish" :: args -> Publish.handle args | "github-release" :: args -> GithubRelease.handle args + | "package" :: args -> Package.handle args + | "help" :: _ | "--help" :: _ | _ -> printHelp () diff --git a/src/Fable.Build/Package.fs b/src/Fable.Build/Package.fs new file mode 100644 index 0000000000..6d8f43ccbd --- /dev/null +++ b/src/Fable.Build/Package.fs @@ -0,0 +1,81 @@ +module Build.Package + +open Build.Utils +open Build.FableLibrary +open Octokit +open System +open Build.Workspace +open SimpleExec +open BlackFox.CommandLine +open System.IO + +let private packageDestination = Path.Resolve("temp", "packages") + +let handle (args: string list) = + let skipFableLibrary = args |> List.contains "--skip-fable-library" + // Build all the fable-libraries + BuildFableLibraryDart().Run(skipFableLibrary) + BuildFableLibraryJavaScript().Run(skipFableLibrary) + BuildFableLibraryPython().Run(skipFableLibrary) + BuildFableLibraryRust().Run(skipFableLibrary) + BuildFableLibraryTypeScript().Run(skipFableLibrary) + + Directory.clean packageDestination + + let fableCliVersionInfo = Changelog.getLastVersion Changelog.fableCLi + + let fableCliVersion = + fableCliVersionInfo.Version.ToString() + + "-local-build-" + + DateTime.Now.ToString("yyyyMMdd-HHhmm") + + let compilerFsPath = + Path.Resolve("src", "Fable.Transforms", "Global", "Compiler.fs") + + let compilerFsOriginalContent = File.ReadAllText compilerFsPath + + Publish.updateLibraryVersionInFableTransforms fableCliVersion {| + JavaScript = Npm.getVersionFromProjectDir ProjectDir.temp_fable_library + |} + + Command.Run( + "dotnet", + CmdLine.empty + |> CmdLine.appendRaw "pack" + |> CmdLine.appendRaw Fsproj.fableCli + |> CmdLine.appendPrefix "-c" "Release" + // By pass the PackageVersion in the fsproj, without having to modify it on the disk + |> CmdLine.appendRaw $"-p:PackageVersion={fableCliVersion}" + |> CmdLine.appendPrefix "-o" packageDestination + |> CmdLine.toString + ) + + // This avoid common error of comitting the modified file + File.WriteAllText(compilerFsPath, compilerFsOriginalContent) + + let fableCoreVersionInfo = Changelog.getLastVersion Changelog.fableCore + + let fableCoreVersion = + fableCoreVersionInfo.Version.ToString() + + "-local-build-" + + DateTime.Now.ToString("yyyyMMdd-HHhmm") + + Command.Run( + "dotnet", + CmdLine.empty + |> CmdLine.appendRaw "pack" + |> CmdLine.appendRaw Fsproj.fableCore + |> CmdLine.appendPrefix "-c" "Release" + // By pass the PackageVersion in the fsproj, without having to modify it on the disk + |> CmdLine.appendRaw $"-p:PackageVersion={fableCoreVersion}" + |> CmdLine.appendPrefix "-o" packageDestination + |> CmdLine.toString + ) + + printfn $"""Local packages created. + +Use the following commands to install them: + +- Fable.Cli: dotnet tool update fable --version {fableCliVersion} --add-source {packageDestination} +- Fable.Core: dotnet add package Fable.Core --version {fableCoreVersion} --add-source {packageDestination} + """ diff --git a/src/Fable.Build/Publish.fs b/src/Fable.Build/Publish.fs index 4df773d4cd..4ca259b696 100644 --- a/src/Fable.Build/Publish.fs +++ b/src/Fable.Build/Publish.fs @@ -7,7 +7,7 @@ open Build.FableLibrary open System open Build.Workspace -let private updateLibraryVersionInFableTransforms +let updateLibraryVersionInFableTransforms (compilerVersion: string) (librariesVersion: {| JavaScript: string |}) = @@ -129,7 +129,10 @@ let handle (args: string list) = // For fable-library, we use the compiled version of the project for publishing // This i because we want to publish the JavaScript code and not a mix of F# and TypeScript + // Disabled because only Alfonso can publish fable-library + // I requested to NPM/Github to give me access to the package, still waiting for an answer publishNpm ProjectDir.temp_fable_library + // We need also want to update the original package.json if needed // This is to keep the versions consistent across the project // and also will be used when updating libraries version inside of Fable compiler @@ -137,13 +140,14 @@ let handle (args: string list) = publishNpm ProjectDir.fable_metadata - // Disabled because standalone terser optimisation seems to never end - // Standalone.handle [] - // publishNpm ProjectDir.fable_standalone + // Trigger fable-compiler-js target to make sure everything is ready for publish + // Note: fable-standalone is built as part of fable-compiler-js + // so no need to build it separately + // Note 2: We already built fable-library, so we skip it here + CompilerJs.handle [ "--skip-fable-library" ] - // Disabled as we need standalone - // TODO: Build fable compiler js - // publishNpm ProjectDir.fable_compiler_js + publishNpm ProjectDir.fable_standalone + publishNpm ProjectDir.fable_compiler_js // Update embedded version (both compiler and libraries) let changelogPath = Path.Combine(ProjectDir.fableCli, "CHANGELOG.md") diff --git a/src/Fable.Build/Standalone.fs b/src/Fable.Build/Standalone.fs index 59d97e0894..be2c07931d 100644 --- a/src/Fable.Build/Standalone.fs +++ b/src/Fable.Build/Standalone.fs @@ -4,75 +4,119 @@ open SimpleExec open Build.Utils open BlackFox.CommandLine open System.IO +open Build.FableLibrary +open Fake.IO -let private projectDir = Path.Resolve("src", "fable-standalone", "src") +let private projectDir = Path.Resolve("src", "fable-standalone") -let private buildDir = Path.Resolve("temp", "fable-standalone") +let private buildDir = Path.Combine(projectDir, "temp") -let private distDir = Path.Resolve("src", "fable-standalone", "dist") +let private distDir = Path.Combine(projectDir, "dist") -let handle (args: string list) = - let minify = args |> List.contains "--no-minify" |> not - let isWatch = args |> List.contains "--watch" +let private buildWorker (minify: bool) = + + let fableArgs = + CmdLine.empty + |> CmdLine.appendRaw "src/Worker" + |> CmdLine.appendPrefix "--outDir" (buildDir "worker") + |> CmdLine.appendPrefix "--lang" "javascript" - let rollupOutput = - match isWatch, minify with - | true, _ -> failwith "Not supported yet" - | false, true -> distDir "bundle.min.js" - | false, false -> buildDir "bundle.js" + Command.Fable(fableArgs, workingDirectory = projectDir) - let rollupArgs = + Command.Run( + "npx", CmdLine.empty - |> CmdLine.appendRaw (buildDir "bundle/Main.js") - |> CmdLine.appendPrefix "--output" rollupOutput - |> CmdLine.appendPrefix "--format" "umd" - |> CmdLine.appendPrefix "--name" "__FABLE_STANDALONE__" - |> CmdLine.toString + |> CmdLine.appendRaw "rollup" + |> CmdLine.appendRaw (buildDir "worker" "Worker.js") + |> CmdLine.appendPrefix "-o" (buildDir "worker" "bundle.js") + |> CmdLine.appendPrefix "--format" "iife" + |> CmdLine.toString, + workingDirectory = projectDir + ) + + Command.Run( + "npx", + CmdLine.empty + |> CmdLine.appendRaw "esbuild" + |> CmdLine.appendRaw (buildDir "worker" "bundle.js") + |> CmdLine.appendRaw $"""--outfile={(distDir "worker.min.js")}""" + |> CmdLine.appendRaw "--format=iife" + |> CmdLine.appendIf minify "--minify" + |> CmdLine.toString, + workingDirectory = projectDir + ) + + let fableLibraryDist = (distDir "fable-library") + + Directory.ensure fableLibraryDist + + // Copy Fable library to dist folder + Shell.copyRecursive + (Path.Resolve("temp", "fable-library")) + fableLibraryDist + true + |> ignore + +let build (minify: bool) = let fableArgs = CmdLine.concat [ CmdLine.empty - |> CmdLine.appendPrefix "--outDir" (buildDir "bundle") + |> CmdLine.appendRaw "src" + |> CmdLine.appendPrefix "--outDir" buildDir |> CmdLine.appendPrefix "--lang" "javascript" - if isWatch then - CmdLine.empty - |> CmdLine.appendRaw "--watch" - |> CmdLine.appendPrefix "--run" "rollup" - |> CmdLine.appendRaw rollupArgs - |> CmdLine.appendRaw "--watch" + // if isWatch then + // CmdLine.empty + // |> CmdLine.appendRaw "--watch" + // |> CmdLine.appendPrefix "--run" "rollup" + // // |> CmdLine.appendRaw rollupArgs + // |> CmdLine.appendRaw "--watch" ] // Clean destination folders and ensure they exist Directory.clean buildDir Directory.clean distDir - if isWatch then - failwith "Not supported yet" - else - // Build standalone bundle - Command.Fable(fableArgs, workingDirectory = projectDir) + // Build standalone bundle + Command.Fable(fableArgs, workingDirectory = projectDir) - Command.Run("npx", $"rollup {rollupArgs}") + // Compile project as a library using Vite + Command.Run( + "npx", + CmdLine.empty + |> CmdLine.appendRaw "rollup" + |> CmdLine.appendRaw (buildDir "Main.js") + |> CmdLine.appendPrefix "-o" (buildDir "bundle.js") + // We need to use umd format so it can be used inside of web workers + // Web workers don't support ES modules (yet) + |> CmdLine.appendPrefix "--format" "umd" + |> CmdLine.appendPrefix "--name" "__FABLE_STANDALONE__" + |> CmdLine.toString, + workingDirectory = projectDir + ) - if minify then - Command.Run( - "npx", - CmdLine.empty - |> CmdLine.appendRaw "terser" - |> CmdLine.appendPrefix "--output" (distDir "bundle.min.js") - |> CmdLine.appendRaw "--mangle" - |> CmdLine.appendRaw "--compress" - |> CmdLine.toString - ) + Command.Run( + "npx", + CmdLine.empty + |> CmdLine.appendRaw "esbuild" + |> CmdLine.appendRaw (buildDir "bundle.js") + |> CmdLine.appendRaw $"""--outfile={(distDir "bundle.min.js")}""" + |> CmdLine.appendRaw "--format=esm" + |> CmdLine.appendIf minify "--minify" + |> CmdLine.toString, + workingDirectory = projectDir + ) - // let printFileSize (fileName: string) = - // let fileInfo = FileInfo(distDir fileName) +let handle (args: string list) = + let minify = args |> List.contains "--no-minify" |> not + let isWatch = args |> List.contains "--watch" + let skipFableLibrary = args |> List.contains "--skip-fable-library" - // let size = - // float (fileInfo.Length) / 1000.0 + Command.Run("npm", "install", workingDirectory = projectDir) - // printfn $"Bundle size: %.2f{size} KB" + BuildFableLibraryJavaScript().Run(skipFableLibrary) - // printFileSize "bundle.min.js" - // printFileSize "working.min.js" + build minify + // Force skip fable library for worker, because it's already built + WorkerJs.handle ("--skip-fable-library" :: args) diff --git a/src/Fable.Build/Test/CompilerJs.fs b/src/Fable.Build/Test/CompilerJs.fs new file mode 100644 index 0000000000..759c4329cf --- /dev/null +++ b/src/Fable.Build/Test/CompilerJs.fs @@ -0,0 +1,50 @@ +module Build.Test.CompilerJs + + +open Build.FableLibrary +open System.IO +open Build.Utils +open BlackFox.CommandLine +open SimpleExec +open Fake.IO + +let private fableCompilerJsDir = Path.Resolve("src", "fable-compiler-js") + +let private quicktestProject = + Path.Resolve("src", "quicktest", "Quicktest.fsproj") + +let private quicktestBuildDir = + Path.Resolve("temp", "tests", "fable-compiler-js", "quicktest") + +let handle (args : string list) = + Command.Run( + "npm", + "link ../fable-standalone ../fable-metadata", + workingDirectory = fableCompilerJsDir + ) + + Build.CompilerJs.handle args + + Command.Run( + "node", + CmdLine.empty + |> CmdLine.appendRaw "index.js" + |> CmdLine.appendRaw quicktestProject + |> CmdLine.appendPrefix "--outDir" quicktestBuildDir + |> CmdLine.toString, + workingDirectory = fableCompilerJsDir + ) + + Command.Run( + "node", + quicktestBuildDir "QuickTest.js", + workingDirectory = fableCompilerJsDir + ) + + // TODO: Add test against an fsx file but for now it seems broken + + Command.Run( + "npm", + "unlink ../fable-standalone ../fable-metadata", + workingDirectory = fableCompilerJsDir + ) diff --git a/src/Fable.Build/Test/Standalone.fs b/src/Fable.Build/Test/Standalone.fs index 07b8afbce4..db3ca96314 100644 --- a/src/Fable.Build/Test/Standalone.fs +++ b/src/Fable.Build/Test/Standalone.fs @@ -31,7 +31,7 @@ let handleStandaloneFast () = ) // Make sure the projects are restored - // Otherwise, on a first VM dependencies can be missing + // Otherwise, on a first VM run dependencies can be missing Command.Run("dotnet", $"restore {mainTestProject}") Command.Run( diff --git a/src/Fable.Build/WorkerJs.fs b/src/Fable.Build/WorkerJs.fs new file mode 100644 index 0000000000..cd3c05007f --- /dev/null +++ b/src/Fable.Build/WorkerJs.fs @@ -0,0 +1,62 @@ +module Build.WorkerJs + +open SimpleExec +open Build.Utils +open BlackFox.CommandLine +open System.IO +open Build.FableLibrary +open Fake.IO + +let private projectDir = Path.Resolve("src", "fable-standalone") + +let private buildDir = Path.Combine(projectDir, "temp") + +let private distDir = Path.Combine(projectDir, "dist") + +let handle (args: string list) = + let minify = args |> List.contains "--no-minify" |> not + let skipFableLibrary = args |> List.contains "--skip-fable-library" + + BuildFableLibraryJavaScript().Run(skipFableLibrary) + + let fableArgs = + CmdLine.empty + |> CmdLine.appendRaw "src/Worker" + |> CmdLine.appendPrefix "--outDir" (buildDir "worker") + |> CmdLine.appendPrefix "--lang" "javascript" + + Command.Fable(fableArgs, workingDirectory = projectDir) + + Command.Run( + "npx", + CmdLine.empty + |> CmdLine.appendRaw "rollup" + |> CmdLine.appendRaw (buildDir "worker" "Worker.js") + |> CmdLine.appendPrefix "-o" (buildDir "worker" "bundle.js") + |> CmdLine.appendPrefix "--format" "iife" + |> CmdLine.toString, + workingDirectory = projectDir + ) + + Command.Run( + "npx", + CmdLine.empty + |> CmdLine.appendRaw "esbuild" + |> CmdLine.appendRaw (buildDir "worker" "bundle.js") + |> CmdLine.appendRaw $"""--outfile={(distDir "worker.min.js")}""" + |> CmdLine.appendRaw "--format=iife" + |> CmdLine.appendIf minify "--minify" + |> CmdLine.toString, + workingDirectory = projectDir + ) + + let fableLibraryDist = (distDir "fable-library") + + Directory.ensure fableLibraryDist + + // Copy Fable library to dist folder + Shell.copyRecursive + (Path.Resolve("temp", "fable-library")) + fableLibraryDist + true + |> ignore diff --git a/src/Fable.Build/Workspace.fs b/src/Fable.Build/Workspace.fs index 4297e974c4..0e4978e770 100644 --- a/src/Fable.Build/Workspace.fs +++ b/src/Fable.Build/Workspace.fs @@ -20,7 +20,9 @@ module ProjectDir = module Fsproj = let fableCli = Path.Combine(ProjectDir.fableCli, "Fable.Cli.fsproj") + let fableCore = Path.Combine(ProjectDir.fableCore, "Fable.Core.fsproj") module Changelog = let fableCLi = Path.Combine(ProjectDir.fableCli, "CHANGELOG.md") + let fableCore = Path.Combine(ProjectDir.fableCore, "CHANGELOG.md") diff --git a/src/fable-compiler-js/CHANGELOG.md b/src/fable-compiler-js/CHANGELOG.md index b7f9b95767..aa4bd1f69b 100644 --- a/src/fable-compiler-js/CHANGELOG.md +++ b/src/fable-compiler-js/CHANGELOG.md @@ -6,6 +6,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +## 3.3.0 - 2023-11-10 + +### Changed + +* Use ESM format + +### Removed + * Remove `--typescript` options support, use `--lang ` instead ## 3.0.1 diff --git a/src/fable-compiler-js/index.js b/src/fable-compiler-js/index.js index 87733220d0..dbe2ccf04f 100644 --- a/src/fable-compiler-js/index.js +++ b/src/fable-compiler-js/index.js @@ -1,2 +1,2 @@ #!/usr/bin/env node -require("./dist/app.min.js"); +import "./dist/app.min.js"; diff --git a/src/fable-compiler-js/package-lock.json b/src/fable-compiler-js/package-lock.json index a6630c2c90..3737b472e5 100644 --- a/src/fable-compiler-js/package-lock.json +++ b/src/fable-compiler-js/package-lock.json @@ -1,95 +1,929 @@ { "name": "fable-compiler-js", - "version": "3.0.0", - "lockfileVersion": 1, + "version": "3.0.1", + "lockfileVersion": 2, "requires": true, - "dependencies": { - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "packages": { + "": { + "name": "fable-compiler-js", + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "fable-metadata": "^2.0.0", + "fable-standalone": "^3.0.0" + }, + "bin": { + "fable": "index.js" + }, + "devDependencies": { + "esbuild": "^0.19.5", + "rollup": "^4.2.0" } }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + "node_modules/@esbuild/android-arm": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.5.tgz", + "integrity": "sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } }, - "fable-metadata": { + "node_modules/@esbuild/android-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz", + "integrity": "sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.5.tgz", + "integrity": "sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz", + "integrity": "sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz", + "integrity": "sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz", + "integrity": "sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz", + "integrity": "sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz", + "integrity": "sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz", + "integrity": "sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz", + "integrity": "sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz", + "integrity": "sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz", + "integrity": "sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz", + "integrity": "sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz", + "integrity": "sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz", + "integrity": "sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz", + "integrity": "sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz", + "integrity": "sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz", + "integrity": "sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz", + "integrity": "sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz", + "integrity": "sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz", + "integrity": "sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz", + "integrity": "sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.2.0.tgz", + "integrity": "sha512-8PlggAxGxavr+pkCNeV1TM2wTb2o+cUWDg9M1cm9nR27Dsn287uZtSLYXoQqQcmq+sYfF7lHfd3sWJJinH9GmA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.2.0.tgz", + "integrity": "sha512-+71T85hbMFrJI+zKQULNmSYBeIhru55PYoF/u75MyeN2FcxE4HSPw20319b+FcZ4lWx2Nx/Ql9tN+hoaD3GH/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.2.0.tgz", + "integrity": "sha512-IIIQLuG43QIElT1JZqUP/zqIdiJl4t9U/boa0GZnQTw9m1X0k3mlBuysbgYXeloLT1RozdL7bgw4lpSaI8GOXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.2.0.tgz", + "integrity": "sha512-BXcXvnLaea1Xz900omrGJhxHFJfH9jZ0CpJuVsbjjhpniJ6qiLXz3xA8Lekaa4MuhFcJd4f0r+Ky1G4VFbYhWw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.2.0.tgz", + "integrity": "sha512-f4K3MKw9Y4AKi4ANGnmPIglr+S+8tO858YrGVuqAHXxJdVghBmz9CPU9kDpOnGvT4g4vg5uNyIFpOOFvffXyMA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.2.0.tgz", + "integrity": "sha512-bNsTYQBgp4H7w6cT7FZhesxpcUPahsSIy4NgdZjH1ZwEoZHxi4XKglj+CsSEkhsKi+x6toVvMylhjRKhEMYfnA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.2.0.tgz", + "integrity": "sha512-Jp1NxBJpGLuxRU2ihrQk4IZ+ia5nffobG6sOFUPW5PMYkF0kQtxEbeDuCa69Xif211vUOcxlOnf5IOEIpTEySA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.2.0.tgz", + "integrity": "sha512-3p3iRtQmv2aXw+vtKNyZMLOQ+LSRsqArXjKAh2Oj9cqwfIRe7OXvdkOzWfZOIp1F/x5KJzVAxGxnniF4cMbnsQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.2.0.tgz", + "integrity": "sha512-atih7IF/reUZe4LBLC5Izd44hth2tfDIG8LaPp4/cQXdHh9jabcZEvIeRPrpDq0i/Uu487Qu5gl5KwyAnWajnw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.2.0.tgz", + "integrity": "sha512-vYxF3tKJeUE4ceYzpNe2p84RXk/fGK30I8frpRfv/MyPStej/mRlojztkN7Jtd1014HHVeq/tYaMBz/3IxkxZw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.2.0.tgz", + "integrity": "sha512-1LZJ6zpl93SaPQvas618bMFarVwufWTaczH4ESAbFcwiC4OtznA6Ym+hFPyIGaJaGEB8uMWWac0uXGPXOg5FGA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.2.0.tgz", + "integrity": "sha512-dgQfFdHCNg08nM5zBmqxqc9vrm0DVzhWotpavbPa0j4//MAOKZEB75yGAfzQE9fUJ+4pvM1239Y4IhL8f6sSog==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/esbuild": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.5.tgz", + "integrity": "sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.19.5", + "@esbuild/android-arm64": "0.19.5", + "@esbuild/android-x64": "0.19.5", + "@esbuild/darwin-arm64": "0.19.5", + "@esbuild/darwin-x64": "0.19.5", + "@esbuild/freebsd-arm64": "0.19.5", + "@esbuild/freebsd-x64": "0.19.5", + "@esbuild/linux-arm": "0.19.5", + "@esbuild/linux-arm64": "0.19.5", + "@esbuild/linux-ia32": "0.19.5", + "@esbuild/linux-loong64": "0.19.5", + "@esbuild/linux-mips64el": "0.19.5", + "@esbuild/linux-ppc64": "0.19.5", + "@esbuild/linux-riscv64": "0.19.5", + "@esbuild/linux-s390x": "0.19.5", + "@esbuild/linux-x64": "0.19.5", + "@esbuild/netbsd-x64": "0.19.5", + "@esbuild/openbsd-x64": "0.19.5", + "@esbuild/sunos-x64": "0.19.5", + "@esbuild/win32-arm64": "0.19.5", + "@esbuild/win32-ia32": "0.19.5", + "@esbuild/win32-x64": "0.19.5" + } + }, + "node_modules/fable-metadata": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fable-metadata/-/fable-metadata-2.0.0.tgz", "integrity": "sha512-lCXoctKzvHnkKJAO/TKPV20IRJ4OHM/Zn0ADucA0yMJdK1BVILmslhUTgCp3LIRLXk1S1UQ3Pmmo6ZsFznFYRw==" }, - "fable-standalone": { - "version": "3.0.0-nagareyama-rc-008", - "resolved": "https://registry.npmjs.org/fable-standalone/-/fable-standalone-3.0.0-nagareyama-rc-008.tgz", - "integrity": "sha512-rTW5YNEdKaR1Z2q61upJfu47mIIqkPi9mRiBRSh6VLSQjwHGe32wM58B3f8PmpBnl6MA6k/kIUMtgZmJcHlBOg==" - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } + "node_modules/fable-standalone": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fable-standalone/-/fable-standalone-3.2.11.tgz", + "integrity": "sha512-RVwJX/kDcYgyp4ZhrPxvECLJN0HszxAKjW8CXW+tuP+Sh87MZBjRHAbzUwqSa8BNHYAHNPJIcqOYvI2VEzpVAg==" }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" + "node_modules/rollup": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.2.0.tgz", + "integrity": "sha512-deaMa9Z+jPVeBD2dKXv+h7EbdKte9++V2potc/ADqvVgEr6DEJ3ia9u0joarjC2lX/ubaCRYz3QVx0TzuVqAJA==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.2.0", + "@rollup/rollup-android-arm64": "4.2.0", + "@rollup/rollup-darwin-arm64": "4.2.0", + "@rollup/rollup-darwin-x64": "4.2.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.2.0", + "@rollup/rollup-linux-arm64-gnu": "4.2.0", + "@rollup/rollup-linux-arm64-musl": "4.2.0", + "@rollup/rollup-linux-x64-gnu": "4.2.0", + "@rollup/rollup-linux-x64-musl": "4.2.0", + "@rollup/rollup-win32-arm64-msvc": "4.2.0", + "@rollup/rollup-win32-ia32-msvc": "4.2.0", + "@rollup/rollup-win32-x64-msvc": "4.2.0", + "fsevents": "~2.3.2" } + } + }, + "dependencies": { + "@esbuild/android-arm": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.5.tgz", + "integrity": "sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz", + "integrity": "sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.5.tgz", + "integrity": "sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz", + "integrity": "sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz", + "integrity": "sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz", + "integrity": "sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz", + "integrity": "sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz", + "integrity": "sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz", + "integrity": "sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz", + "integrity": "sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz", + "integrity": "sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz", + "integrity": "sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz", + "integrity": "sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz", + "integrity": "sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz", + "integrity": "sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz", + "integrity": "sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==", + "dev": true, + "optional": true }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "@esbuild/netbsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz", + "integrity": "sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz", + "integrity": "sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz", + "integrity": "sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz", + "integrity": "sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz", + "integrity": "sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz", + "integrity": "sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-android-arm-eabi": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.2.0.tgz", + "integrity": "sha512-8PlggAxGxavr+pkCNeV1TM2wTb2o+cUWDg9M1cm9nR27Dsn287uZtSLYXoQqQcmq+sYfF7lHfd3sWJJinH9GmA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-android-arm64": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.2.0.tgz", + "integrity": "sha512-+71T85hbMFrJI+zKQULNmSYBeIhru55PYoF/u75MyeN2FcxE4HSPw20319b+FcZ4lWx2Nx/Ql9tN+hoaD3GH/A==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-arm64": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.2.0.tgz", + "integrity": "sha512-IIIQLuG43QIElT1JZqUP/zqIdiJl4t9U/boa0GZnQTw9m1X0k3mlBuysbgYXeloLT1RozdL7bgw4lpSaI8GOXw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-x64": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.2.0.tgz", + "integrity": "sha512-BXcXvnLaea1Xz900omrGJhxHFJfH9jZ0CpJuVsbjjhpniJ6qiLXz3xA8Lekaa4MuhFcJd4f0r+Ky1G4VFbYhWw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.2.0.tgz", + "integrity": "sha512-f4K3MKw9Y4AKi4ANGnmPIglr+S+8tO858YrGVuqAHXxJdVghBmz9CPU9kDpOnGvT4g4vg5uNyIFpOOFvffXyMA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-gnu": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.2.0.tgz", + "integrity": "sha512-bNsTYQBgp4H7w6cT7FZhesxpcUPahsSIy4NgdZjH1ZwEoZHxi4XKglj+CsSEkhsKi+x6toVvMylhjRKhEMYfnA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-musl": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.2.0.tgz", + "integrity": "sha512-Jp1NxBJpGLuxRU2ihrQk4IZ+ia5nffobG6sOFUPW5PMYkF0kQtxEbeDuCa69Xif211vUOcxlOnf5IOEIpTEySA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-gnu": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.2.0.tgz", + "integrity": "sha512-3p3iRtQmv2aXw+vtKNyZMLOQ+LSRsqArXjKAh2Oj9cqwfIRe7OXvdkOzWfZOIp1F/x5KJzVAxGxnniF4cMbnsQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-musl": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.2.0.tgz", + "integrity": "sha512-atih7IF/reUZe4LBLC5Izd44hth2tfDIG8LaPp4/cQXdHh9jabcZEvIeRPrpDq0i/Uu487Qu5gl5KwyAnWajnw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-arm64-msvc": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.2.0.tgz", + "integrity": "sha512-vYxF3tKJeUE4ceYzpNe2p84RXk/fGK30I8frpRfv/MyPStej/mRlojztkN7Jtd1014HHVeq/tYaMBz/3IxkxZw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-ia32-msvc": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.2.0.tgz", + "integrity": "sha512-1LZJ6zpl93SaPQvas618bMFarVwufWTaczH4ESAbFcwiC4OtznA6Ym+hFPyIGaJaGEB8uMWWac0uXGPXOg5FGA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-x64-msvc": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.2.0.tgz", + "integrity": "sha512-dgQfFdHCNg08nM5zBmqxqc9vrm0DVzhWotpavbPa0j4//MAOKZEB75yGAfzQE9fUJ+4pvM1239Y4IhL8f6sSog==", + "dev": true, + "optional": true + }, + "esbuild": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.5.tgz", + "integrity": "sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==", + "dev": true, "requires": { - "wrappy": "1" + "@esbuild/android-arm": "0.19.5", + "@esbuild/android-arm64": "0.19.5", + "@esbuild/android-x64": "0.19.5", + "@esbuild/darwin-arm64": "0.19.5", + "@esbuild/darwin-x64": "0.19.5", + "@esbuild/freebsd-arm64": "0.19.5", + "@esbuild/freebsd-x64": "0.19.5", + "@esbuild/linux-arm": "0.19.5", + "@esbuild/linux-arm64": "0.19.5", + "@esbuild/linux-ia32": "0.19.5", + "@esbuild/linux-loong64": "0.19.5", + "@esbuild/linux-mips64el": "0.19.5", + "@esbuild/linux-ppc64": "0.19.5", + "@esbuild/linux-riscv64": "0.19.5", + "@esbuild/linux-s390x": "0.19.5", + "@esbuild/linux-x64": "0.19.5", + "@esbuild/netbsd-x64": "0.19.5", + "@esbuild/openbsd-x64": "0.19.5", + "@esbuild/sunos-x64": "0.19.5", + "@esbuild/win32-arm64": "0.19.5", + "@esbuild/win32-ia32": "0.19.5", + "@esbuild/win32-x64": "0.19.5" } }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + "fable-metadata": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fable-metadata/-/fable-metadata-2.0.0.tgz", + "integrity": "sha512-lCXoctKzvHnkKJAO/TKPV20IRJ4OHM/Zn0ADucA0yMJdK1BVILmslhUTgCp3LIRLXk1S1UQ3Pmmo6ZsFznFYRw==" + }, + "fable-standalone": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fable-standalone/-/fable-standalone-3.2.11.tgz", + "integrity": "sha512-RVwJX/kDcYgyp4ZhrPxvECLJN0HszxAKjW8CXW+tuP+Sh87MZBjRHAbzUwqSa8BNHYAHNPJIcqOYvI2VEzpVAg==" }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "rollup": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.2.0.tgz", + "integrity": "sha512-deaMa9Z+jPVeBD2dKXv+h7EbdKte9++V2potc/ADqvVgEr6DEJ3ia9u0joarjC2lX/ubaCRYz3QVx0TzuVqAJA==", + "dev": true, + "requires": { + "@rollup/rollup-android-arm-eabi": "4.2.0", + "@rollup/rollup-android-arm64": "4.2.0", + "@rollup/rollup-darwin-arm64": "4.2.0", + "@rollup/rollup-darwin-x64": "4.2.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.2.0", + "@rollup/rollup-linux-arm64-gnu": "4.2.0", + "@rollup/rollup-linux-arm64-musl": "4.2.0", + "@rollup/rollup-linux-x64-gnu": "4.2.0", + "@rollup/rollup-linux-x64-musl": "4.2.0", + "@rollup/rollup-win32-arm64-msvc": "4.2.0", + "@rollup/rollup-win32-ia32-msvc": "4.2.0", + "@rollup/rollup-win32-x64-msvc": "4.2.0", + "fsevents": "~2.3.2" + } } } } diff --git a/src/fable-compiler-js/package.json b/src/fable-compiler-js/package.json index f55de05f6d..50b10bad22 100644 --- a/src/fable-compiler-js/package.json +++ b/src/fable-compiler-js/package.json @@ -25,5 +25,9 @@ "dependencies": { "fable-metadata": "^2.0.0", "fable-standalone": "^3.0.0" + }, + "devDependencies": { + "esbuild": "^0.19.5", + "rollup": "^4.2.0" } } diff --git a/src/fable-compiler-js/src/util.js b/src/fable-compiler-js/src/util.js index 0ed9f93104..bde0c51f76 100644 --- a/src/fable-compiler-js/src/util.js +++ b/src/fable-compiler-js/src/util.js @@ -1,11 +1,16 @@ import * as fs from "fs"; import * as Path from "path"; +import child_process from "child_process"; +import { createRequire } from 'node:module'; export function getVersion() { - return require("../package.json").version; + const pkg = JSON.parse(fs.readFileSync(new URL('./../package.json', import.meta.url))); + + return pkg.version; } export function getFableLibDir() { + const require = createRequire(import.meta.url); return Path.join(Path.dirname(require.resolve("fable-standalone")), "fable-library"); } @@ -56,7 +61,6 @@ export function copyFolder(from, dest) { } export function runCmdAndExitIfFails(cmd) { - var child_process = require("child_process"); console.log(">", cmd); try { child_process.execSync(cmd, { @@ -65,4 +69,4 @@ export function runCmdAndExitIfFails(cmd) { } catch (error) { process.exit(-1); } -} \ No newline at end of file +} diff --git a/src/fable-metadata/index.js b/src/fable-metadata/index.js index 89ad483cb2..4a28402fb2 100644 --- a/src/fable-metadata/index.js +++ b/src/fable-metadata/index.js @@ -1,8 +1,10 @@ // This file is just a reference to locate the `lib` directory -// path.join(path.dirname(require.resolve("fable-metadata")), "lib") +import { dirname } from 'dirname-filename-esm'; +import path from 'path'; -exports.getAssembliesDir = function () { - const path = require("path"); - return path.join(__dirname, "lib"); -} \ No newline at end of file +const currentFileDir = dirname(import.meta); + +export function getAssembliesDir () { + return path.join(currentFileDir, "lib"); +} diff --git a/src/fable-metadata/package-lock.json b/src/fable-metadata/package-lock.json index 893a6863f1..74d8e20bad 100644 --- a/src/fable-metadata/package-lock.json +++ b/src/fable-metadata/package-lock.json @@ -1,5 +1,30 @@ { "name": "fable-metadata", "version": "2.0.0", - "lockfileVersion": 1 + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "fable-metadata", + "version": "2.0.0", + "license": "MIT", + "devDependencies": { + "dirname-filename-esm": "^1.1.1" + } + }, + "node_modules/dirname-filename-esm": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/dirname-filename-esm/-/dirname-filename-esm-1.1.1.tgz", + "integrity": "sha512-BWBkv157Cf/z7Hjod2v2JS7vyC36Dk1QQolAtuLjpl8RBlv7Z92X7+Ufc2cjfR/B3iJUiK0QmGZkgtsmmLz0Tw==", + "dev": true + } + }, + "dependencies": { + "dirname-filename-esm": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/dirname-filename-esm/-/dirname-filename-esm-1.1.1.tgz", + "integrity": "sha512-BWBkv157Cf/z7Hjod2v2JS7vyC36Dk1QQolAtuLjpl8RBlv7Z92X7+Ufc2cjfR/B3iJUiK0QmGZkgtsmmLz0Tw==", + "dev": true + } + } } diff --git a/src/fable-metadata/package.json b/src/fable-metadata/package.json index e3d3477a67..6a31df606b 100644 --- a/src/fable-metadata/package.json +++ b/src/fable-metadata/package.json @@ -3,6 +3,7 @@ "version": "2.0.0", "description": "Assemblies needed to compile F# projects with Fable", "main": "index.js", + "type": "module", "directories": { "lib": "lib" }, @@ -15,5 +16,8 @@ "F#" ], "author": ".NET Foundation and Contributors", - "license": "MIT" + "license": "MIT", + "devDependencies": { + "dirname-filename-esm": "^1.1.1" + } } diff --git a/src/fable-standalone/.gitignore b/src/fable-standalone/.gitignore index 77085c65c9..3c031765b2 100644 --- a/src/fable-standalone/.gitignore +++ b/src/fable-standalone/.gitignore @@ -3,3 +3,5 @@ out*/ dist/ perf*.data perf*.svg +build/ +dist/ diff --git a/src/fable-standalone/.npmignore b/src/fable-standalone/.npmignore index 9848fdd0fe..498e63c920 100644 --- a/src/fable-standalone/.npmignore +++ b/src/fable-standalone/.npmignore @@ -1,4 +1,5 @@ # Override .gitignore to include the `dist` folder test/ src/**/bin/ -src/**/obj/ \ No newline at end of file +src/**/obj/ +temp/ diff --git a/src/fable-standalone/CHANGELOG.md b/src/fable-standalone/CHANGELOG.md index 7777a10b3e..96967845a8 100644 --- a/src/fable-standalone/CHANGELOG.md +++ b/src/fable-standalone/CHANGELOG.md @@ -6,6 +6,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +## 3.3.0 - 2023-11-10 + +### Changed + +* Use ESM syntax but still publish to UMD + +### Removed + * Remove `--typescript` options support, use `--lang ` instead ## 3.2.11 diff --git a/src/fable-standalone/package-lock.json b/src/fable-standalone/package-lock.json index 4ae5901920..dda1b75fa6 100644 --- a/src/fable-standalone/package-lock.json +++ b/src/fable-standalone/package-lock.json @@ -1,5 +1,902 @@ { "name": "fable-standalone", "version": "3.2.11", - "lockfileVersion": 1 + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "fable-standalone", + "version": "3.2.11", + "license": "MIT", + "devDependencies": { + "esbuild": "^0.19.5", + "rollup": "^4.1.5" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.5.tgz", + "integrity": "sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz", + "integrity": "sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.5.tgz", + "integrity": "sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz", + "integrity": "sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz", + "integrity": "sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz", + "integrity": "sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz", + "integrity": "sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz", + "integrity": "sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz", + "integrity": "sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz", + "integrity": "sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz", + "integrity": "sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz", + "integrity": "sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz", + "integrity": "sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz", + "integrity": "sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz", + "integrity": "sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz", + "integrity": "sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz", + "integrity": "sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz", + "integrity": "sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz", + "integrity": "sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz", + "integrity": "sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz", + "integrity": "sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz", + "integrity": "sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.1.5.tgz", + "integrity": "sha512-/fwx6GS8cIbM2rTNyLMxjSCOegHywOdXO+kN9yFy018iCULcKZCyA3xvzw4bxyKbYfdSxQgdhbsl0egNcxerQw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.1.5.tgz", + "integrity": "sha512-tmXh7dyEt+JEz/NgDJlB1UeL/1gFV0v8qYzUAU42WZH4lmUJ5rp6/HkR2qUNC5jCgYEwd8/EfbHKtGIEfS4CUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.1.5.tgz", + "integrity": "sha512-lTDmLxdEVhzI3KCesZUrNbl3icBvPrDv/85JasY5gh4P2eAuDFmM4uj9HC5DdH0anLC0fwJ+1Uzasr4qOXcjRQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.1.5.tgz", + "integrity": "sha512-v6qEHZyjWnIgcc4oiy8AIeFsUJAx+Kg0sLj+RE7ICwv3u7YC/+bSClxAiBASRjMzqsq0Z+I/pfxj+OD8mjBYxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.1.5.tgz", + "integrity": "sha512-WngCfwPEDUNbZR1FNO2TCROYUwJvRlbvPi3AS85bDUkkoRDBcjUIz42cuB1j4PKilmnZascL5xTMF/yU8YFayA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.1.5.tgz", + "integrity": "sha512-Q2A/PEP/UTPTOBwgar3mmCaApahoezai/8e/7f4GCLV6XWCpnU4YwkQQtla7d7nUnc792Ps7g1G0WMovzIknrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.1.5.tgz", + "integrity": "sha512-84aBKNAVzTU/eG3tb2+kR4NGRAtm2YVW/KHwkGGDR4z1k4hyrDbuImsfs/6J74t6y0YLOe9HOSu7ejRjzUBGVQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.1.5.tgz", + "integrity": "sha512-mldtP9UEBurIq2+GYMdNeiqCLW1fdgf4KdkMR/QegAeXk4jFHkKQl7p0NITrKFVyVqzISGXH5gR6GSTBH4wszw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.1.5.tgz", + "integrity": "sha512-36p+nMcSxjAEzfU47+by102HolUtf/EfgBAidocTKAofJMTqG5QD50qzaFLk4QO+z7Qvg4qd0wr99jGAwnKOig==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.1.5.tgz", + "integrity": "sha512-5oxhubo0A3J8aF/tG+6jHBg785HF8/88kl1YnfbDKmnqMxz/EFiAQDH9cq6lbnxofjn8tlq5KiTf0crJGOGThg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.1.5.tgz", + "integrity": "sha512-uVQyBREKX9ErofL8KAZ4iVlqzSZOXSIG+BOLYuz5FD+Cg6jh1eLIeUa3Q4SgX0QaTRFeeAgSNqCC+8kZrZBpSw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.1.5.tgz", + "integrity": "sha512-FQ5qYqRJ2vUBSom3Fos8o/6UvAMOvlus4+HGCAifH1TagbbwVnVVe0o01J1V52EWnQ8kmfpJDJ0FMrfM5yzcSA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/esbuild": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.5.tgz", + "integrity": "sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.19.5", + "@esbuild/android-arm64": "0.19.5", + "@esbuild/android-x64": "0.19.5", + "@esbuild/darwin-arm64": "0.19.5", + "@esbuild/darwin-x64": "0.19.5", + "@esbuild/freebsd-arm64": "0.19.5", + "@esbuild/freebsd-x64": "0.19.5", + "@esbuild/linux-arm": "0.19.5", + "@esbuild/linux-arm64": "0.19.5", + "@esbuild/linux-ia32": "0.19.5", + "@esbuild/linux-loong64": "0.19.5", + "@esbuild/linux-mips64el": "0.19.5", + "@esbuild/linux-ppc64": "0.19.5", + "@esbuild/linux-riscv64": "0.19.5", + "@esbuild/linux-s390x": "0.19.5", + "@esbuild/linux-x64": "0.19.5", + "@esbuild/netbsd-x64": "0.19.5", + "@esbuild/openbsd-x64": "0.19.5", + "@esbuild/sunos-x64": "0.19.5", + "@esbuild/win32-arm64": "0.19.5", + "@esbuild/win32-ia32": "0.19.5", + "@esbuild/win32-x64": "0.19.5" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/rollup": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.1.5.tgz", + "integrity": "sha512-AEw14/q4NHYQkQlngoSae2yi7hDBeT9w84aEzdgCr39+2RL+iTG84lGTkgC1Wp5igtquN64cNzuzZKVz+U6jOg==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.1.5", + "@rollup/rollup-android-arm64": "4.1.5", + "@rollup/rollup-darwin-arm64": "4.1.5", + "@rollup/rollup-darwin-x64": "4.1.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.1.5", + "@rollup/rollup-linux-arm64-gnu": "4.1.5", + "@rollup/rollup-linux-arm64-musl": "4.1.5", + "@rollup/rollup-linux-x64-gnu": "4.1.5", + "@rollup/rollup-linux-x64-musl": "4.1.5", + "@rollup/rollup-win32-arm64-msvc": "4.1.5", + "@rollup/rollup-win32-ia32-msvc": "4.1.5", + "@rollup/rollup-win32-x64-msvc": "4.1.5", + "fsevents": "~2.3.2" + } + } + }, + "dependencies": { + "@esbuild/android-arm": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.5.tgz", + "integrity": "sha512-bhvbzWFF3CwMs5tbjf3ObfGqbl/17ict2/uwOSfr3wmxDE6VdS2GqY/FuzIPe0q0bdhj65zQsvqfArI9MY6+AA==", + "dev": true, + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.5.tgz", + "integrity": "sha512-5d1OkoJxnYQfmC+Zd8NBFjkhyCNYwM4n9ODrycTFY6Jk1IGiZ+tjVJDDSwDt77nK+tfpGP4T50iMtVi4dEGzhQ==", + "dev": true, + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.5.tgz", + "integrity": "sha512-9t+28jHGL7uBdkBjL90QFxe7DVA+KGqWlHCF8ChTKyaKO//VLuoBricQCgwhOjA1/qOczsw843Fy4cbs4H3DVA==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.5.tgz", + "integrity": "sha512-mvXGcKqqIqyKoxq26qEDPHJuBYUA5KizJncKOAf9eJQez+L9O+KfvNFu6nl7SCZ/gFb2QPaRqqmG0doSWlgkqw==", + "dev": true, + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.5.tgz", + "integrity": "sha512-Ly8cn6fGLNet19s0X4unjcniX24I0RqjPv+kurpXabZYSXGM4Pwpmf85WHJN3lAgB8GSth7s5A0r856S+4DyiA==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.5.tgz", + "integrity": "sha512-GGDNnPWTmWE+DMchq1W8Sd0mUkL+APvJg3b11klSGUDvRXh70JqLAO56tubmq1s2cgpVCSKYywEiKBfju8JztQ==", + "dev": true, + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.5.tgz", + "integrity": "sha512-1CCwDHnSSoA0HNwdfoNY0jLfJpd7ygaLAp5EHFos3VWJCRX9DMwWODf96s9TSse39Br7oOTLryRVmBoFwXbuuQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.5.tgz", + "integrity": "sha512-lrWXLY/vJBzCPC51QN0HM71uWgIEpGSjSZZADQhq7DKhPcI6NH1IdzjfHkDQws2oNpJKpR13kv7/pFHBbDQDwQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.5.tgz", + "integrity": "sha512-o3vYippBmSrjjQUCEEiTZ2l+4yC0pVJD/Dl57WfPwwlvFkrxoSO7rmBZFii6kQB3Wrn/6GwJUPLU5t52eq2meA==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.5.tgz", + "integrity": "sha512-MkjHXS03AXAkNp1KKkhSKPOCYztRtK+KXDNkBa6P78F8Bw0ynknCSClO/ztGszILZtyO/lVKpa7MolbBZ6oJtQ==", + "dev": true, + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.5.tgz", + "integrity": "sha512-42GwZMm5oYOD/JHqHska3Jg0r+XFb/fdZRX+WjADm3nLWLcIsN27YKtqxzQmGNJgu0AyXg4HtcSK9HuOk3v1Dw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.5.tgz", + "integrity": "sha512-kcjndCSMitUuPJobWCnwQ9lLjiLZUR3QLQmlgaBfMX23UEa7ZOrtufnRds+6WZtIS9HdTXqND4yH8NLoVVIkcg==", + "dev": true, + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.5.tgz", + "integrity": "sha512-yJAxJfHVm0ZbsiljbtFFP1BQKLc8kUF6+17tjQ78QjqjAQDnhULWiTA6u0FCDmYT1oOKS9PzZ2z0aBI+Mcyj7Q==", + "dev": true, + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.5.tgz", + "integrity": "sha512-5u8cIR/t3gaD6ad3wNt1MNRstAZO+aNyBxu2We8X31bA8XUNyamTVQwLDA1SLoPCUehNCymhBhK3Qim1433Zag==", + "dev": true, + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.5.tgz", + "integrity": "sha512-Z6JrMyEw/EmZBD/OFEFpb+gao9xJ59ATsoTNlj39jVBbXqoZm4Xntu6wVmGPB/OATi1uk/DB+yeDPv2E8PqZGw==", + "dev": true, + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.5.tgz", + "integrity": "sha512-psagl+2RlK1z8zWZOmVdImisMtrUxvwereIdyJTmtmHahJTKb64pAcqoPlx6CewPdvGvUKe2Jw+0Z/0qhSbG1A==", + "dev": true, + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.5.tgz", + "integrity": "sha512-kL2l+xScnAy/E/3119OggX8SrWyBEcqAh8aOY1gr4gPvw76la2GlD4Ymf832UCVbmuWeTf2adkZDK+h0Z/fB4g==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.5.tgz", + "integrity": "sha512-sPOfhtzFufQfTBgRnE1DIJjzsXukKSvZxloZbkJDG383q0awVAq600pc1nfqBcl0ice/WN9p4qLc39WhBShRTA==", + "dev": true, + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.5.tgz", + "integrity": "sha512-dGZkBXaafuKLpDSjKcB0ax0FL36YXCvJNnztjKV+6CO82tTYVDSH2lifitJ29jxRMoUhgkg9a+VA/B03WK5lcg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.5.tgz", + "integrity": "sha512-dWVjD9y03ilhdRQ6Xig1NWNgfLtf2o/STKTS+eZuF90fI2BhbwD6WlaiCGKptlqXlURVB5AUOxUj09LuwKGDTg==", + "dev": true, + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.5.tgz", + "integrity": "sha512-4liggWIA4oDgUxqpZwrDhmEfAH4d0iljanDOK7AnVU89T6CzHon/ony8C5LeOdfgx60x5cnQJFZwEydVlYx4iw==", + "dev": true, + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.5.tgz", + "integrity": "sha512-czTrygUsB/jlM8qEW5MD8bgYU2Xg14lo6kBDXW6HdxKjh8M5PzETGiSHaz9MtbXBYDloHNUAUW2tMiKW4KM9Mw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-android-arm-eabi": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.1.5.tgz", + "integrity": "sha512-/fwx6GS8cIbM2rTNyLMxjSCOegHywOdXO+kN9yFy018iCULcKZCyA3xvzw4bxyKbYfdSxQgdhbsl0egNcxerQw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-android-arm64": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.1.5.tgz", + "integrity": "sha512-tmXh7dyEt+JEz/NgDJlB1UeL/1gFV0v8qYzUAU42WZH4lmUJ5rp6/HkR2qUNC5jCgYEwd8/EfbHKtGIEfS4CUg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-arm64": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.1.5.tgz", + "integrity": "sha512-lTDmLxdEVhzI3KCesZUrNbl3icBvPrDv/85JasY5gh4P2eAuDFmM4uj9HC5DdH0anLC0fwJ+1Uzasr4qOXcjRQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-darwin-x64": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.1.5.tgz", + "integrity": "sha512-v6qEHZyjWnIgcc4oiy8AIeFsUJAx+Kg0sLj+RE7ICwv3u7YC/+bSClxAiBASRjMzqsq0Z+I/pfxj+OD8mjBYxg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.1.5.tgz", + "integrity": "sha512-WngCfwPEDUNbZR1FNO2TCROYUwJvRlbvPi3AS85bDUkkoRDBcjUIz42cuB1j4PKilmnZascL5xTMF/yU8YFayA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-gnu": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.1.5.tgz", + "integrity": "sha512-Q2A/PEP/UTPTOBwgar3mmCaApahoezai/8e/7f4GCLV6XWCpnU4YwkQQtla7d7nUnc792Ps7g1G0WMovzIknrA==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-arm64-musl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.1.5.tgz", + "integrity": "sha512-84aBKNAVzTU/eG3tb2+kR4NGRAtm2YVW/KHwkGGDR4z1k4hyrDbuImsfs/6J74t6y0YLOe9HOSu7ejRjzUBGVQ==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-gnu": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.1.5.tgz", + "integrity": "sha512-mldtP9UEBurIq2+GYMdNeiqCLW1fdgf4KdkMR/QegAeXk4jFHkKQl7p0NITrKFVyVqzISGXH5gR6GSTBH4wszw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-linux-x64-musl": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.1.5.tgz", + "integrity": "sha512-36p+nMcSxjAEzfU47+by102HolUtf/EfgBAidocTKAofJMTqG5QD50qzaFLk4QO+z7Qvg4qd0wr99jGAwnKOig==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-arm64-msvc": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.1.5.tgz", + "integrity": "sha512-5oxhubo0A3J8aF/tG+6jHBg785HF8/88kl1YnfbDKmnqMxz/EFiAQDH9cq6lbnxofjn8tlq5KiTf0crJGOGThg==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-ia32-msvc": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.1.5.tgz", + "integrity": "sha512-uVQyBREKX9ErofL8KAZ4iVlqzSZOXSIG+BOLYuz5FD+Cg6jh1eLIeUa3Q4SgX0QaTRFeeAgSNqCC+8kZrZBpSw==", + "dev": true, + "optional": true + }, + "@rollup/rollup-win32-x64-msvc": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.1.5.tgz", + "integrity": "sha512-FQ5qYqRJ2vUBSom3Fos8o/6UvAMOvlus4+HGCAifH1TagbbwVnVVe0o01J1V52EWnQ8kmfpJDJ0FMrfM5yzcSA==", + "dev": true, + "optional": true + }, + "esbuild": { + "version": "0.19.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.5.tgz", + "integrity": "sha512-bUxalY7b1g8vNhQKdB24QDmHeY4V4tw/s6Ak5z+jJX9laP5MoQseTOMemAr0gxssjNcH0MCViG8ONI2kksvfFQ==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.19.5", + "@esbuild/android-arm64": "0.19.5", + "@esbuild/android-x64": "0.19.5", + "@esbuild/darwin-arm64": "0.19.5", + "@esbuild/darwin-x64": "0.19.5", + "@esbuild/freebsd-arm64": "0.19.5", + "@esbuild/freebsd-x64": "0.19.5", + "@esbuild/linux-arm": "0.19.5", + "@esbuild/linux-arm64": "0.19.5", + "@esbuild/linux-ia32": "0.19.5", + "@esbuild/linux-loong64": "0.19.5", + "@esbuild/linux-mips64el": "0.19.5", + "@esbuild/linux-ppc64": "0.19.5", + "@esbuild/linux-riscv64": "0.19.5", + "@esbuild/linux-s390x": "0.19.5", + "@esbuild/linux-x64": "0.19.5", + "@esbuild/netbsd-x64": "0.19.5", + "@esbuild/openbsd-x64": "0.19.5", + "@esbuild/sunos-x64": "0.19.5", + "@esbuild/win32-arm64": "0.19.5", + "@esbuild/win32-ia32": "0.19.5", + "@esbuild/win32-x64": "0.19.5" + } + }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, + "rollup": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.1.5.tgz", + "integrity": "sha512-AEw14/q4NHYQkQlngoSae2yi7hDBeT9w84aEzdgCr39+2RL+iTG84lGTkgC1Wp5igtquN64cNzuzZKVz+U6jOg==", + "dev": true, + "requires": { + "@rollup/rollup-android-arm-eabi": "4.1.5", + "@rollup/rollup-android-arm64": "4.1.5", + "@rollup/rollup-darwin-arm64": "4.1.5", + "@rollup/rollup-darwin-x64": "4.1.5", + "@rollup/rollup-linux-arm-gnueabihf": "4.1.5", + "@rollup/rollup-linux-arm64-gnu": "4.1.5", + "@rollup/rollup-linux-arm64-musl": "4.1.5", + "@rollup/rollup-linux-x64-gnu": "4.1.5", + "@rollup/rollup-linux-x64-musl": "4.1.5", + "@rollup/rollup-win32-arm64-msvc": "4.1.5", + "@rollup/rollup-win32-ia32-msvc": "4.1.5", + "@rollup/rollup-win32-x64-msvc": "4.1.5", + "fsevents": "~2.3.2" + } + } + } } diff --git a/src/fable-standalone/package.json b/src/fable-standalone/package.json index 54ec14215a..f848996ea8 100644 --- a/src/fable-standalone/package.json +++ b/src/fable-standalone/package.json @@ -2,7 +2,7 @@ "type": "module", "name": "fable-standalone", "version": "3.2.11", - "main": "dist/bundle.min.js", + "main": "./dist/bundle.min.js", "description": "Fable compiler", "keywords": [ "fable", @@ -18,5 +18,9 @@ "bugs": { "url": "https://github.com/fable-compiler/Fable/issues" }, - "homepage": "https://github.com/fable-compiler/Fable#readme" + "homepage": "https://github.com/fable-compiler/Fable#readme", + "devDependencies": { + "esbuild": "^0.19.5", + "rollup": "^4.1.5" + } } diff --git a/src/quicktest/QuickTest.fs b/src/quicktest/QuickTest.fs index 9d5fcc047f..4c483eab14 100644 --- a/src/quicktest/QuickTest.fs +++ b/src/quicktest/QuickTest.fs @@ -74,6 +74,8 @@ let measureTime (f: unit -> unit): unit = emitJsStatement () """ //!js """ +printfn "Running quick tests..." + // Write here your unit test, you can later move it // to Fable.Tests project. For example: // testCase "Addition works" <| fun () ->