From b147e83d3c1804c41e38263a47ef32388f354b32 Mon Sep 17 00:00:00 2001 From: Filip Tibell Date: Thu, 24 Apr 2025 19:49:20 +0200 Subject: [PATCH] Bundle each typedefs file with its respective lune-std crate to fix publishing and cargo-binstall issues --- .justfile | 6 +-- Cargo.lock | 27 ----------- crates/lune-std-datetime/src/lib.rs | 10 +++++ .../lune-std-datetime/types.d.luau | 6 +-- crates/lune-std-fs/src/lib.rs | 10 +++++ .../lune-std-fs/types.d.luau | 4 +- crates/lune-std-luau/src/lib.rs | 10 +++++ .../lune-std-luau/types.d.luau | 0 crates/lune-std-net/src/lib.rs | 10 +++++ .../lune-std-net/types.d.luau | 0 crates/lune-std-process/src/lib.rs | 10 +++++ .../lune-std-process/types.d.luau | 0 crates/lune-std-regex/src/lib.rs | 10 +++++ .../lune-std-regex/types.d.luau | 0 crates/lune-std-roblox/src/lib.rs | 10 +++++ .../lune-std-roblox/types.d.luau | 11 +---- crates/lune-std-serde/src/lib.rs | 10 +++++ .../lune-std-serde/types.d.luau | 12 +---- crates/lune-std-stdio/src/lib.rs | 10 +++++ .../lune-std-stdio/types.d.luau | 11 +---- crates/lune-std-task/src/lib.rs | 10 +++++ .../lune-std-task/types.d.luau | 6 +-- crates/lune-std/src/library.rs | 25 ++++++++++- crates/lune/Cargo.toml | 3 +- crates/lune/src/cli/setup.rs | 45 +++++-------------- 25 files changed, 148 insertions(+), 108 deletions(-) rename types/datetime.luau => crates/lune-std-datetime/types.d.luau (99%) rename types/fs.luau => crates/lune-std-fs/types.d.luau (99%) rename types/luau.luau => crates/lune-std-luau/types.d.luau (100%) rename types/net.luau => crates/lune-std-net/types.d.luau (100%) rename types/process.luau => crates/lune-std-process/types.d.luau (100%) rename types/regex.luau => crates/lune-std-regex/types.d.luau (100%) rename types/roblox.luau => crates/lune-std-roblox/types.d.luau (98%) rename types/serde.luau => crates/lune-std-serde/types.d.luau (95%) rename types/stdio.luau => crates/lune-std-stdio/types.d.luau (97%) rename types/task.luau => crates/lune-std-task/types.d.luau (94%) diff --git a/.justfile b/.justfile index 60e91e8..a3752ca 100644 --- a/.justfile +++ b/.justfile @@ -45,7 +45,7 @@ test-bin *ARGS: fmt: #!/usr/bin/env bash set -euo pipefail - stylua .lune scripts tests types \ + stylua .lune crates scripts tests \ --glob "tests/**/*.luau" \ --glob "!tests/roblox/rbx-test-files/**" cargo fmt @@ -55,7 +55,7 @@ fmt: fmt-check: #!/usr/bin/env bash set -euo pipefail - stylua .lune scripts tests types \ + stylua .lune crates scripts tests \ --glob "tests/**/*.luau" \ --glob "!tests/roblox/rbx-test-files/**" cargo fmt --check @@ -68,7 +68,7 @@ analyze: luau-lsp analyze \ --settings=".vscode/settings.json" \ --ignore="tests/roblox/rbx-test-files/**" \ - .lune scripts tests types + .lune crates scripts tests # Zips up the built binary into a single zip file [no-exit-message] diff --git a/Cargo.lock b/Cargo.lock index 3e1eb86..1fd2c42 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1133,12 +1133,6 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e05e7e6723e3455f4818c7b26e855439f7546cf617ef669d1adedb8669e5cb9" -[[package]] -name = "glob" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" - [[package]] name = "h2" version = "0.3.26" @@ -1413,26 +1407,6 @@ dependencies = [ "unicode-normalization", ] -[[package]] -name = "include_dir" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "923d117408f1e49d914f1a379a309cffe4f18c05cf4e3d12e613a15fc81bd0dd" -dependencies = [ - "glob", - "include_dir_macros", -] - -[[package]] -name = "include_dir_macros" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cab85a7ed0bd5f0e76d93846e0147172bed2e2d3f859bcc33a8d9699cad1a75" -dependencies = [ - "proc-macro2", - "quote", -] - [[package]] name = "indexmap" version = "2.6.0" @@ -1599,7 +1573,6 @@ dependencies = [ "dialoguer", "directories", "futures-util", - "include_dir", "lune-roblox", "lune-std", "lune-utils", diff --git a/crates/lune-std-datetime/src/lib.rs b/crates/lune-std-datetime/src/lib.rs index 76337ce..d5a88cc 100644 --- a/crates/lune-std-datetime/src/lib.rs +++ b/crates/lune-std-datetime/src/lib.rs @@ -10,6 +10,16 @@ mod values; pub use self::date_time::DateTime; +const TYPEDEFS: &str = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/types.d.luau")); + +/** + Returns a string containing type definitions for the `datetime` standard library. +*/ +#[must_use] +pub fn typedefs() -> String { + TYPEDEFS.to_string() +} + /** Creates the `datetime` standard library module. diff --git a/types/datetime.luau b/crates/lune-std-datetime/types.d.luau similarity index 99% rename from types/datetime.luau rename to crates/lune-std-datetime/types.d.luau index 61e61cf..4013e2c 100644 --- a/types/datetime.luau +++ b/crates/lune-std-datetime/types.d.luau @@ -163,11 +163,7 @@ end @param locale -- The locale the time should be formatted in @return string -- The formatting string ]=] -function DateTime.formatUniversalTime( - self: DateTime, - formatString: string?, - locale: Locale? -): string +function DateTime.formatUniversalTime(self: DateTime, formatString: string?, locale: Locale?): string return nil :: any end diff --git a/crates/lune-std-fs/src/lib.rs b/crates/lune-std-fs/src/lib.rs index 27e4b89..88c8cf7 100755 --- a/crates/lune-std-fs/src/lib.rs +++ b/crates/lune-std-fs/src/lib.rs @@ -17,6 +17,16 @@ use self::copy::copy; use self::metadata::FsMetadata; use self::options::FsWriteOptions; +const TYPEDEFS: &str = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/types.d.luau")); + +/** + Returns a string containing type definitions for the `fs` standard library. +*/ +#[must_use] +pub fn typedefs() -> String { + TYPEDEFS.to_string() +} + /** Creates the `fs` standard library module. diff --git a/types/fs.luau b/crates/lune-std-fs/types.d.luau similarity index 99% rename from types/fs.luau rename to crates/lune-std-fs/types.d.luau index 823f6f7..e9c6208 100644 --- a/types/fs.luau +++ b/crates/lune-std-fs/types.d.luau @@ -1,4 +1,6 @@ -local DateTime = require("./datetime") +--!nocheck + +local DateTime = require("@lune/datetime") type DateTime = DateTime.DateTime export type MetadataKind = "file" | "dir" | "symlink" diff --git a/crates/lune-std-luau/src/lib.rs b/crates/lune-std-luau/src/lib.rs index 5ddf65c..035cfa3 100644 --- a/crates/lune-std-luau/src/lib.rs +++ b/crates/lune-std-luau/src/lib.rs @@ -8,6 +8,16 @@ mod options; use self::options::{LuauCompileOptions, LuauLoadOptions}; +const TYPEDEFS: &str = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/types.d.luau")); + +/** + Returns a string containing type definitions for the `luau` standard library. +*/ +#[must_use] +pub fn typedefs() -> String { + TYPEDEFS.to_string() +} + /** Creates the `luau` standard library module. diff --git a/types/luau.luau b/crates/lune-std-luau/types.d.luau similarity index 100% rename from types/luau.luau rename to crates/lune-std-luau/types.d.luau diff --git a/crates/lune-std-net/src/lib.rs b/crates/lune-std-net/src/lib.rs index e17ff13..0d43b40 100644 --- a/crates/lune-std-net/src/lib.rs +++ b/crates/lune-std-net/src/lib.rs @@ -22,6 +22,16 @@ use self::{ use lune_std_serde::{decode, encode, EncodeDecodeConfig, EncodeDecodeFormat}; +const TYPEDEFS: &str = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/types.d.luau")); + +/** + Returns a string containing type definitions for the `net` standard library. +*/ +#[must_use] +pub fn typedefs() -> String { + TYPEDEFS.to_string() +} + /** Creates the `net` standard library module. diff --git a/types/net.luau b/crates/lune-std-net/types.d.luau similarity index 100% rename from types/net.luau rename to crates/lune-std-net/types.d.luau diff --git a/crates/lune-std-process/src/lib.rs b/crates/lune-std-process/src/lib.rs index 09e86dd..d1564e2 100644 --- a/crates/lune-std-process/src/lib.rs +++ b/crates/lune-std-process/src/lib.rs @@ -22,6 +22,16 @@ mod options; use self::options::ProcessSpawnOptions; +const TYPEDEFS: &str = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/types.d.luau")); + +/** + Returns a string containing type definitions for the `process` standard library. +*/ +#[must_use] +pub fn typedefs() -> String { + TYPEDEFS.to_string() +} + /** Creates the `process` standard library module. diff --git a/types/process.luau b/crates/lune-std-process/types.d.luau similarity index 100% rename from types/process.luau rename to crates/lune-std-process/types.d.luau diff --git a/crates/lune-std-regex/src/lib.rs b/crates/lune-std-regex/src/lib.rs index 9697e37..699e006 100644 --- a/crates/lune-std-regex/src/lib.rs +++ b/crates/lune-std-regex/src/lib.rs @@ -10,6 +10,16 @@ mod regex; use self::regex::LuaRegex; +const TYPEDEFS: &str = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/types.d.luau")); + +/** + Returns a string containing type definitions for the `regex` standard library. +*/ +#[must_use] +pub fn typedefs() -> String { + TYPEDEFS.to_string() +} + /** Creates the `regex` standard library module. diff --git a/types/regex.luau b/crates/lune-std-regex/types.d.luau similarity index 100% rename from types/regex.luau rename to crates/lune-std-regex/types.d.luau diff --git a/crates/lune-std-roblox/src/lib.rs b/crates/lune-std-roblox/src/lib.rs index 829905e..eaf645f 100644 --- a/crates/lune-std-roblox/src/lib.rs +++ b/crates/lune-std-roblox/src/lib.rs @@ -16,6 +16,16 @@ static REFLECTION_DATABASE: OnceLock = OnceLock::new(); use lune_utils::TableBuilder; use roblox_install::RobloxStudio; +const TYPEDEFS: &str = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/types.d.luau")); + +/** + Returns a string containing type definitions for the `roblox` standard library. +*/ +#[must_use] +pub fn typedefs() -> String { + TYPEDEFS.to_string() +} + /** Creates the `roblox` standard library module. diff --git a/types/roblox.luau b/crates/lune-std-roblox/types.d.luau similarity index 98% rename from types/roblox.luau rename to crates/lune-std-roblox/types.d.luau index 4428598..0011be1 100644 --- a/types/roblox.luau +++ b/crates/lune-std-roblox/types.d.luau @@ -183,10 +183,7 @@ export type DataModelMetatable = { export type DataModel = Instance - & typeof(setmetatable( - (nil :: any) :: DataModelProperties, - (nil :: any) :: { __index: DataModelMetatable } - )) + & typeof(setmetatable((nil :: any) :: DataModelProperties, (nil :: any) :: { __index: DataModelMetatable })) --[=[ @class Roblox @@ -491,11 +488,7 @@ end @param methodName The name of the method to implement. @param callback The function which will be called when the method is called. ]=] -function roblox.implementMethod( - className: string, - methodName: string, - callback: (instance: Instance, ...any) -> ...any -) +function roblox.implementMethod(className: string, methodName: string, callback: (instance: Instance, ...any) -> ...any) return nil :: any end diff --git a/crates/lune-std-serde/src/lib.rs b/crates/lune-std-serde/src/lib.rs index 4f02dda..b01fb0f 100644 --- a/crates/lune-std-serde/src/lib.rs +++ b/crates/lune-std-serde/src/lib.rs @@ -13,6 +13,16 @@ pub use self::compress_decompress::{compress, decompress, CompressDecompressForm pub use self::encode_decode::{decode, encode, EncodeDecodeConfig, EncodeDecodeFormat}; pub use self::hash::HashOptions; +const TYPEDEFS: &str = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/types.d.luau")); + +/** + Returns a string containing type definitions for the `serde` standard library. +*/ +#[must_use] +pub fn typedefs() -> String { + TYPEDEFS.to_string() +} + /** Creates the `serde` standard library module. diff --git a/types/serde.luau b/crates/lune-std-serde/types.d.luau similarity index 95% rename from types/serde.luau rename to crates/lune-std-serde/types.d.luau index fa9923e..f2d7229 100644 --- a/types/serde.luau +++ b/crates/lune-std-serde/types.d.luau @@ -139,11 +139,7 @@ end @param level The compression level to use, clamped to the format's limits. The best compression level is used by default @return The compressed string ]=] -function serde.compress( - format: CompressDecompressFormat, - s: buffer | string, - level: number? -): string +function serde.compress(format: CompressDecompressFormat, s: buffer | string, level: number?): string return nil :: any end @@ -193,11 +189,7 @@ end @param message The message to hash @return The hash as a base64 string ]=] -function serde.hmac( - algorithm: HashAlgorithm, - message: string | buffer, - secret: string | buffer -): string +function serde.hmac(algorithm: HashAlgorithm, message: string | buffer, secret: string | buffer): string return nil :: any end diff --git a/crates/lune-std-stdio/src/lib.rs b/crates/lune-std-stdio/src/lib.rs index 521973d..e06ca49 100644 --- a/crates/lune-std-stdio/src/lib.rs +++ b/crates/lune-std-stdio/src/lib.rs @@ -33,6 +33,16 @@ static STDIN: LazyLock>>>> = LazyLock::n Arc::new(AsyncMutex::new(reader)) }); +const TYPEDEFS: &str = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/types.d.luau")); + +/** + Returns a string containing type definitions for the `stdio` standard library. +*/ +#[must_use] +pub fn typedefs() -> String { + TYPEDEFS.to_string() +} + /** Creates the `stdio` standard library module. diff --git a/types/stdio.luau b/crates/lune-std-stdio/types.d.luau similarity index 97% rename from types/stdio.luau rename to crates/lune-std-stdio/types.d.luau index a5004fe..06ebc27 100644 --- a/types/stdio.luau +++ b/crates/lune-std-stdio/types.d.luau @@ -1,13 +1,4 @@ -export type Color = - "reset" - | "black" - | "red" - | "green" - | "yellow" - | "blue" - | "purple" - | "cyan" - | "white" +export type Color = "reset" | "black" | "red" | "green" | "yellow" | "blue" | "purple" | "cyan" | "white" export type Style = "reset" | "bold" | "dim" type PromptFn = ( diff --git a/crates/lune-std-task/src/lib.rs b/crates/lune-std-task/src/lib.rs index 1cc56e6..482c5cb 100644 --- a/crates/lune-std-task/src/lib.rs +++ b/crates/lune-std-task/src/lib.rs @@ -10,6 +10,16 @@ use mlua_luau_scheduler::Functions; use lune_utils::TableBuilder; +const TYPEDEFS: &str = include_str!(concat!(env!("CARGO_MANIFEST_DIR"), "/types.d.luau")); + +/** + Returns a string containing type definitions for the `task` standard library. +*/ +#[must_use] +pub fn typedefs() -> String { + TYPEDEFS.to_string() +} + /** Creates the `task` standard library module. diff --git a/types/task.luau b/crates/lune-std-task/types.d.luau similarity index 94% rename from types/task.luau rename to crates/lune-std-task/types.d.luau index 81bdc2f..9abdf26 100644 --- a/types/task.luau +++ b/crates/lune-std-task/types.d.luau @@ -58,11 +58,7 @@ end @param functionOrThread The function or thread to delay @return The thread that will be delayed ]=] -function task.delay( - duration: number, - functionOrThread: thread | (T...) -> ...any, - ...: T... -): thread +function task.delay(duration: number, functionOrThread: thread | (T...) -> ...any, ...: T...): thread return nil :: any end diff --git a/crates/lune-std/src/library.rs b/crates/lune-std/src/library.rs index 84c2a98..faa1322 100644 --- a/crates/lune-std/src/library.rs +++ b/crates/lune-std/src/library.rs @@ -61,6 +61,29 @@ impl LuneStandardLibrary { } } + /** + Returns type definitions for the library. + */ + #[must_use] + #[rustfmt::skip] + #[allow(unreachable_patterns)] + pub fn typedefs(&self) -> String { + match self { + #[cfg(feature = "datetime")] Self::DateTime => lune_std_datetime::typedefs(), + #[cfg(feature = "fs")] Self::Fs => lune_std_fs::typedefs(), + #[cfg(feature = "luau")] Self::Luau => lune_std_luau::typedefs(), + #[cfg(feature = "net")] Self::Net => lune_std_net::typedefs(), + #[cfg(feature = "task")] Self::Task => lune_std_task::typedefs(), + #[cfg(feature = "process")] Self::Process => lune_std_process::typedefs(), + #[cfg(feature = "regex")] Self::Regex => lune_std_regex::typedefs(), + #[cfg(feature = "serde")] Self::Serde => lune_std_serde::typedefs(), + #[cfg(feature = "stdio")] Self::Stdio => lune_std_stdio::typedefs(), + #[cfg(feature = "roblox")] Self::Roblox => lune_std_roblox::typedefs(), + + _ => unreachable!("no standard library enabled"), + } + } + /** Creates the Lua module for the library. @@ -71,7 +94,7 @@ impl LuneStandardLibrary { #[rustfmt::skip] #[allow(unreachable_patterns)] pub fn module(&self, lua: Lua) -> LuaResult { - let mod_lua = lua.clone(); + let mod_lua = lua.clone(); let res: LuaResult = match self { #[cfg(feature = "datetime")] Self::DateTime => lune_std_datetime::module(mod_lua), #[cfg(feature = "fs")] Self::Fs => lune_std_fs::module(mod_lua), diff --git a/crates/lune/Cargo.toml b/crates/lune/Cargo.toml index 93aa409..c0dbfe8 100644 --- a/crates/lune/Cargo.toml +++ b/crates/lune/Cargo.toml @@ -44,7 +44,7 @@ std = [ "std-task", ] -cli = ["dep:clap", "dep:include_dir", "dep:rustyline", "dep:zip_next"] +cli = ["dep:clap", "dep:rustyline", "dep:zip_next"] [lints] workspace = true @@ -76,6 +76,5 @@ lune-utils = { version = "0.1.3", path = "../lune-utils" } ### CLI clap = { optional = true, version = "4.1", features = ["derive"] } -include_dir = { optional = true, version = "0.7", features = ["glob"] } rustyline = { optional = true, version = "14.0" } zip_next = { optional = true, version = "1.1" } diff --git a/crates/lune/src/cli/setup.rs b/crates/lune/src/cli/setup.rs index 4b25e9a..c40b360 100644 --- a/crates/lune/src/cli/setup.rs +++ b/crates/lune/src/cli/setup.rs @@ -1,21 +1,15 @@ -use std::{ - borrow::BorrowMut, collections::HashMap, env::current_dir, io::ErrorKind, path::PathBuf, - process::ExitCode, -}; +use std::{borrow::BorrowMut, env::current_dir, io::ErrorKind, path::PathBuf, process::ExitCode}; use anyhow::{Context, Result}; use clap::Parser; use directories::UserDirs; use futures_util::future::try_join_all; -use include_dir::{include_dir, Dir}; use thiserror::Error; use tokio::fs; // TODO: Use a library that supports json with comments since VSCode settings may contain comments use serde_json::Value as JsonValue; -pub(crate) static TYPEDEFS_DIR: Dir<'_> = include_dir!("types"); - pub(crate) static SETTING_NAME_MODE: &str = "luau-lsp.require.mode"; pub(crate) static SETTING_NAME_ALIASES: &str = "luau-lsp.require.directoryAliases"; @@ -25,7 +19,7 @@ pub struct SetupCommand {} impl SetupCommand { pub async fn run(self) -> Result { - generate_typedef_files_from_definitions(&TYPEDEFS_DIR) + generate_typedef_files_from_definitions() .await .expect("Failed to generate typedef files"); @@ -142,31 +136,11 @@ fn add_values_to_vscode_settings_json(value: JsonValue) -> JsonValue { settings_json } -async fn generate_typedef_files_from_definitions(dir: &Dir<'_>) -> Result { - let contents = read_typedefs_dir_contents(dir); - write_typedef_files(contents).await -} - -fn read_typedefs_dir_contents(dir: &Dir<'_>) -> HashMap> { - let mut definitions = HashMap::new(); - - for entry in dir.find("*.luau").unwrap() { - let entry_file = entry.as_file().unwrap(); - let entry_name = entry_file.path().file_name().unwrap().to_string_lossy(); - - let typedef_name = entry_name.trim_end_matches(".luau"); - let typedef_contents = entry_file.contents().to_vec(); - - definitions.insert(typedef_name.to_string(), typedef_contents); - } - - definitions -} - -async fn write_typedef_files(typedef_files: HashMap>) -> Result { +async fn generate_typedef_files_from_definitions() -> Result { let version_string = env!("CARGO_PKG_VERSION"); let mut dirs_to_write = Vec::new(); let mut files_to_write = Vec::new(); + // Create the typedefs dir in the users cache dir let cache_dir = UserDirs::new() .context("Failed to find user home directory")? @@ -175,13 +149,14 @@ async fn write_typedef_files(typedef_files: HashMap>) -> Result< .join(".typedefs") .join(version_string); dirs_to_write.push(cache_dir.clone()); + // Make typedef files - for (builtin_name, builtin_typedef) in typedef_files { - let path = cache_dir - .join(builtin_name.to_ascii_lowercase()) - .with_extension("luau"); - files_to_write.push((builtin_name.to_lowercase(), path, builtin_typedef)); + for builtin in lune_std::LuneStandardLibrary::ALL { + let name = builtin.name().to_lowercase(); + let path = cache_dir.join(&name).with_extension("luau"); + files_to_write.push((name, path, builtin.typedefs())); } + // Write all dirs and files only when we know generation was successful let futs_dirs = dirs_to_write .drain(..)