CRS Package Storage¶
A CRS package can be represented in any system that allows heirarchical data storage with named files and directories. This may be a regular directory on disk, a Zip archive, a Tar archive, a database table, or even something as simple as a single large JSON document.
pkg.json¶
At the root of the package must be a valid JSON document named pkg.json.
This file encodes all of the metadata in the package.
At any point in the JSON object, if any JSON object key string begins with
the substring “_comment”, then content of that object entry is to be ignored
for validating the JSON data.
The basic interface of pkg.json looks as below:
interface CRSPackage {
$schema?: string,
"schema-version": 0,
name: NameString,
version: VersionString,
"pkg-version": integer,
libraries: CRSLibrary[],
meta?: {
[key: string]: unknown
},
extra?: null | {
[key: string]: unknown
},
}
interface CRSLibrary {
name: NameString,
path: string,
using: NameString[],
dependencies: CRSDependency[],
"test-dependencies": CRSDependency[],
}
interface CRSDependency {
name: NameString,
using: NameString,
versions: VersionRange[],
}
interface VersionRange {
low: VersionString,
high: VersionString,
}
Where “NameString” is a string that is a valid CRS name and
“VersionString” is a string that is a valid
Semantic Version string.
Schema¶
- mapping CRSPackage_v0¶
A JSON object type. Any properties that allow
undefinedare optional, and all others are required.- property schema-version (required)¶
- Type
Literal
0(zero)
The version of the CRS schema described by the object. For this type at this version, the value is literal zero
0.Package processors should validate the content of this property before checking any other content in the document.
- property version (required)¶
- Type
string
The version of the software that is contained in the enclosing package. Must be a valid Semantic Versioning version string.
Note
Do not confuse with the
pkg-versionproperty.
- property pkg-version (required)¶
- Type
integer
Used to record revisions of the package itself. This is used when the content of the package’s metadata may require changing, but the content of the packaged software is equivalent to the content of prior revisions. Must be greater or equal to
1(one).
- property libraries (required)¶
- Type
Libraries of the package. Must be a non-empty array of
CRSLibrary_v0objects.
- property meta¶
- Type
(undefined | null | unknown | null)
Used to attach metadata to the package that isn’t required for dependency resolution nor build systems. Package processors should not mandate any content in the nested
metaobject.
- property extra (optional)¶
- Type
(undefined | null)
An optional JSON object or
nullthat encodes additional tool-specific attributes for the package.
- property $schema (optional)¶
- Type
string | undefined
A property using by JSON-schema validators. Do not parse nor validate this.
- property _comment (optional)¶
- Type
string | undefined
Ignore these
- mapping CRSLibrary_v0¶
An object type that contains properties of CRS libraries
Libraries¶
In pkg.json, the libraries property must be an array of CRS library JSON
objects.
Each object in that array defines a library for the package. Each object must contain the following properties:
name¶
The name of the library. Must be a valid name.
No two libraries within a single package may share a name.
path¶
The path to the library root. This must be a valid UTF-8 POSIX-style relative
filepath using forward-slash “/” (solidus) directory separators. The path
may not contain any backslash “\” characters.
A library path must be normalized and validated according to the following rules:
If the first character in the path is a forward-slash, the path is invalid (absolute paths are not allowed).
For every sequence of two or more forward-slashes in the path string, replace the sequence with a single forward-slash.
Remove a final forward-slash in the path string, if present.
Split the path string on forward-slashes into a list of component strings.
Remove every component from the array that is a single ASCII dot “
.”.For each component in the path string that is a dot-dot “
..”:If the dot-dot component is the first component in the component list, the path is invalid (The path attempts to reach outside of the CRS package).
Delete the dot-dot component and the component preceeding it in the array.
All remaining path components must also be valid CRS names, except that they may begin with an ASCII digit. Otherwise the path is invalid.
Join the component array with forward-slashes in-between each component. This is the new path.
If the path is an empty string, the path is “
.”.
After normalizing the library’s path, no two libraries may have the same path. Some platforms may place additional restrictions on library paths.
using¶
A list of Names of other libraries within the same package. Each string must
correspond to the name property on some other library in the package. A
library cannot “use” itself. The chain of using should form a acyclic graph.
If a using string names a non-existent library, or if there is a cycle in
the using graph, the entire package is invalid.
dependencies¶
An array of CRS dependency objects.
This array specifies the dependencies of the library within the package.
test-dependencies¶
An array of CRS dependency objects.
This array specifies the test-only dependencies of the library within the package.
Dependencies¶
Unlike most packaging formats, dependencies in CRS are not associated with packages at the top-level. Instead, dependencies are associated with individual libraries within a package.
A CRS dependency identifies a package by name, one or more version ranges, and some set of used-libraries. A dependency is associated with a library <CRS library> within a package, and not with the package as a whole.
A CRS dependency is specified as a JSON object with the following required properties:
- mapping CRSDependency_v0¶
- property name (required)¶
- Type
string
The name of a package which is being depended-upon. Must be a valid name.
- property using (required)¶
- Type
string[]
An array of name strings identifying libraries within the depended-upon package to be used by the library that contains this dependency.
- property versions (required)¶
An array of one or more version range objects. Each JSON object must contain the following properties:
lowThe minimum version of the range. Must be a valid Semantic Version string.
highThe maximum version of the range, exclusive. Must be a valid Semantic Version string.