* Only update relevant deps in Cargo.lock The release script needs to update Cargo.lock after having updated Cargo.toml with the new version of various Nickel crates. Indeed, we are running some checks via Nix, and Nix builds are sandboxed without network access. This requires the Nix build to use `cargo --frozen --offline`, which in turns require the Cargo.lock file to be up-to-date or it will fail. The previous version of the release script would do a simple `cargo update`, which has the default of updating all dependencies. This commit changes that to only udpate dependencies which we might have bumped. * Add pause to commit release notes in release script * Fix release script for LSP The release script was missing a part: the removal of `lsp-harness` (a local, unpublished util crates) from the nickel-lang-lsp package priori to publication to crates.io. Passing by, other small improvements and fixes are included as well. * [release.sh] update to 1.4.0 * Specify 'do not commit' when updating release notes * release guide: add missing step for lsp-harness removal
27 KiB
Version 1.4
Nickel 1.4 is a maintenance release, at the exception of a breaking change (see below).
Breaking changes
-
The curried dot operator added in Nickel 1.3 was implemented the wrong way: the arguments were flipped, meaning that
(.) foo bar
wasbar."%{foo}"
instead of the expectedfoo."%{bar}"
. While the initial flipped implementation seems more useful for piping operations using the reverse application operator|>
, it's inconsistent with all other curried operators, where(<operator>)
is always defined asfun x y => x <operator> y
. To ensure consistency, and because the initial behavior was an oversight and not a conscious design decision, we decided to change the definition of(.)
to match the other curried operator by flipping its arguments.To fill the gap, Nickel 1.4 introduces
std.record.get
with the same definition as the(.)
introduced in Nickel 1.3. To migrate from 1.3 to 1.4, you can either flip the arguments of the curried dot as a function(.)
whenever possible, or you can just replace it with the newstd.record.get
.(implemented by @yannham in https://github.com/tweag/nickel/pull/1752)
Tooling
- Search for imports in NICKEL_IMPORT_PATH by @jneem in https://github.com/tweag/nickel/pull/1716
- Add a cli param --import-path to specify the search path by @jneem in https://github.com/tweag/nickel/pull/1721
- LSP: Fix hover on assignments to subrecords by @jneem in https://github.com/tweag/nickel/pull/1725
- Print something when nickel doc succeeds by @yannham in https://github.com/tweag/nickel/pull/1729
- Add --error-format flag to serialize err diagnostics by @yannham in https://github.com/tweag/nickel/pull/1740
- LSP: get record completion in arrays by @jneem in https://github.com/tweag/nickel/pull/1746
Core language
- Support importing txt files as strings by @Quantum64 in https://github.com/tweag/nickel/pull/1734
Fixes
nickel format
: don't fail silently on invalid input anymore by @yannham in https://github.com/tweag/nickel/pull/1749- Update Topiary dependencies to correctly handle
(.)
innickel format
by @yannham in https://github.com/tweag/nickel/pull/1753
Version 1.3
Version 1.3 includes several new optimizations following reports of long evaluation time for medium-sized codebase. The command-line interface (CLI) has been reworked to be more user-friendly, at the cost of breaking changes: see below. Finally, the LSP has seen continuous improvement as well.
Breaking changes
- @vkleen improved the CLI UX in numerous ways in https://github.com/tweag/nickel/pull/1632
- The file argument is now argument positional. That is, instead of running
nickel export -f config.ncl
, now usenickel export config.ncl
instead. - Every command which can take a file argument can now take several of them.
The program parsed from the files are then merged before applying the
action. For example, the new
nickel export config1.ncl config2.ncl config3.ncl
is the equivalent of the previous:nickel export <<< '(import "config1.ncl") & (import "config2.ncl") & (import "config3.ncl")'
- Evaluation is now an explicit subcommand, instead of being the default
action. Instead of running
nickel -f config.ncl
to evaluate a file, usenickel eval config.ncl
instead.
- The file argument is now argument positional. That is, instead of running
- Not a breaking change per se, because the customize mode is experimental, but
@yannham introduced a new syntax for customize mode in
https://github.com/tweag/nickel/pull/1709. Instead of dynamically generating a
CLI where arguments are field paths, the new customize mode CLI directly take
assignments written in a Nickel-like syntax as positional arguments. For
example, in 1.2, the command
nickel eval -f confing.ncl -- \ --input.field1 '"Value"' --input.flag false \ --override output.bar 0
now becomesnickel eval config.ncl -- \ 'input.field1="Value"' input.flag=false \ --override output.bar=0
Fixes
- Fix
record.update
by makingrecord.insert
act consistently by @yannham in https://github.com/tweag/nickel/pull/1669
Tooling
- LSP:
- implement type-based completion in the new completer by @jneem in https://github.com/tweag/nickel/pull/1577
- Improve context completion by @jneem in https://github.com/tweag/nickel/pull/1584
- Take the ancestor path into account when env-completing from uncles. by @jneem in https://github.com/tweag/nickel/pull/1661
- Add goto support for pattern bindings by @jneem in https://github.com/tweag/nickel/pull/1665
- Add cousin search to goto and hover by @jneem in https://github.com/tweag/nickel/pull/1670
- Improve hover output for let patterns by @jneem in https://github.com/tweag/nickel/pull/1696
- First prototype of contract evaluation by @jneem in https://github.com/tweag/nickel/pull/1672
- LSP: a large refactoring work by @jneem to get rid of the old and hard-to-maintain code analysis implementation (https://github.com/tweag/nickel/pull/1623, https://github.com/tweag/nickel/pull/1629, https://github.com/tweag/nickel/pull/1658, https://github.com/tweag/nickel/pull/1663)
- Honor
nostdlib
in customize mode as well by @vkleen in https://github.com/tweag/nickel/pull/1634 - Add the
list
subcommand to the customize mode by @yannham in https://github.com/tweag/nickel/pull/1709 - add %eval_nix% primop for Nix interop by @Radvendii in https://github.com/tweag/nickel/pull/1465 (requires to build with the corresponding experimental feature enabled)
- Get rid of shallow_repr and print full terms in error messages by @yannham in https://github.com/tweag/nickel/pull/1676
- Add suggestions to the error message when misspelling a record field by @yannham in https://github.com/tweag/nickel/pull/1710
- Add a
--field
argument to subcommands to target a specific field whenever it makes sense by @yannham in https://github.com/tweag/nickel/pull/1712
Optimizations
- Contract elision for static types by @yannham in https://github.com/tweag/nickel/pull/1671
- Implement contract deduplication optimization by @yannham in https://github.com/tweag/nickel/pull/1631
- Array contract deduplication by @yannham in https://github.com/tweag/nickel/pull/1674
- Get rid of most generated variables by @yannham in https://github.com/tweag/nickel/pull/1679
Documentation
- Fix invalid example code in doc of blame_with_message by @bgni in https://github.com/tweag/nickel/pull/1689
- Fix doc, example code for pipe lacks prefix by @bgni in https://github.com/tweag/nickel/pull/1692
- change nickel-nix to organist by @Radvendii in https://github.com/tweag/nickel/pull/1691
New Contributors
- @bgni made their first contribution in https://github.com/tweag/nickel/pull/1689
- @giorgiga made their first contribution in https://github.com/tweag/nickel/pull/1697
Version 1.2
Version 1.2 comes with several improvements on the LSP and other components of the Nickel tooling. The new customize mode of the CLI makes it possible to dynamically turn a configuration into a command-line interface, which you can interact with.
Several related long-standing issues and limitations when typechecking polymorphic functions are also finally fixed.
Core language
- Make the lexer accept scientific notation by @vkleen in https://github.com/tweag/nickel/pull/1456
- Improve polymorphism handling, bidirectional typechecking and fix unsound generalization by @yannham in https://github.com/tweag/nickel/pull/1372
- Error on serializing very large numbers by @vkleen in https://github.com/tweag/nickel/pull/1470
- Import YAML files containing multiple documents as arrays by @vkleen in https://github.com/tweag/nickel/pull/1497
- Normalize line endings in string literals during parsing (Windows compatiblity) by @vkleen in https://github.com/tweag/nickel/pull/1562
- Implement curried dot operator by @suimong in https://github.com/tweag/nickel/pull/1578
- Statically merge partial record definitions by @vkleen in https://github.com/tweag/nickel/pull/1599
- Disable recursive priorities by @yannham in https://github.com/tweag/nickel/pull/1600
Fixes
- Various fixes to the pretty-printer by @vkleen (https://github.com/tweag/nickel/pull/1411, https://github.com/tweag/nickel/pull/1412, https://github.com/tweag/nickel/pull/1410, https://github.com/tweag/nickel/pull/1417)
- Fix REPL panic on transitive imports by @Radvendii in https://github.com/tweag/nickel/pull/1474
- Fix contract application order in let bindings and annotations by @vkleen in https://github.com/tweag/nickel/pull/1544
- Fix cursor desyncing when using REPL by @deotimedev in https://github.com/tweag/nickel/pull/1546
- Fix handling of relative imports @jneem in https://github.com/tweag/nickel/pull/1489
- LSP Fix two issues with incomplete input by @jneem in https://github.com/tweag/nickel/pull/1550
- Fix incomplete check of record row constraints by @yannham in https://github.com/tweag/nickel/pull/1558
- Fix LSP regression on hovering by @yannham in https://github.com/tweag/nickel/pull/1583
Tooling
- Full vscode extension by @szlend and @yannham in (https://github.com/tweag/nickel/pull/1405, https://github.com/tweag/nickel/pull/1413, https://github.com/tweag/nickel/pull/1416)
- Invalidate importers in NLS (plus a couple other import-related issues) by @jneem in https://github.com/tweag/nickel/pull/1426
- Improve
nickel query
(and:query
in the REPL) interface by @yannham in https://github.com/tweag/nickel/pull/1447 - Topiary integration (formatting) as
nickel format
by @vkleen in https://github.com/tweag/nickel/pull/1371 - LSP: various improvements to completion by @jneem (https://github.com/tweag/nickel/pull/1450, https://github.com/tweag/nickel/pull/1473)
- Improve doc extraction capabilities through
nickel doc
(evaluate terms before extracting documentation) by @vkleen in https://github.com/tweag/nickel/pull/1463 - LSP Fix persistent diagnostics by @jneem in https://github.com/tweag/nickel/pull/1478
- Restore --version for CLI, include git revision by @yannham in https://github.com/tweag/nickel/pull/1486
- Disable the colors when stdout isn't a tty by @thufschmitt in https://github.com/tweag/nickel/pull/1508
- Improve type variables name allocation when reporting type errors by @yannham in https://github.com/tweag/nickel/pull/1512
- LSP formatting without calling the topiary binary by @vkleen in https://github.com/tweag/nickel/pull/1526
- LSP Initial handling of incomplete input by @jneem in https://github.com/tweag/nickel/pull/1541
- LSP resolve imports for incomplete inputs also by @jneem in https://github.com/tweag/nickel/pull/1542
- Add multiline string support for VSCode autoclosing pairs by @deotimedev in https://github.com/tweag/nickel/pull/1553
- Display icon for nickel file in vscode explorer by @suimong in https://github.com/tweag/nickel/pull/1556
- New experimental customize mode CLI to interact with a configuration on the
command line (see
nickel help export
) by @Radvendii and @yannham in https://github.com/tweag/nickel/pull/1475 - (LSP) Import completion by @deotimedev in https://github.com/tweag/nickel/pull/1561
- Get rid of uninformative generic notes for higher-order contract errors by @yannham in https://github.com/tweag/nickel/pull/1564
- Render hover documentation as Markdown in LSP by @deotimedev in https://github.com/tweag/nickel/pull/1559
- Exit with nonzero exit code on failure by @vkleen in https://github.com/tweag/nickel/pull/1576
Stdlib
- add
std.contract.Sequence
by @Radvendii in https://github.com/tweag/nickel/pull/1452
Documentation
- manual docs: fix mismatch between input command and its echo in the output by @foo-jin in https://github.com/tweag/nickel/pull/1421
- Add two examples: imports and foreach pattern by @mipmip in https://github.com/tweag/nickel/pull/1387
- Fix some leftover instances of the old enum syntax in the manual by @vkleen in https://github.com/tweag/nickel/pull/1548
Version 1.1
This version mostly includes bugfixes and stdlib improvement since 1.0.
IMPORTANT: The main crate nickel-lang
has been split between
nickel-lang-cli
(the binary) and nickel-lang-core
(the library). If you're
using cargo
to install Nickel, please uninstall the previous crate by running
cargo uninstall nickel-lang
, and from now one use cargo install nickel-lang-cli
to install 1.1 and do further updates.
Stdlib
- Encode more pre-conditions of stdlib functions as additional contracts, replacing dynamic type errors with nice contract errors by @yannham in https://github.com/tweag/nickel/pull/1358
- ArraySliceFun incorrectly excluded the length of the array as the end index by @vkleen in https://github.com/tweag/nickel/pull/1396
Tooling
- Improve the pretty printing of terms in the CLI and within error messages by @vkleen in https://github.com/tweag/nickel/pull/1262
- Fix LSP panic when importing JSON by @yannham in https://github.com/tweag/nickel/pull/1382
- Fix LSP hanging under certain conditions involving external imports by @yannham in https://github.com/tweag/nickel/pull/1390
- Better error message when contract makes certain rows illegal by @Radvendii in https://github.com/tweag/nickel/pull/1323
- Fix function params hovering in the LSP by @yannham in https://github.com/tweag/nickel/pull/1395
- Fix LSP infinite loop on hovering on external imports by @yannham in https://github.com/tweag/nickel/pull/1397
Fixes
- Fixes incorrect variable names in type mismatch errors by @vkleen in https://github.com/tweag/nickel/pull/1313
- Improve error messages for polymorphic tail parametricity violations by @matthew-healy in https://github.com/tweag/nickel/pull/1320
- Fix panic on duplicated top-level idents in record destructuring by @matthew-healy in https://github.com/tweag/nickel/pull/1324
- Prevent panic when parsing record type with field path by @matthew-healy in https://github.com/tweag/nickel/pull/1325
- Give a better error message when trying to query a non-record by @jneem in https://github.com/tweag/nickel/pull/1326
- Fix error position by @jneem in https://github.com/tweag/nickel/pull/1333
- Fix panic when interpolating fields in a record type by @jneem in https://github.com/tweag/nickel/pull/1332
- Fix type annotations not generating contracts by @yannham in https://github.com/tweag/nickel/pull/1379
- Fix typechecker looping by adding missing check for unifying equal type vars by @yannham in https://github.com/tweag/nickel/pull/1400
- Fix panic on function contract failure (position of arrow functions not set) by @yannham in https://github.com/tweag/nickel/pull/1407
Version 1.0
This is the 1.0 release! The syntax and the semantics of the core language have been stabilized and shouldn't evolve as much in the future.
- The core semantics of the language have been reworked and stabilized, in particular (but not limited to) merging, types and contracts with the implementation of RFC005
- The stdlib has been augmented with many new functions
- Parts of the syntax and some builtin symobls (types, stdlib functions, and so on) have been improved and made consistent
- New features for the LSP, and in particular code completion
Breaking changes
- Various functions from the stdlib have been renamed for better discoverability, and the stdlib got a lot of new additions. Please refer to the documentation of the stdlib.
- String functions are now unicode-aware, and operate on the Unicode grapheme
cluster abstraction instead of the character abstraction (
string.length
,string.is_match
, etc.) - The
switch
keyword has been replaced bymatch
, and can now be used as a standalone function (doesn't need to be applied right away) - The
Num
andStr
builtin types have been renamed toNumber
andString
by @yannham in https://github.com/tweag/nickel/pull/1164 - The
num
andstr
stdlib modules have been renamed tonumber
andstring
- The
builtin.typeof
function now returns'Number
,'String
,'Function
instead of respectively'Num
,'Str
, and'Fun
- The
builtin.is_num
,builtin.is_str
andbuiltin.to_str
functions have been renamed tois_number
,is_string
andto_string
- The
string.to_num
andstring.from_num
functions have been renamed toto_number
andfrom_number
- All the stdlib modules
array
,string
,record
, etc. have been put under astd
namespace. They must now be accessed asstd.array
,std.string
and so on. - RFC005 was implemented, which changes the semantics of contract annotations
and merging. See the RFC
content
for more details. Most notably, metadata annotation (default values,
optional
, documentation, etc.) can only appear next to a record field. Contract and type annotations can still appear anywhere. Documentation can still appear on let-bindings. - Use static dictionary types for
record.fields
andrecord.values
by @matthew-healy in https://github.com/tweag/nickel/pull/1024 - Make type annotations to not propagate through merging by @yannham in https://github.com/tweag/nickel/pull/1271
- Change to dictionary contracts and introduction of a separate dictionary contract (in addition to dictionary type):
- Fix dictionary contract semantics by @vkleen in https://github.com/tweag/nickel/pull/1141
- Introduce dictionary contracts by @yannham in https://github.com/tweag/nickel/pull/1272
- Stdlib
string.Stringingable
->string.Stringable
by @vkleen in https://github.com/tweag/nickel/pull/1180 - Fix the type of
array.elem
by @yannham in https://github.com/tweag/nickel/pull/1223 - Change the enum tag start delimiter from backtick to single-quote by @vkleen in https://github.com/tweag/nickel/pull/1279
import
is now a statement,import "foo.ncl" arg1 arg2
requires parenthesis now:(import "foo.ncl") arg1 arg2
, see https://github.com/tweag/nickel/pull/1293
Language features
- Symbolic strings by @matthew-healy in https://github.com/tweag/nickel/pull/994
- [RFC005] Lazy propagation by @yannham in https://github.com/tweag/nickel/pull/1086
- Non-exported record fields by @vkleen in https://github.com/tweag/nickel/pull/1132
- Enrich label custom reporting data by @yannham in https://github.com/tweag/nickel/pull/1152
- Use type annotations in record patterns during typechecking by @matthew-healy in https://github.com/tweag/nickel/pull/1176
- Use arbitrary precision rationals as the underlying representation of numbers by @yannham in https://github.com/tweag/nickel/pull/1182
- Allow equal arrays to be merged in order to make merge idempotent by @yannham in https://github.com/tweag/nickel/pull/1229
- Use deterministic hashtables, making runtime errors and typechecking error deterministic by @yannham in https://github.com/tweag/nickel/pull/1235
Stdlib
- Add a %trace% primop (and
std.trace
function) by @vkleen in https://github.com/tweag/nickel/pull/1055 - Add
std.contract.Equal
contract to the stdlib by @yannham in https://github.com/tweag/nickel/pull/1203
Tooling
- Display meta information when providing completion in https://github.com/tweag/nickel/pull/966
- LSP completion for import terms by @ebresafegaga in https://github.com/tweag/nickel/pull/993
- Fix LSP server not giving completion when a non-contract meta-information is present in a declaration by @ebresafegaga in https://github.com/tweag/nickel/pull/991
- Fix LSP not giving completion when an identifier is prefixed by a delimiting character by @ebresafegaga in https://github.com/tweag/nickel/pull/1043
- Improve the "goto definition" feature of the LSP by making it work across multiple files by @ebresafegaga in https://github.com/tweag/nickel/pull/1029
- Add --color option to the CLI by @matthew-healy in https://github.com/tweag/nickel/pull/1033
- Make the "find references" feature of the LSP work across multiple files by @ebresafegaga in https://github.com/tweag/nickel/pull/1037
- Add support for LSP completion using the surrounding context by @ebresafegaga (context completion) in https://github.com/tweag/nickel/pull/1057
- Support completion for field names inside recursive records. by @ebresafegaga in https://github.com/tweag/nickel/pull/1088
- Improve contract violation error reporting by @ebresafegaga in https://github.com/tweag/nickel/pull/1139
- Add a JSON documentation export option by @vkleen in https://github.com/tweag/nickel/pull/1209
- Add support for formatting capabilities to the LSP by @ebresafegaga in https://github.com/tweag/nickel/pull/1216
Fixes
- Do not panic on type path mismatch by @yannham in https://github.com/tweag/nickel/pull/1028
- Fix multiline string interpolation when preceded by a
"
character by @matthew-healy in https://github.com/tweag/nickel/pull/1023 - Improve the performance of
std.array.fold_left
andstd.array.fold_right
by @vkleen in https://github.com/tweag/nickel/pull/1075 - Correctly type identifiers introduced in destructuring patterns by @matthew-healy in https://github.com/tweag/nickel/pull/1099
- Always include fields with a value in
record.fields
by @vkleen in https://github.com/tweag/nickel/pull/1225 - Make partially applied boolean operators work by @vkleen in https://github.com/tweag/nickel/pull/1282
Version 0.3.1 (2022-12-15)
Fixes
- Fix blame error when calling
string.find
by @euank in https://github.com/tweag/nickel/pull/988
Version 0.3 (2022-12-07)
Fixes
- Fix polymorphic contracts unduly changing semantics by @ebresafegaga in https://github.com/tweag/nickel/pull/802
- Fix typechecking and unification in presence of flat types (aka opaque types, aka contracts) by @yannham in https://github.com/tweag/nickel/pull/766
- Fix polarity for polymorphic contract failure by @ebresafegaga in https://github.com/tweag/nickel/pull/831
- Fix panic when a row mismatch occurs while unifying row tails by @matthew-healy in https://github.com/tweag/nickel/pull/847
- Fix type to term conversion causing unbound type variables errors by @francois-caddet in https://github.com/tweag/nickel/pull/854
- Fix bad lexing of enum tags by @matthew-healy in https://github.com/tweag/nickel/pull/874
- Fix multiple recursive overriding by @yannham in https://github.com/tweag/nickel/pull/940
Language features
- Optional fields by @yannham in https://github.com/tweag/nickel/pull/815
- Numeral merge priorities by @yannham in https://github.com/tweag/nickel/pull/829
- Recursive merge priorities (or push-priorities, or leafy priorities) by @yannham in https://github.com/tweag/nickel/pull/845
- Change
switch
tomatch
and make it a proper function by @yannham in https://github.com/tweag/nickel/pull/970
Stdlib
- Statically type
string.join
by @matthew-healy in https://github.com/tweag/nickel/pull/946
Tooling
- Add record completion in the LSP by @ebresafegaga in
- Add completion for Nickel's stdlib in the LSP by @ebresafegaga in https://github.com/tweag/nickel/pull/918
Performances
- Lazy array contracts by @fuzzypixelz in https://github.com/tweag/nickel/pull/809
- Array slices by @fuzzypixelz in https://github.com/tweag/nickel/pull/776
- String interning for identifiers by @Acaccia in https://github.com/tweag/nickel/pull/835
Version 0.2 (2022-07-29)
Breaking changes
- Using a contract as part of a static type annotation will in most cases fail with an appropriate error message. This is a temporary limitation in order to fix previously unsound behavior in the typechecker. This restriction will likely be lifted in the upcoming 0.3.x release. For more details, see issues #701 and #724
Fixes
- Fix unnecessarily restricted record contract for
record.update
- Fix wrong interpretation of long interpolation-like sequences
%..%{
in strings - Fix panic when evaluating a
switch
in specific cases - Fix fields without definition being assigned to
null
, instead of just being marked as undefined
Language features
- Merging null values together gives null, and merging empty lists together gives
an empty list, instead of failing with
error: non mergeable terms
- Add recursive let-bindings (
let rec
) - Add type wildcards. Use
_
in place of a type to let the typechecker fill the gap. Example:let foo : _ = array.all ((==) 2) [1,2,3]
- Add
builtin.to_str
andstring.from
to convert generic values to a string - Re-introduce an official syntax for enum types
Tooling
- Add the
nickel pprint-ast
command to pretty print a parsed program (mostly debugging purpose) - Add the
nickel doc
command to produce markdown documentation from the in-codedoc
metadata
Documentation
- Fix various typos and remove use of deprecated syntax in the user manual
Version 0.1 (2022-03-10)
First release! The main focus has been the design of the Nickel language itself.
Language features
- Gradual type system with row types, polymorphism and type inference
- Contract system for data validation
- Merge system for recursive records that supports one level of overriding
- Metadata annotations (default values, documentation, etc.)
- Unified syntax for terms, types and contracts (RFC002)
- Record destructuring
Tooling
-
The main binary supports the following subcommands:
nickel query
to show metadata and documentation of library functions, the field of a configuration, etc.nickel export
to serialize to JSON, YAML, or TOMLnickel repl
to launch an REPLnickel typecheck
to do typechecking without evaluating
-
An LSP-server is included
Documentation
- User manual sections on syntax, correctness (types and contracts), and merging
- The standard library has been documented in-code (use
nickel query
/:query
to retrieve it)
Known limitations
-
The roadmap for overriding and the merge system (RFC001) has not been implemented fully yet.
-
Performance has not been prioritized.
-
Due to the use of reference counting as a memory management strategy, mutually recursive record fields are currently leaking memory. This shouldn't be an issue in a standard workflow.
-
Standard library APIs and language features are subject to change. There is no backward compatibility guarantees for this version. In general, this release is meant for experimenting and getting user feedback, but isn't intended to be used in production.