summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2023-09-04 16:27:53 +0200
committerLaurenz <laurmaedje@gmail.com>2023-09-04 16:29:57 +0200
commit2f672b4e2ebb040896c7a6af5104f72b075565e0 (patch)
tree21bc7f1a4b22a898fa1e8c23b09cd08051690a4b
parent68a25f497ec9137fc2965aaeff5a49501ede552e (diff)
Allow packages to specify their minimum compiler version
-rw-r--r--crates/typst-syntax/src/file.rs11
-rw-r--r--crates/typst/src/eval/mod.rs12
-rw-r--r--tests/packages/future-0.1.0/lib.typ1
-rw-r--r--tests/packages/future-0.1.0/typst.toml5
-rw-r--r--tests/src/tests.rs7
-rw-r--r--tests/typ/compiler/packages.typ5
6 files changed, 39 insertions, 2 deletions
diff --git a/crates/typst-syntax/src/file.rs b/crates/typst-syntax/src/file.rs
index f5fa493b..8f07cc92 100644
--- a/crates/typst-syntax/src/file.rs
+++ b/crates/typst-syntax/src/file.rs
@@ -265,6 +265,17 @@ pub struct PackageVersion {
pub patch: u32,
}
+impl PackageVersion {
+ /// The current compiler version.
+ pub fn compiler() -> Self {
+ Self {
+ major: env!("CARGO_PKG_VERSION_MAJOR").parse().unwrap(),
+ minor: env!("CARGO_PKG_VERSION_MINOR").parse().unwrap(),
+ patch: env!("CARGO_PKG_VERSION_PATCH").parse().unwrap(),
+ }
+ }
+}
+
impl FromStr for PackageVersion {
type Err = EcoString;
diff --git a/crates/typst/src/eval/mod.rs b/crates/typst/src/eval/mod.rs
index 3f0e4577..fffedc9f 100644
--- a/crates/typst/src/eval/mod.rs
+++ b/crates/typst/src/eval/mod.rs
@@ -1920,6 +1920,16 @@ impl PackageManifest {
);
}
+ if let Some(compiler) = self.package.compiler {
+ let current = PackageVersion::compiler();
+ if current < compiler {
+ bail!(
+ "package requires typst {compiler} or newer \
+ (current version is {current})"
+ );
+ }
+ }
+
Ok(())
}
}
@@ -1935,6 +1945,8 @@ struct PackageInfo {
version: PackageVersion,
/// The path of the entrypoint into the package.
entrypoint: EcoString,
+ /// The minimum required compiler version for the package.
+ compiler: Option<PackageVersion>,
}
impl Eval for ast::LoopBreak<'_> {
diff --git a/tests/packages/future-0.1.0/lib.typ b/tests/packages/future-0.1.0/lib.typ
new file mode 100644
index 00000000..80406f62
--- /dev/null
+++ b/tests/packages/future-0.1.0/lib.typ
@@ -0,0 +1 @@
+#future
diff --git a/tests/packages/future-0.1.0/typst.toml b/tests/packages/future-0.1.0/typst.toml
new file mode 100644
index 00000000..f8da5406
--- /dev/null
+++ b/tests/packages/future-0.1.0/typst.toml
@@ -0,0 +1,5 @@
+[package]
+name = "future"
+version = "0.1.0"
+entrypoint = "lib.typ"
+compiler = "1.0.0"
diff --git a/tests/src/tests.rs b/tests/src/tests.rs
index 960aacd2..fee6f2b7 100644
--- a/tests/src/tests.rs
+++ b/tests/src/tests.rs
@@ -25,7 +25,7 @@ use typst::doc::{Document, Frame, FrameItem, Meta};
use typst::eval::{eco_format, func, Bytes, Datetime, Library, NoneValue, Tracer, Value};
use typst::font::{Font, FontBook};
use typst::geom::{Abs, Color, RgbaColor, Smart};
-use typst::syntax::{FileId, Source, Span, SyntaxNode, VirtualPath};
+use typst::syntax::{FileId, PackageVersion, Source, Span, SyntaxNode, VirtualPath};
use typst::{World, WorldExt};
use typst_library::layout::{Margin, PageElem};
use typst_library::text::{TextElem, TextSize};
@@ -719,7 +719,10 @@ fn parse_part_metadata(source: &Source) -> TestPartMetadata {
let mut s = Scanner::new(expectation);
let range = range(&mut s);
let rest = if range.is_some() { s.after() } else { s.string() };
- let message = rest.trim().into();
+ let message = rest
+ .trim()
+ .replace("VERSION", &PackageVersion::compiler().to_string())
+ .into();
annotations.insert(Annotation { kind, range, message });
}
}
diff --git a/tests/typ/compiler/packages.typ b/tests/typ/compiler/packages.typ
index 066a31de..0d3fda58 100644
--- a/tests/typ/compiler/packages.typ
+++ b/tests/typ/compiler/packages.typ
@@ -12,6 +12,11 @@
#test(add(2, 8), 10)
---
+// Test too high required compiler version.
+// Error: 9-29 package requires typst 1.0.0 or newer (current version is VERSION)
+#import "@test/future:0.1.0": future
+
+---
// Error: 9-13 `@` is not a valid package namespace
#import "@@": *