ui
This commit is contained in:
+1532
File diff suppressed because it is too large
Load Diff
+192
@@ -0,0 +1,192 @@
|
||||
A pure JavaScript implementation of [Sass][sass]. **Sass makes CSS fun again**.
|
||||
|
||||
<table>
|
||||
<tr>
|
||||
<td>
|
||||
<img width="118px" alt="Sass logo" src="https://rawgit.com/sass/sass-site/master/source/assets/img/logos/logo.svg" />
|
||||
</td>
|
||||
<td valign="middle">
|
||||
<a href="https://www.npmjs.com/package/sass"><img width="100%" alt="npm statistics" src="https://nodei.co/npm/sass.png?downloads=true"></a>
|
||||
</td>
|
||||
<td valign="middle">
|
||||
<a href="https://github.com/sass/dart-sass/actions"><img alt="GitHub actions build status" src="https://github.com/sass/dart-sass/workflows/CI/badge.svg"></a>
|
||||
<br>
|
||||
<a href="https://ci.appveyor.com/project/nex3/dart-sass"><img alt="Appveyor build status" src="https://ci.appveyor.com/api/projects/status/84rl9hvu8uoecgef?svg=true"></a>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
||||
[sass]: https://sass-lang.com/
|
||||
|
||||
This package is a distribution of [Dart Sass][], compiled to pure JavaScript
|
||||
with no native code or external dependencies. It provides a command-line `sass`
|
||||
executable and a Node.js API.
|
||||
|
||||
[Dart Sass]: https://github.com/sass/dart-sass
|
||||
|
||||
* [Usage](#usage)
|
||||
* [See Also](#see-also)
|
||||
* [Behavioral Differences from Ruby Sass](#behavioral-differences-from-ruby-sass)
|
||||
|
||||
## Usage
|
||||
|
||||
You can install Sass globally using `npm install -g sass` which will provide
|
||||
access to the `sass` executable. You can also add it to your project using
|
||||
`npm install --save-dev sass`. This provides the executable as well as a
|
||||
library:
|
||||
|
||||
[npm]: https://www.npmjs.com/package/sass
|
||||
|
||||
```js
|
||||
const sass = require('sass');
|
||||
|
||||
const result = sass.compile(scssFilename);
|
||||
|
||||
// OR
|
||||
|
||||
// Note that `compileAsync()` is substantially slower than `compile()`.
|
||||
const result = await sass.compileAsync(scssFilename);
|
||||
```
|
||||
|
||||
See [the Sass website][js api] for full API documentation.
|
||||
|
||||
[js api]: https://sass-lang.com/documentation/js-api
|
||||
|
||||
### Legacy API
|
||||
|
||||
Dart Sass also supports an older JavaScript API that's fully compatible with
|
||||
[Node Sass] (with a few exceptions listed below), with support for both the
|
||||
[`render()`] and [`renderSync()`] functions. This API is considered deprecated
|
||||
and will be removed in Dart Sass 2.0.0, so it should be avoided in new projects.
|
||||
|
||||
[Node Sass]: https://github.com/sass/node-sass
|
||||
[`render()`]: https://sass-lang.com/documentation/js-api/modules#render
|
||||
[`renderSync()`]: https://sass-lang.com/documentation/js-api/modules#renderSync
|
||||
|
||||
Sass's support for the legacy JavaScript API has the following limitations:
|
||||
|
||||
* Only the `"expanded"` and `"compressed"` values of [`outputStyle`] are
|
||||
supported.
|
||||
|
||||
* Dart Sass doesn't support the [`precision`] option. Dart Sass defaults to a
|
||||
sufficiently high precision for all existing browsers, and making this
|
||||
customizable would make the code substantially less efficient.
|
||||
|
||||
* Dart Sass doesn't support the [`sourceComments`] option. Source maps are the
|
||||
recommended way of locating the origin of generated selectors.
|
||||
|
||||
[`outputStyle`]: https://sass-lang.com/documentation/js-api/interfaces/LegacySharedOptions#outputStyle
|
||||
[`precision`]: https://github.com/sass/node-sass#precision
|
||||
[`sourceComments`]: https://github.com/sass/node-sass#sourcecomments
|
||||
|
||||
### From Pub
|
||||
|
||||
If you're a Dart user, you can install Dart Sass globally using `pub global
|
||||
activate sass`, which will provide a `sass` executable. You can also add it to
|
||||
your pubspec and use it as a library. We strongly recommend importing it with
|
||||
the prefix `sass`:
|
||||
|
||||
```dart
|
||||
import 'package:sass/sass.dart' as sass;
|
||||
|
||||
void main(List<String> args) {
|
||||
print(sass.compile(args.first));
|
||||
}
|
||||
```
|
||||
|
||||
See [the Dart API docs][api] for details.
|
||||
|
||||
[api]: https://www.dartdocs.org/documentation/sass/latest/sass/sass-library.html
|
||||
|
||||
## See Also
|
||||
|
||||
* [Dart Sass][], from which this package is compiled, can be used either as a
|
||||
stand-alone executable or as a Dart library. Running Dart Sass on the Dart VM
|
||||
is substantially faster than running the pure JavaScript version, so this may
|
||||
be appropriate for performance-sensitive applications. The Dart API is also
|
||||
(currently) more user-friendly than the JavaScript API. See
|
||||
[the Dart Sass README][Using Dart Sass] for details on how to use it.
|
||||
|
||||
* [Node Sass][], which is a wrapper around [LibSass][], the C++ implementation
|
||||
of Sass. Node Sass supports the same API as this package and is also faster
|
||||
(although it's usually a little slower than Dart Sass). However, it requires a
|
||||
native library which may be difficult to install, and it's generally slower to
|
||||
add features and fix bugs.
|
||||
|
||||
[Using Dart Sass]: https://github.com/sass/dart-sass#using-dart-sass
|
||||
[Node Sass]: https://www.npmjs.com/package/node-sass
|
||||
[LibSass]: https://sass-lang.com/libsass
|
||||
|
||||
## Behavioral Differences from Ruby Sass
|
||||
|
||||
There are a few intentional behavioral differences between Dart Sass and Ruby
|
||||
Sass. These are generally places where Ruby Sass has an undesired behavior, and
|
||||
it's substantially easier to implement the correct behavior than it would be to
|
||||
implement compatible behavior. These should all have tracking bugs against Ruby
|
||||
Sass to update the reference behavior.
|
||||
|
||||
1. `@extend` only accepts simple selectors, as does the second argument of
|
||||
`selector-extend()`. See [issue 1599][].
|
||||
|
||||
2. Subject selectors are not supported. See [issue 1126][].
|
||||
|
||||
3. Pseudo selector arguments are parsed as `<declaration-value>`s rather than
|
||||
having a more limited custom parsing. See [issue 2120][].
|
||||
|
||||
4. The numeric precision is set to 10. See [issue 1122][].
|
||||
|
||||
5. The indented syntax parser is more flexible: it doesn't require consistent
|
||||
indentation across the whole document. See [issue 2176][].
|
||||
|
||||
6. Colors do not support channel-by-channel arithmetic. See [issue 2144][].
|
||||
|
||||
7. Unitless numbers aren't `==` to unit numbers with the same value. In
|
||||
addition, map keys follow the same logic as `==`-equality. See
|
||||
[issue 1496][].
|
||||
|
||||
8. `rgba()` and `hsla()` alpha values with percentage units are interpreted as
|
||||
percentages. Other units are forbidden. See [issue 1525][].
|
||||
|
||||
9. Too many variable arguments passed to a function is an error. See
|
||||
[issue 1408][].
|
||||
|
||||
10. Allow `@extend` to reach outside a media query if there's an identical
|
||||
`@extend` defined outside that query. This isn't tracked explicitly, because
|
||||
it'll be irrelevant when [issue 1050][] is fixed.
|
||||
|
||||
11. Some selector pseudos containing placeholder selectors will be compiled
|
||||
where they wouldn't be in Ruby Sass. This better matches the semantics of
|
||||
the selectors in question, and is more efficient. See [issue 2228][].
|
||||
|
||||
12. The old-style `:property value` syntax is not supported in the indented
|
||||
syntax. See [issue 2245][].
|
||||
|
||||
13. The reference combinator is not supported. See [issue 303][].
|
||||
|
||||
14. Universal selector unification is symmetrical. See [issue 2247][].
|
||||
|
||||
15. `@extend` doesn't produce an error if it matches but fails to unify. See
|
||||
[issue 2250][].
|
||||
|
||||
16. Dart Sass currently only supports UTF-8 documents. We'd like to support
|
||||
more, but Dart currently doesn't support them. See [dart-lang/sdk#11744][],
|
||||
for example.
|
||||
|
||||
[issue 1599]: https://github.com/sass/sass/issues/1599
|
||||
[issue 1126]: https://github.com/sass/sass/issues/1126
|
||||
[issue 2120]: https://github.com/sass/sass/issues/2120
|
||||
[issue 1122]: https://github.com/sass/sass/issues/1122
|
||||
[issue 2176]: https://github.com/sass/sass/issues/2176
|
||||
[issue 2144]: https://github.com/sass/sass/issues/2144
|
||||
[issue 1496]: https://github.com/sass/sass/issues/1496
|
||||
[issue 1525]: https://github.com/sass/sass/issues/1525
|
||||
[issue 1408]: https://github.com/sass/sass/issues/1408
|
||||
[issue 1050]: https://github.com/sass/sass/issues/1050
|
||||
[issue 2228]: https://github.com/sass/sass/issues/2228
|
||||
[issue 2245]: https://github.com/sass/sass/issues/2245
|
||||
[issue 303]: https://github.com/sass/sass/issues/303
|
||||
[issue 2247]: https://github.com/sass/sass/issues/2247
|
||||
[issue 2250]: https://github.com/sass/sass/issues/2250
|
||||
[dart-lang/sdk#11744]: https://github.com/dart-lang/sdk/issues/11744
|
||||
|
||||
Disclaimer: this is not an official Google product.
|
||||
+1
@@ -0,0 +1 @@
|
||||
{"name":"sass","description":"A pure JavaScript implementation of Sass.","license":"MIT","bugs":"https://github.com/sass/dart-sass/issues","homepage":"https://github.com/sass/dart-sass","repository":{"type":"git","url":"https://github.com/sass/dart-sass"},"author":{"name":"Natalie Weizenbaum","email":"nweiz@google.com","url":"https://github.com/nex3"},"engines":{"node":">=12.0.0"},"dependencies":{"chokidar":">=3.0.0 <4.0.0","immutable":"^4.0.0","source-map-js":">=0.6.2 <2.0.0"},"keywords":["style","scss","sass","preprocessor","css"],"types":"types/index.d.ts","version":"1.50.0","bin":{"sass":"sass.js"},"main":"sass.default.dart.js","exports":{"default":"./sass.default.dart.js"}}
|
||||
+99896
File diff suppressed because one or more lines are too long
+4
@@ -0,0 +1,4 @@
|
||||
var library = require('./sass.dart.js');
|
||||
library.load({});
|
||||
|
||||
module.exports = library;
|
||||
+9
@@ -0,0 +1,9 @@
|
||||
#!/usr/bin/env node
|
||||
|
||||
var library = require('./sass.dart.js');
|
||||
library.load({
|
||||
readline: require("readline"),
|
||||
chokidar: require("chokidar"),
|
||||
});
|
||||
|
||||
library.cli_pkg_main_0_(process.argv.slice(2));
|
||||
+152
@@ -0,0 +1,152 @@
|
||||
import {RawSourceMap} from 'source-map-js';
|
||||
|
||||
import {Options, StringOptions} from './options';
|
||||
|
||||
/**
|
||||
* The result of compiling Sass to CSS. Returned by [[compile]],
|
||||
* [[compileAsync]], [[compileString]], and [[compileStringAsync]].
|
||||
*
|
||||
* @category Compile
|
||||
*/
|
||||
export interface CompileResult {
|
||||
/**
|
||||
* The generated CSS.
|
||||
*
|
||||
* Note that this *never* includes a `sourceMapUrl` comment—it's up to the
|
||||
* caller to determine where to save the source map and how to link to it from
|
||||
* the stylesheet.
|
||||
*/
|
||||
css: string;
|
||||
|
||||
/**
|
||||
* The canonical URLs of all the stylesheets that were loaded during the
|
||||
* Sass compilation. The order of these URLs is not guaranteed.
|
||||
*/
|
||||
loadedUrls: URL[];
|
||||
|
||||
/**
|
||||
* The object representation of the source map that maps locations in the
|
||||
* generated CSS back to locations in the Sass source code.
|
||||
*
|
||||
* This typically uses absolute `file:` URLs to refer to Sass files, although
|
||||
* this can be controlled by having a custom [[Importer]] return
|
||||
* [[ImporterResult.sourceMapUrl]].
|
||||
*
|
||||
* This is set if and only if [[Options.sourceMap]] is `true`.
|
||||
*/
|
||||
sourceMap?: RawSourceMap;
|
||||
}
|
||||
|
||||
/**
|
||||
* Synchronously compiles the Sass file at `path` to CSS. If it succeeds it
|
||||
* returns a [[CompileResult]], and if it fails it throws an [[Exception]].
|
||||
*
|
||||
* This only allows synchronous [[Importer]]s and [[CustomFunction]]s.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* const sass = require('sass');
|
||||
*
|
||||
* const result = sass.compile("style.scss");
|
||||
* console.log(result.css);
|
||||
* ```
|
||||
*
|
||||
* @category Compile
|
||||
* @compatibility dart: "1.45.0", node: false
|
||||
*/
|
||||
export function compile(path: string, options?: Options<'sync'>): CompileResult;
|
||||
|
||||
/**
|
||||
* Asynchronously compiles the Sass file at `path` to CSS. Returns a promise
|
||||
* that resolves with a [[CompileResult]] if it succeeds and rejects with an
|
||||
* [[Exception]] if it fails.
|
||||
*
|
||||
* This only allows synchronous or asynchronous [[Importer]]s and
|
||||
* [[CustomFunction]]s.
|
||||
*
|
||||
* **Heads up!** When using Dart Sass, **[[compile]] is almost twice as fast as
|
||||
* [[compileAsync]]**, due to the overhead of making the entire evaluation
|
||||
* process asynchronous.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* const sass = require('sass');
|
||||
*
|
||||
* const result = await sass.compileAsync("style.scss");
|
||||
* console.log(result.css);
|
||||
* ```
|
||||
*
|
||||
* @category Compile
|
||||
* @compatibility dart: "1.45.0", node: false
|
||||
*/
|
||||
export function compileAsync(
|
||||
path: string,
|
||||
options?: Options<'async'>
|
||||
): Promise<CompileResult>;
|
||||
|
||||
/**
|
||||
* Synchronously compiles a stylesheet whose contents is `source` to CSS. If it
|
||||
* succeeds it returns a [[CompileResult]], and if it fails it throws an
|
||||
* [[Exception]].
|
||||
*
|
||||
* This only allows synchronous [[Importer]]s and [[CustomFunction]]s.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* const sass = require('sass');
|
||||
*
|
||||
* const result = sass.compileString(`
|
||||
* h1 {
|
||||
* font-size: 40px;
|
||||
* code {
|
||||
* font-face: Roboto Mono;
|
||||
* }
|
||||
* }`);
|
||||
* console.log(result.css);
|
||||
* ```
|
||||
*
|
||||
* @category Compile
|
||||
* @compatibility dart: "1.45.0", node: false
|
||||
*/
|
||||
export function compileString(
|
||||
source: string,
|
||||
options?: StringOptions<'sync'>
|
||||
): CompileResult;
|
||||
|
||||
/**
|
||||
* Asynchronously compiles a stylesheet whose contents is `source` to CSS.
|
||||
* Returns a promise that resolves with a [[CompileResult]] if it succeeds and
|
||||
* rejects with an [[Exception]] if it fails.
|
||||
*
|
||||
* This only allows synchronous or asynchronous [[Importer]]s and
|
||||
* [[CustomFunction]]s.
|
||||
*
|
||||
* **Heads up!** When using Dart Sass, **[[compile]] is almost twice as fast as
|
||||
* [[compileAsync]]**, due to the overhead of making the entire evaluation
|
||||
* process asynchronous.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* const sass = require('sass');
|
||||
*
|
||||
* const result = await sass.compileStringAsync(`
|
||||
* h1 {
|
||||
* font-size: 40px;
|
||||
* code {
|
||||
* font-face: Roboto Mono;
|
||||
* }
|
||||
* }`);
|
||||
* console.log(result.css);
|
||||
* ```
|
||||
*
|
||||
* @category Compile
|
||||
* @compatibility dart: "1.45.0", node: false
|
||||
*/
|
||||
export function compileStringAsync(
|
||||
source: string,
|
||||
options?: StringOptions<'async'>
|
||||
): Promise<CompileResult>;
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
import {SourceSpan} from './logger';
|
||||
|
||||
/**
|
||||
* An exception thrown because a Sass compilation failed.
|
||||
*
|
||||
* @category Other
|
||||
*/
|
||||
export class Exception extends Error {
|
||||
private constructor();
|
||||
|
||||
/**
|
||||
* A human-friendly representation of the exception.
|
||||
*
|
||||
* Because many tools simply print `Error.message` directly, this includes not
|
||||
* only the textual description of what went wrong (the [[sassMessage]]) but
|
||||
* also an indication of where in the Sass stylesheet the error occurred (the
|
||||
* [[span]]) and the Sass stack trace at the point of error (the
|
||||
* [[sassStack]]).
|
||||
*/
|
||||
message: string;
|
||||
|
||||
/**
|
||||
* A textual description of what went wrong.
|
||||
*
|
||||
* Unlike [[message]], this does *not* include representations of [[span]] or
|
||||
* [[sassStack]].
|
||||
*/
|
||||
readonly sassMessage: string;
|
||||
|
||||
/**
|
||||
* A human-friendly representation of the Sass stack trace at the point of
|
||||
* error.
|
||||
*/
|
||||
readonly sassStack: string;
|
||||
|
||||
/** The location the error occurred in the Sass file that triggered it. */
|
||||
readonly span: SourceSpan;
|
||||
|
||||
/** Returns the same string as [[message]]. */
|
||||
toString(): string;
|
||||
}
|
||||
+294
@@ -0,0 +1,294 @@
|
||||
import {Syntax} from './options';
|
||||
import {PromiseOr} from './util/promise_or';
|
||||
|
||||
/**
|
||||
* A special type of importer that redirects all loads to existing files on
|
||||
* disk. Although this is less powerful than a full [[Importer]], it
|
||||
* automatically takes care of Sass features like resolving partials and file
|
||||
* extensions and of loading the file from disk.
|
||||
*
|
||||
* Like all importers, this implements custom Sass loading logic for [`@use`
|
||||
* rules](https://sass-lang.com/documentation/at-rules/use) and [`@import`
|
||||
* rules](https://sass-lang.com/documentation/at-rules/import). It can be passed
|
||||
* to [[Options.importers]] or [[StringOptionsWithImporter.importer]].
|
||||
*
|
||||
* @typeParam sync - A `FileImporter<'sync'>`'s [[findFileUrl]] must return
|
||||
* synchronously, but in return it can be passed to [[compile]] and
|
||||
* [[compileString]] in addition to [[compileAsync]] and [[compileStringAsync]].
|
||||
*
|
||||
* A `FileImporter<'async'>`'s [[findFileUrl]] may either return synchronously
|
||||
* or asynchronously, but it can only be used with [[compileAsync]] and
|
||||
* [[compileStringAsync]].
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* const {pathToFileURL} = require('url');
|
||||
*
|
||||
* sass.compile('style.scss', {
|
||||
* importers: [{
|
||||
* // An importer that redirects relative URLs starting with "~" to
|
||||
* // `node_modules`.
|
||||
* findFileUrl(url) {
|
||||
* if (!url.startsWith('~')) return null;
|
||||
* return new URL(url.substring(1), pathToFileURL('node_modules'));
|
||||
* }
|
||||
* }]
|
||||
* });
|
||||
* ```
|
||||
*
|
||||
* @category Importer
|
||||
*/
|
||||
export interface FileImporter<
|
||||
sync extends 'sync' | 'async' = 'sync' | 'async'
|
||||
> {
|
||||
/**
|
||||
* A callback that's called to partially resolve a load (such as
|
||||
* [`@use`](https://sass-lang.com/documentation/at-rules/use) or
|
||||
* [`@import`](https://sass-lang.com/documentation/at-rules/import)) to a file
|
||||
* on disk.
|
||||
*
|
||||
* Unlike an [[Importer]], the compiler will automatically handle relative
|
||||
* loads for a [[FileImporter]]. See [[Options.importers]] for more details on
|
||||
* the way loads are resolved.
|
||||
*
|
||||
* @param url - The loaded URL. Since this might be relative, it's represented
|
||||
* as a string rather than a [[URL]] object.
|
||||
*
|
||||
* @param options.fromImport - Whether this is being invoked because of a Sass
|
||||
* `@import` rule, as opposed to a `@use` or `@forward` rule.
|
||||
*
|
||||
* This should *only* be used for determining whether or not to load
|
||||
* [import-only files](https://sass-lang.com/documentation/at-rules/import#import-only-files).
|
||||
*
|
||||
* @returns An absolute `file:` URL if this importer recognizes the `url`.
|
||||
* This may be only partially resolved: the compiler will automatically look
|
||||
* for [partials](https://sass-lang.com/documentation/at-rules/use#partials),
|
||||
* [index files](https://sass-lang.com/documentation/at-rules/use#index-files),
|
||||
* and file extensions based on the returned URL. An importer may also return
|
||||
* a fully resolved URL if it so chooses.
|
||||
*
|
||||
* If this importer doesn't recognize the URL, it should return `null` instead
|
||||
* to allow other importers or {@link Options.loadPaths | load paths} to
|
||||
* handle it.
|
||||
*
|
||||
* This may also return a `Promise`, but if it does the importer may only be
|
||||
* passed to [[compileAsync]] and [[compileStringAsync]], not [[compile]] or
|
||||
* [[compileString]].
|
||||
*
|
||||
* @throws any - If this importer recognizes `url` but determines that it's
|
||||
* invalid, it may throw an exception that will be wrapped by Sass. If the
|
||||
* exception object has a `message` property, it will be used as the wrapped
|
||||
* exception's message; otherwise, the exception object's `toString()` will be
|
||||
* used. This means it's safe for importers to throw plain strings.
|
||||
*/
|
||||
findFileUrl(
|
||||
url: string,
|
||||
options: {fromImport: boolean}
|
||||
): PromiseOr<URL | null, sync>;
|
||||
|
||||
/** @hidden */
|
||||
canonicalize?: never;
|
||||
}
|
||||
|
||||
/**
|
||||
* An object that implements custom Sass loading logic for [`@use`
|
||||
* rules](https://sass-lang.com/documentation/at-rules/use) and [`@import`
|
||||
* rules](https://sass-lang.com/documentation/at-rules/import). It can be passed
|
||||
* to [[Options.importers]] or [[StringOptionsWithImporter.importer]].
|
||||
*
|
||||
* Importers that simply redirect to files on disk are encouraged to use the
|
||||
* [[FileImporter]] interface instead.
|
||||
*
|
||||
* See [[Options.importers]] for more details on the way loads are resolved.
|
||||
*
|
||||
* @typeParam sync - An `Importer<'sync'>`'s [[canonicalize]] and [[load]] must
|
||||
* return synchronously, but in return it can be passed to [[compile]] and
|
||||
* [[compileString]] in addition to [[compileAsync]] and [[compileStringAsync]].
|
||||
*
|
||||
* An `Importer<'async'>`'s [[canonicalize]] and [[load]] may either return
|
||||
* synchronously or asynchronously, but it can only be used with
|
||||
* [[compileAsync]] and [[compileStringAsync]].
|
||||
*
|
||||
* @example Resolving a Load
|
||||
*
|
||||
* This is the process of resolving a load using a custom importer:
|
||||
*
|
||||
* - The compiler encounters `@use "db:foo/bar/baz"`.
|
||||
* - It calls [[canonicalize]] with `"db:foo/bar/baz"`.
|
||||
* - [[canonicalize]] returns `new URL("db:foo/bar/baz/_index.scss")`.
|
||||
* - If the compiler has already loaded a stylesheet with this canonical URL, it
|
||||
* re-uses the existing module.
|
||||
* - Otherwise, it calls [[load]] with `new URL("db:foo/bar/baz/_index.scss")`.
|
||||
* - [[load]] returns an [[ImporterResult]] that the compiler uses as the
|
||||
* contents of the module.
|
||||
*
|
||||
* @example Code Sample
|
||||
*
|
||||
* ```js
|
||||
* sass.compile('style.scss', {
|
||||
* // An importer for URLs like `bgcolor:orange` that generates a
|
||||
* // stylesheet with the given background color.
|
||||
* importers: [{
|
||||
* canonicalize(url) {
|
||||
* if (!url.startsWith('bgcolor:')) return null;
|
||||
* return new URL(url);
|
||||
* },
|
||||
* load(canonicalUrl) {
|
||||
* return {
|
||||
* contents: `body {background-color: ${canonicalUrl.pathname}}`,
|
||||
* syntax: 'scss'
|
||||
* };
|
||||
* }
|
||||
* }]
|
||||
* });
|
||||
* ```
|
||||
*
|
||||
* @category Importer
|
||||
*/
|
||||
export interface Importer<sync extends 'sync' | 'async' = 'sync' | 'async'> {
|
||||
/**
|
||||
* If `url` is recognized by this importer, returns its canonical format.
|
||||
*
|
||||
* If Sass has already loaded a stylesheet with the returned canonical URL, it
|
||||
* re-uses the existing parse tree (and the loaded module for `@use`). This
|
||||
* means that importers **must ensure** that the same canonical URL always
|
||||
* refers to the same stylesheet, *even across different importers*. As such,
|
||||
* importers are encouraged to use unique URL schemes to disambiguate between
|
||||
* one another.
|
||||
*
|
||||
* As much as possible, custom importers should canonicalize URLs the same way
|
||||
* as the built-in filesystem importer:
|
||||
*
|
||||
* - The importer should look for stylesheets by adding the prefix `_` to the
|
||||
* URL's basename, and by adding the extensions `.sass` and `.scss` if the
|
||||
* URL doesn't already have one of those extensions. For example, if the
|
||||
* URL was `foo/bar/baz`, the importer would look for:
|
||||
* - `foo/bar/baz.sass`
|
||||
* - `foo/bar/baz.scss`
|
||||
* - `foo/bar/_baz.sass`
|
||||
* - `foo/bar/_baz.scss`
|
||||
*
|
||||
* If the URL was `foo/bar/baz.scss`, the importer would just look for:
|
||||
* - `foo/bar/baz.scss`
|
||||
* - `foo/bar/_baz.scss`
|
||||
*
|
||||
* If the importer finds a stylesheet at more than one of these URLs, it
|
||||
* should throw an exception indicating that the URL is ambiguous. Note that
|
||||
* if the extension is explicitly specified, a stylesheet with the opposite
|
||||
* extension is allowed to exist.
|
||||
*
|
||||
* - If none of the possible paths is valid, the importer should perform the
|
||||
* same resolution on the URL followed by `/index`. In the example above,
|
||||
* it would look for:
|
||||
* - `foo/bar/baz/index.sass`
|
||||
* - `foo/bar/baz/index.scss`
|
||||
* - `foo/bar/baz/_index.sass`
|
||||
* - `foo/bar/baz/_index.scss`
|
||||
*
|
||||
* As above, if the importer finds a stylesheet at more than one of these
|
||||
* URLs, it should throw an exception indicating that the import is
|
||||
* ambiguous.
|
||||
*
|
||||
* If no stylesheets are found, the importer should return `null`.
|
||||
*
|
||||
* Calling [[canonicalize]] multiple times with the same URL must return the
|
||||
* same result. Calling [[canonicalize]] with a URL returned by a previous
|
||||
* call to [[canonicalize]] must return that URL.
|
||||
*
|
||||
* Relative loads in stylesheets loaded from an importer are handled by
|
||||
* resolving the loaded URL relative to the canonical URL of the stylesheet
|
||||
* that contains it, and passing that URL back to the importer's
|
||||
* [[canonicalize]] method. For example, suppose the "Resolving a Load"
|
||||
* example {@link Importer | above} returned a stylesheet that contained
|
||||
* `@use "mixins"`:
|
||||
*
|
||||
* - The compiler resolves the URL `mixins` relative to the current
|
||||
* stylesheet's canonical URL `db:foo/bar/baz/_index.scss` to get
|
||||
* `db:foo/bar/baz/mixins`.
|
||||
* - It calls [[canonicalize]] with `"db:foo/bar/baz/mixins"`.
|
||||
* - [[canonicalize]] returns `new URL("db:foo/bar/baz/_mixins.scss")`.
|
||||
*
|
||||
* Because of this, [[canonicalize]] must return a meaningful result when
|
||||
* called with a URL relative to one returned by an earlier call to
|
||||
* [[canonicalize]].
|
||||
*
|
||||
* @param url - The loaded URL. Since this might be relative, it's represented
|
||||
* as a string rather than a [[URL]] object.
|
||||
*
|
||||
* @param options.fromImport - Whether this is being invoked because of a Sass
|
||||
* `@import` rule, as opposed to a `@use` or `@forward` rule.
|
||||
*
|
||||
* This should *only* be used for determining whether or not to load
|
||||
* [import-only files](https://sass-lang.com/documentation/at-rules/import#import-only-files).
|
||||
*
|
||||
* @returns An absolute URL if this importer recognizes the `url`, or `null`
|
||||
* if it doesn't. If this returns `null`, other importers or {@link
|
||||
* Options.loadPaths | load paths} may handle the load.
|
||||
*
|
||||
* This may also return a `Promise`, but if it does the importer may only be
|
||||
* passed to [[compileAsync]] and [[compileStringAsync]], not [[compile]] or
|
||||
* [[compileString]].
|
||||
*
|
||||
* @throws any - If this importer recognizes `url` but determines that it's
|
||||
* invalid, it may throw an exception that will be wrapped by Sass. If the
|
||||
* exception object has a `message` property, it will be used as the wrapped
|
||||
* exception's message; otherwise, the exception object's `toString()` will be
|
||||
* used. This means it's safe for importers to throw plain strings.
|
||||
*/
|
||||
canonicalize(
|
||||
url: string,
|
||||
options: {fromImport: boolean}
|
||||
): PromiseOr<URL | null, sync>;
|
||||
|
||||
/**
|
||||
* Loads the Sass text for the given `canonicalUrl`, or returns `null` if this
|
||||
* importer can't find the stylesheet it refers to.
|
||||
*
|
||||
* @param canonicalUrl - The canonical URL of the stylesheet to load. This is
|
||||
* guaranteed to come from a call to [[canonicalize]], although not every call
|
||||
* to [[canonicalize]] will result in a call to [[load]].
|
||||
*
|
||||
* @returns The contents of the stylesheet at `canonicalUrl` if it can be
|
||||
* loaded, or `null` if it can't.
|
||||
*
|
||||
* This may also return a `Promise`, but if it does the importer may only be
|
||||
* passed to [[compileAsync]] and [[compileStringAsync]], not [[compile]] or
|
||||
* [[compileString]].
|
||||
*
|
||||
* @throws any - If this importer finds a stylesheet at `url` but it fails to
|
||||
* load for some reason, or if `url` is uniquely associated with this importer
|
||||
* but doesn't refer to a real stylesheet, the importer may throw an exception
|
||||
* that will be wrapped by Sass. If the exception object has a `message`
|
||||
* property, it will be used as the wrapped exception's message; otherwise,
|
||||
* the exception object's `toString()` will be used. This means it's safe for
|
||||
* importers to throw plain strings.
|
||||
*/
|
||||
load(canonicalUrl: URL): PromiseOr<ImporterResult | null, sync>;
|
||||
|
||||
/** @hidden */
|
||||
findFileUrl?: never;
|
||||
}
|
||||
|
||||
/**
|
||||
* The result of successfully loading a stylesheet with an [[Importer]].
|
||||
*
|
||||
* @category Importer
|
||||
*/
|
||||
export interface ImporterResult {
|
||||
/** The contents of the stylesheet. */
|
||||
contents: string;
|
||||
|
||||
/** The syntax with which to parse [[contents]]. */
|
||||
syntax: Syntax;
|
||||
|
||||
/**
|
||||
* The URL to use to link to the loaded stylesheet's source code in source
|
||||
* maps. A `file:` URL is ideal because it's accessible to both browsers and
|
||||
* other build tools, but an `http:` URL is also acceptable.
|
||||
*
|
||||
* If this isn't set, it defaults to a `data:` URL that contains the contents
|
||||
* of the loaded stylesheet.
|
||||
*/
|
||||
sourceMapUrl?: URL;
|
||||
}
|
||||
+80
@@ -0,0 +1,80 @@
|
||||
// This is a mirror of the JS API definitions in `spec/js-api`, but with comments
|
||||
// written to provide user-facing documentation rather than to specify behavior for
|
||||
// implementations.
|
||||
|
||||
export {
|
||||
CompileResult,
|
||||
compile,
|
||||
compileAsync,
|
||||
compileString,
|
||||
compileStringAsync,
|
||||
} from './compile';
|
||||
export {Exception} from './exception';
|
||||
export {FileImporter, Importer, ImporterResult} from './importer';
|
||||
export {Logger, SourceSpan, SourceLocation} from './logger';
|
||||
export {
|
||||
CustomFunction,
|
||||
Options,
|
||||
OutputStyle,
|
||||
StringOptions,
|
||||
StringOptionsWithImporter,
|
||||
StringOptionsWithoutImporter,
|
||||
Syntax,
|
||||
} from './options';
|
||||
export {PromiseOr} from './util/promise_or';
|
||||
export {
|
||||
ListSeparator,
|
||||
SassArgumentList,
|
||||
SassBoolean,
|
||||
SassColor,
|
||||
SassFunction,
|
||||
SassList,
|
||||
SassMap,
|
||||
SassNumber,
|
||||
SassString,
|
||||
Value,
|
||||
sassFalse,
|
||||
sassNull,
|
||||
sassTrue,
|
||||
} from './value';
|
||||
|
||||
// Legacy APIs
|
||||
export {LegacyException} from './legacy/exception';
|
||||
export {
|
||||
FALSE,
|
||||
LegacyAsyncFunction,
|
||||
LegacyAsyncFunctionDone,
|
||||
LegacyFunction,
|
||||
LegacySyncFunction,
|
||||
LegacyValue,
|
||||
NULL,
|
||||
TRUE,
|
||||
types,
|
||||
} from './legacy/function';
|
||||
export {
|
||||
LegacyAsyncImporter,
|
||||
LegacyImporter,
|
||||
LegacyImporterResult,
|
||||
LegacyImporterThis,
|
||||
LegacySyncImporter,
|
||||
} from './legacy/importer';
|
||||
export {
|
||||
LegacySharedOptions,
|
||||
LegacyFileOptions,
|
||||
LegacyStringOptions,
|
||||
LegacyOptions,
|
||||
} from './legacy/options';
|
||||
export {LegacyPluginThis} from './legacy/plugin_this';
|
||||
export {LegacyResult, render, renderSync} from './legacy/render';
|
||||
|
||||
/**
|
||||
* Information about the Sass implementation. This always begins with a unique
|
||||
* identifier for the Sass implementation, followed by U+0009 TAB, followed by
|
||||
* its npm package version. Some implementations include additional information
|
||||
* as well, but not in any standardized format.
|
||||
*
|
||||
* * For Dart Sass, the implementation name is `dart-sass`.
|
||||
* * For Node Sass, the implementation name is `node-sass`.
|
||||
* * For the embedded host, the implementation name is `sass-embedded`.
|
||||
*/
|
||||
export const info: string;
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
/**
|
||||
* The exception type thrown by [[renderSync]] and passed as the error to
|
||||
* [[render]]'s callback.
|
||||
*
|
||||
* @category Legacy
|
||||
* @deprecated This is only thrown by the legacy [[render]] and [[renderSync]]
|
||||
* APIs. Use [[compile]], [[compileString]], [[compileAsync]], and
|
||||
* [[compileStringAsync]] instead.
|
||||
*/
|
||||
export interface LegacyException extends Error {
|
||||
/**
|
||||
* The error message. For Dart Sass, when possible this includes a highlighted
|
||||
* indication of where in the source file the error occurred as well as the
|
||||
* Sass stack trace.
|
||||
*/
|
||||
message: string;
|
||||
|
||||
/**
|
||||
* The error message. For Dart Sass, this is the same as the result of calling
|
||||
* [[toString]], which is itself the same as [[message]] but with the prefix
|
||||
* "Error:".
|
||||
*/
|
||||
formatted: string;
|
||||
|
||||
/**
|
||||
* The (1-based) line number on which the error occurred, if this exception is
|
||||
* associated with a specific Sass file location.
|
||||
*/
|
||||
line?: number;
|
||||
|
||||
/**
|
||||
* The (1-based) column number within [[line]] at which the error occurred, if
|
||||
* this exception is associated with a specific Sass file location.
|
||||
*/
|
||||
column?: number;
|
||||
|
||||
/**
|
||||
* Analogous to the exit code for an executable. `1` for an error caused by a
|
||||
* Sass file, `3` for any other type of error.
|
||||
*/
|
||||
status: number;
|
||||
|
||||
/**
|
||||
* If this exception was caused by an error in a Sass file, this will
|
||||
* represent the Sass file's location. It can be in one of three formats:
|
||||
*
|
||||
* * If the Sass file was loaded from disk, this is the path to that file.
|
||||
* * If the Sass file was generated by an importer, this is its canonical URL.
|
||||
* * If the Sass file was passed as [[LegacyStringOptions.data]] without a
|
||||
* corresponding [[LegacyStringOptions.file]], this is the special string
|
||||
* `"stdin"`.
|
||||
*/
|
||||
file?: string;
|
||||
}
|
||||
+756
@@ -0,0 +1,756 @@
|
||||
import {LegacyPluginThis} from './plugin_this';
|
||||
|
||||
/**
|
||||
* A synchronous callback that implements a custom Sass function. This can be
|
||||
* passed to [[LegacySharedOptions.functions]] for either [[render]] or
|
||||
* [[renderSync]].
|
||||
*
|
||||
* If this throws an error, Sass will treat that as the function failing with
|
||||
* that error message.
|
||||
*
|
||||
* ```js
|
||||
* const result = sass.renderSync({
|
||||
* file: 'style.scss',
|
||||
* functions: {
|
||||
* "sum($arg1, $arg2)": (arg1, arg2) => {
|
||||
* if (!(arg1 instanceof sass.types.Number)) {
|
||||
* throw new Error("$arg1: Expected a number");
|
||||
* } else if (!(arg2 instanceof sass.types.Number)) {
|
||||
* throw new Error("$arg2: Expected a number");
|
||||
* }
|
||||
* return new sass.types.Number(arg1.getValue() + arg2.getValue());
|
||||
* }
|
||||
* }
|
||||
* });
|
||||
* ```
|
||||
*
|
||||
* @param args - One argument for each argument that's declared in the signature
|
||||
* that's passed to [[LegacySharedOptions.functions]]. If the signature [takes
|
||||
* arbitrary arguments](https://sass-lang.com/documentation/at-rules/function#taking-arbitrary-arguments),
|
||||
* they're passed as a single argument list in the last argument.
|
||||
*
|
||||
* @category Legacy
|
||||
* @deprecated This only works with the legacy [[render]] and [[renderSync]]
|
||||
* APIs. Use [[CustomFunction]] with [[compile]], [[compileString]],
|
||||
* [[compileAsync]], and [[compileStringAsync]] instead.
|
||||
*/
|
||||
export type LegacySyncFunction = (
|
||||
this: LegacyPluginThis,
|
||||
...args: LegacyValue[]
|
||||
) => LegacyValue;
|
||||
|
||||
/**
|
||||
* An asynchronous callback that implements a custom Sass function. This can be
|
||||
* passed to [[LegacySharedOptions.functions]], but only for [[render]].
|
||||
*
|
||||
* An asynchronous function must return `undefined`. Its final argument will
|
||||
* always be a callback, which it should call with the result of the function
|
||||
* once it's done running.
|
||||
*
|
||||
* If this throws an error, Sass will treat that as the function failing with
|
||||
* that error message.
|
||||
*
|
||||
* ```js
|
||||
* sass.render({
|
||||
* file: 'style.scss',
|
||||
* functions: {
|
||||
* "sum($arg1, $arg2)": (arg1, arg2, done) => {
|
||||
* if (!(arg1 instanceof sass.types.Number)) {
|
||||
* throw new Error("$arg1: Expected a number");
|
||||
* } else if (!(arg2 instanceof sass.types.Number)) {
|
||||
* throw new Error("$arg2: Expected a number");
|
||||
* }
|
||||
* done(new sass.types.Number(arg1.getValue() + arg2.getValue()));
|
||||
* }
|
||||
* }
|
||||
* }, (result, error) => {
|
||||
* // ...
|
||||
* });
|
||||
* ```
|
||||
*
|
||||
* This is passed one argument for each argument that's declared in the
|
||||
* signature that's passed to [[LegacySharedOptions.functions]]. If the
|
||||
* signature [takes arbitrary
|
||||
* arguments](https://sass-lang.com/documentation/at-rules/function#taking-arbitrary-arguments),
|
||||
* they're passed as a single argument list in the last argument before the
|
||||
* callback.
|
||||
*
|
||||
* @category Legacy
|
||||
* @deprecated This only works with the legacy [[render]] and [[renderSync]]
|
||||
* APIs. Use [[CustomFunction]] with [[compile]], [[compileString]],
|
||||
* [[compileAsync]], and [[compileStringAsync]] instead.
|
||||
*/
|
||||
export type LegacyAsyncFunction =
|
||||
| ((this: LegacyPluginThis, done: (result: LegacyValue) => void) => void)
|
||||
| ((
|
||||
this: LegacyPluginThis,
|
||||
arg1: LegacyValue,
|
||||
done: LegacyAsyncFunctionDone
|
||||
) => void)
|
||||
| ((
|
||||
this: LegacyPluginThis,
|
||||
arg1: LegacyValue,
|
||||
arg2: LegacyValue,
|
||||
done: LegacyAsyncFunctionDone
|
||||
) => void)
|
||||
| ((
|
||||
this: LegacyPluginThis,
|
||||
arg1: LegacyValue,
|
||||
arg2: LegacyValue,
|
||||
arg3: LegacyValue,
|
||||
done: LegacyAsyncFunctionDone
|
||||
) => void)
|
||||
| ((
|
||||
this: LegacyPluginThis,
|
||||
arg1: LegacyValue,
|
||||
arg2: LegacyValue,
|
||||
arg3: LegacyValue,
|
||||
arg4: LegacyValue,
|
||||
done: LegacyAsyncFunctionDone
|
||||
) => void)
|
||||
| ((
|
||||
this: LegacyPluginThis,
|
||||
arg1: LegacyValue,
|
||||
arg2: LegacyValue,
|
||||
arg3: LegacyValue,
|
||||
arg4: LegacyValue,
|
||||
arg5: LegacyValue,
|
||||
done: LegacyAsyncFunctionDone
|
||||
) => void)
|
||||
| ((
|
||||
this: LegacyPluginThis,
|
||||
arg1: LegacyValue,
|
||||
arg2: LegacyValue,
|
||||
arg3: LegacyValue,
|
||||
arg4: LegacyValue,
|
||||
arg5: LegacyValue,
|
||||
arg6: LegacyValue,
|
||||
done: LegacyAsyncFunctionDone
|
||||
) => void)
|
||||
| ((
|
||||
this: LegacyPluginThis,
|
||||
...args: [...LegacyValue[], LegacyAsyncFunctionDone]
|
||||
) => void);
|
||||
|
||||
/**
|
||||
* The function called by a [[LegacyAsyncFunction]] to indicate that it's
|
||||
* finished.
|
||||
*
|
||||
* @param result - If this is a [[LegacyValue]], that indicates that the
|
||||
* function call completed successfully. If it's a [[types.Error]], that
|
||||
* indicates that the function call failed.
|
||||
*
|
||||
* @category Legacy
|
||||
* @deprecated This only works with the legacy [[render]] and [[renderSync]]
|
||||
* APIs. Use [[CustomFunction]] with [[compile]], [[compileString]],
|
||||
* [[compileAsync]], and [[compileStringAsync]] instead.
|
||||
*/
|
||||
export type LegacyAsyncFunctionDone = (
|
||||
result: LegacyValue | types.Error
|
||||
) => void;
|
||||
|
||||
/**
|
||||
* A callback that implements a custom Sass function. For [[renderSync]], this
|
||||
* must be a [[LegacySyncFunction]] which returns its result directly; for
|
||||
* [[render]], it may be either a [[LegacySyncFunction]] or a
|
||||
* [[LegacyAsyncFunction]] which calls a callback with its result.
|
||||
*
|
||||
* See [[LegacySharedOptions.functions]] for more details.
|
||||
*
|
||||
* @category Legacy
|
||||
* @deprecated This only works with the legacy [[render]] and [[renderSync]]
|
||||
* APIs. Use [[CustomFunction]] with [[compile]], [[compileString]],
|
||||
* [[compileAsync]], and [[compileStringAsync]] instead.
|
||||
*/
|
||||
export type LegacyFunction<sync extends 'sync' | 'async'> = sync extends 'async'
|
||||
? LegacySyncFunction | LegacyAsyncFunction
|
||||
: LegacySyncFunction;
|
||||
|
||||
/**
|
||||
* A type representing all the possible values that may be passed to or returned
|
||||
* from a [[LegacyFunction]].
|
||||
*
|
||||
* @category Legacy
|
||||
* @deprecated This only works with the legacy [[render]] and [[renderSync]]
|
||||
* APIs. Use [[Value]] with [[compile]], [[compileString]], [[compileAsync]],
|
||||
* and [[compileStringAsync]] instead.
|
||||
*/
|
||||
export type LegacyValue =
|
||||
| types.Null
|
||||
| types.Number
|
||||
| types.String
|
||||
| types.Boolean
|
||||
| types.Color
|
||||
| types.List
|
||||
| types.Map;
|
||||
|
||||
/**
|
||||
* A shorthand for `sass.types.Boolean.TRUE`.
|
||||
*
|
||||
* @category Legacy
|
||||
* @deprecated This only works with the legacy [[render]] and [[renderSync]]
|
||||
* APIs. Use [[sassTrue]] with [[compile]], [[compileString]], [[compileAsync]],
|
||||
* and [[compileStringAsync]] instead.
|
||||
*/
|
||||
export const TRUE: types.Boolean<true>;
|
||||
|
||||
/**
|
||||
* A shorthand for `sass.types.Boolean.FALSE`.
|
||||
*
|
||||
* @category Legacy
|
||||
* @deprecated This only works with the legacy [[render]] and [[renderSync]]
|
||||
* APIs. Use [[sassFalse]] with [[compile]], [[compileString]], [[compileAsync]],
|
||||
* and [[compileStringAsync]] instead.
|
||||
*/
|
||||
export const FALSE: types.Boolean<false>;
|
||||
|
||||
/**
|
||||
* A shorthand for `sass.types.Null.NULL`.
|
||||
*
|
||||
* @category Legacy
|
||||
* @deprecated This only works with the legacy [[render]] and [[renderSync]]
|
||||
* APIs. Use [[sassNull]] with [[compile]], [[compileString]], [[compileAsync]],
|
||||
* and [[compileStringAsync]] instead.
|
||||
*/
|
||||
export const NULL: types.Null;
|
||||
|
||||
/**
|
||||
* The namespace for value types used in the legacy function API.
|
||||
*
|
||||
* @category Legacy
|
||||
* @deprecated This only works with the legacy [[render]] and [[renderSync]]
|
||||
* APIs. Use [[Value]] with [[compile]], [[compileString]], [[compileAsync]],
|
||||
* and [[compileStringAsync]] instead.
|
||||
*/
|
||||
export namespace types {
|
||||
/**
|
||||
* The class for Sass's singleton [`null`
|
||||
* value](https://sass-lang.com/documentation/values/null). The value itself
|
||||
* can be accessed through the [[NULL]] field.
|
||||
*/
|
||||
export class Null {
|
||||
/** Sass's singleton `null` value. */
|
||||
static readonly NULL: Null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sass's [number type](https://sass-lang.com/documentation/values/numbers).
|
||||
*/
|
||||
export class Number {
|
||||
/**
|
||||
* @param value - The numeric value of the number.
|
||||
*
|
||||
* @param unit - If passed, the number's unit.
|
||||
*
|
||||
* Complex units can be represented as
|
||||
* `<unit>*<unit>*.../<unit>*<unit>*...`, with numerator units on the
|
||||
* left-hand side of the `/` and denominator units on the right. A number
|
||||
* with only numerator units may omit the `/` and the units after it, and a
|
||||
* number with only denominator units may be represented
|
||||
* with no units before the `/`.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```scss
|
||||
* new sass.types.Number(0.5); // == 0.5
|
||||
* new sass.types.Number(10, "px"); // == 10px
|
||||
* new sass.types.Number(10, "px*px"); // == 10px * 1px
|
||||
* new sass.types.Number(10, "px/s"); // == math.div(10px, 1s)
|
||||
* new sass.types.Number(10, "px*px/s*s"); // == 10px * math.div(math.div(1px, 1s), 1s)
|
||||
* ```
|
||||
*/
|
||||
constructor(value: number, unit?: string);
|
||||
|
||||
/**
|
||||
* Returns the value of the number, ignoring units.
|
||||
*
|
||||
* **Heads up!** This means that `96px` and `1in` will return different
|
||||
* values, even though they represent the same length.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* const number = new sass.types.Number(10, "px");
|
||||
* number.getValue(); // 10
|
||||
* ```
|
||||
*/
|
||||
getValue(): number;
|
||||
|
||||
/**
|
||||
* Destructively modifies this number by setting its numeric value to
|
||||
* `value`, independent of its units.
|
||||
*
|
||||
* @deprecated Use [[constructor]] instead.
|
||||
*/
|
||||
setValue(value: number): void;
|
||||
|
||||
/**
|
||||
* Returns a string representation of this number's units. Complex units are
|
||||
* returned in the same format that [[constructor]] accepts them.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* // number is `10px`.
|
||||
* number.getUnit(); // "px"
|
||||
*
|
||||
* // number is `math.div(10px, 1s)`.
|
||||
* number.getUnit(); // "px/s"
|
||||
* ```
|
||||
*/
|
||||
getUnit(): string;
|
||||
|
||||
/**
|
||||
* Destructively modifies this number by setting its units to `unit`,
|
||||
* independent of its numeric value. Complex units are specified in the same
|
||||
* format as [[constructor]].
|
||||
*
|
||||
* @deprecated Use [[constructor]] instead.
|
||||
*/
|
||||
setUnit(unit: string): void;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sass's [string type](https://sass-lang.com/documentation/values/strings).
|
||||
*
|
||||
* **Heads up!** This API currently provides no way of distinguishing between
|
||||
* a [quoted](https://sass-lang.com/documentation/values/strings#quoted) and
|
||||
* [unquoted](https://sass-lang.com/documentation/values/strings#unquoted)
|
||||
* string.
|
||||
*/
|
||||
export class String {
|
||||
/**
|
||||
* Creates an unquoted string with the given contents.
|
||||
*
|
||||
* **Heads up!** This API currently provides no way of creating a
|
||||
* [quoted](https://sass-lang.com/documentation/values/strings#quoted)
|
||||
* string.
|
||||
*/
|
||||
constructor(value: string);
|
||||
|
||||
/**
|
||||
* Returns the contents of the string. If the string contains escapes,
|
||||
* those escapes are included literally if it’s
|
||||
* [unquoted](https://sass-lang.com/documentation/values/strings#unquoted),
|
||||
* while the values of the escapes are included if it’s
|
||||
* [quoted](https://sass-lang.com/documentation/values/strings#quoted).
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```
|
||||
* // string is `Arial`.
|
||||
* string.getValue(); // "Arial"
|
||||
*
|
||||
* // string is `"Helvetica Neue"`.
|
||||
* string.getValue(); // "Helvetica Neue"
|
||||
*
|
||||
* // string is `\1F46D`.
|
||||
* string.getValue(); // "\\1F46D"
|
||||
*
|
||||
* // string is `"\1F46D"`.
|
||||
* string.getValue(); // "👭"
|
||||
* ```
|
||||
*/
|
||||
getValue(): string;
|
||||
|
||||
/**
|
||||
* Destructively modifies this string by setting its numeric value to
|
||||
* `value`.
|
||||
*
|
||||
* **Heads up!** Even if the string was originally quoted, this will cause
|
||||
* it to become unquoted.
|
||||
*
|
||||
* @deprecated Use [[constructor]] instead.
|
||||
*/
|
||||
setValue(value: string): void;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sass's [boolean type](https://sass-lang.com/documentation/values/booleans).
|
||||
*
|
||||
* Custom functions should respect Sass’s notion of
|
||||
* [truthiness](https://sass-lang.com/documentation/at-rules/control/if#truthiness-and-falsiness)
|
||||
* by treating `false` and `null` as falsey and everything else as truthy.
|
||||
*
|
||||
* **Heads up!** Boolean values can't be constructed, they can only be
|
||||
* accessed through the [[TRUE]] and [[FALSE]] constants.
|
||||
*/
|
||||
export class Boolean<T extends boolean = boolean> {
|
||||
/**
|
||||
* Returns `true` if this is Sass's `true` value and `false` if this is
|
||||
* Sass's `false` value.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* // boolean is `true`.
|
||||
* boolean.getValue(); // true
|
||||
* boolean === sass.types.Boolean.TRUE; // true
|
||||
*
|
||||
* // boolean is `false`.
|
||||
* boolean.getValue(); // false
|
||||
* boolean === sass.types.Boolean.FALSE; // true
|
||||
* ```
|
||||
*/
|
||||
getValue(): T;
|
||||
|
||||
/** Sass's `true` value. */
|
||||
static readonly TRUE: Boolean<true>;
|
||||
|
||||
/** Sass's `false` value. */
|
||||
static readonly FALSE: Boolean<false>;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sass's [color type](https://sass-lang.com/documentation/values/colors).
|
||||
*/
|
||||
export class Color {
|
||||
/**
|
||||
* Creates a new Sass color with the given red, green, blue, and alpha
|
||||
* channels. The red, green, and blue channels must be integers between 0
|
||||
* and 255 (inclusive), and alpha must be between 0 and 1 (inclusive).
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* new sass.types.Color(107, 113, 127); // #6b717f
|
||||
* new sass.types.Color(0, 0, 0, 0); // rgba(0, 0, 0, 0)
|
||||
* ```
|
||||
*/
|
||||
constructor(r: number, g: number, b: number, a?: number);
|
||||
|
||||
/**
|
||||
* Creates a new Sass color with alpha, red, green, and blue channels taken
|
||||
* from respective two-byte chunks of a hexidecimal number.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* new sass.types.Color(0xff6b717f); // #6b717f
|
||||
* new sass.types.Color(0x00000000); // rgba(0, 0, 0, 0)
|
||||
* ```
|
||||
*/
|
||||
constructor(argb: number);
|
||||
|
||||
/**
|
||||
* Returns the red channel of the color as an integer from 0 to 255.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* // color is `#6b717f`.
|
||||
* color.getR(); // 107
|
||||
*
|
||||
* // color is `#b37399`.
|
||||
* color.getR(); // 179
|
||||
* ```
|
||||
*/
|
||||
getR(): number;
|
||||
|
||||
/**
|
||||
* Sets the red channel of the color. The value must be an integer between 0
|
||||
* and 255 (inclusive).
|
||||
*
|
||||
* @deprecated Use [[constructor]] instead.
|
||||
*/
|
||||
setR(value: number): void;
|
||||
|
||||
/**
|
||||
* Returns the green channel of the color as an integer from 0 to 255.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* // color is `#6b717f`.
|
||||
* color.getG(); // 113
|
||||
*
|
||||
* // color is `#b37399`.
|
||||
* color.getG(); // 115
|
||||
* ```
|
||||
*/
|
||||
getG(): number;
|
||||
|
||||
/**
|
||||
* Sets the green channel of the color. The value must be an integer between
|
||||
* 0 and 255 (inclusive).
|
||||
*
|
||||
* @deprecated Use [[constructor]] instead.
|
||||
*/
|
||||
setG(value: number): void;
|
||||
|
||||
/**
|
||||
* Returns the blue channel of the color as an integer from 0 to 255.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* // color is `#6b717f`.
|
||||
* color.getB(); // 127
|
||||
*
|
||||
* // color is `#b37399`.
|
||||
* color.getB(); // 153
|
||||
* ```
|
||||
*/
|
||||
getB(): number;
|
||||
|
||||
/**
|
||||
* Sets the blue channel of the color. The value must be an integer between
|
||||
* 0 and 255 (inclusive).
|
||||
*
|
||||
* @deprecated Use [[constructor]] instead.
|
||||
*/
|
||||
setB(value: number): void;
|
||||
|
||||
/**
|
||||
* Returns the alpha channel of the color as a number from 0 to 1.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* // color is `#6b717f`.
|
||||
* color.getA(); // 1
|
||||
*
|
||||
* // color is `transparent`.
|
||||
* color.getA(); // 0
|
||||
* ```
|
||||
*/
|
||||
getA(): number;
|
||||
|
||||
/**
|
||||
* Sets the alpha channel of the color. The value must be between 0 and 1
|
||||
* (inclusive).
|
||||
*
|
||||
* @deprecated Use [[constructor]] instead.
|
||||
*/
|
||||
setA(value: number): void;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sass's [list type](https://sass-lang.com/documentation/values/lists).
|
||||
*
|
||||
* **Heads up!** This list type’s methods use 0-based indexing, even though
|
||||
* within Sass lists use 1-based indexing. These methods also don’t support
|
||||
* using negative numbers to index backwards from the end of the list.
|
||||
*/
|
||||
export class List {
|
||||
/**
|
||||
* Creates a new Sass list.
|
||||
*
|
||||
* **Heads up!** The initial values of the list elements are undefined.
|
||||
* These elements must be set using [[setValue]] before accessing them or
|
||||
* passing the list back to Sass.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* const list = new sass.types.List(3);
|
||||
* list.setValue(0, new sass.types.Number(10, "px"));
|
||||
* list.setValue(1, new sass.types.Number(15, "px"));
|
||||
* list.setValue(2, new sass.types.Number(32, "px"));
|
||||
* list; // 10px, 15px, 32px
|
||||
* ```
|
||||
*
|
||||
* @param length - The number of (initially undefined) elements in the list.
|
||||
* @param commaSeparator - If `true`, the list is comma-separated; otherwise,
|
||||
* it's space-separated. Defaults to `true`.
|
||||
*/
|
||||
constructor(length: number, commaSeparator?: boolean);
|
||||
|
||||
/**
|
||||
* Returns the element at `index`, or `undefined` if that value hasn't yet
|
||||
* been set.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* // list is `10px, 15px, 32px`
|
||||
* list.getValue(0); // 10px
|
||||
* list.getValue(2); // 32px
|
||||
* ```
|
||||
*
|
||||
* @param index - A (0-based) index into this list.
|
||||
* @throws `Error` if `index` is less than 0 or greater than or equal to the
|
||||
* number of elements in this list.
|
||||
*/
|
||||
getValue(index: number): LegacyValue | undefined;
|
||||
|
||||
/**
|
||||
* Sets the element at `index` to `value`.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* // list is `10px, 15px, 32px`
|
||||
* list.setValue(1, new sass.types.Number(18, "px"));
|
||||
* list; // 10px, 18px, 32px
|
||||
* ```
|
||||
*
|
||||
* @param index - A (0-based) index into this list.
|
||||
* @throws `Error` if `index` is less than 0 or greater than or equal to the
|
||||
* number of elements in this list.
|
||||
*/
|
||||
setValue(index: number, value: LegacyValue): void;
|
||||
|
||||
/**
|
||||
* Returns `true` if this list is comma-separated and `false` otherwise.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* // list is `10px, 15px, 32px`
|
||||
* list.getSeparator(); // true
|
||||
*
|
||||
* // list is `1px solid`
|
||||
* list.getSeparator(); // false
|
||||
* ```
|
||||
*/
|
||||
getSeparator(): boolean;
|
||||
|
||||
/**
|
||||
* Sets whether the list is comma-separated.
|
||||
*
|
||||
* @param isComma - `true` to make the list comma-separated, `false` otherwise.
|
||||
*/
|
||||
setSeparator(isComma: boolean): void;
|
||||
|
||||
/**
|
||||
* Returns the number of elements in the list.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* // list is `10px, 15px, 32px`
|
||||
* list.getLength(); // 3
|
||||
*
|
||||
* // list is `1px solid`
|
||||
* list.getLength(); // 2
|
||||
* ```
|
||||
*/
|
||||
getLength(): number;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sass's [map type](https://sass-lang.com/documentation/values/maps).
|
||||
*
|
||||
* **Heads up!** This map type is represented as a list of key-value pairs
|
||||
* rather than a mapping from keys to values. The only way to find the value
|
||||
* associated with a given key is to iterate through the map checking for that
|
||||
* key. Maps created through this API are still forbidden from having duplicate
|
||||
* keys.
|
||||
*/
|
||||
export class Map {
|
||||
/**
|
||||
* Creates a new Sass map.
|
||||
*
|
||||
* **Heads up!** The initial keys and values of the map are undefined. They
|
||||
* must be set using [[setKey]] and [[setValue]] before accessing them or
|
||||
* passing the map back to Sass.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* const map = new sass.types.Map(2);
|
||||
* map.setKey(0, new sass.types.String("width"));
|
||||
* map.setValue(0, new sass.types.Number(300, "px"));
|
||||
* map.setKey(1, new sass.types.String("height"));
|
||||
* map.setValue(1, new sass.types.Number(100, "px"));
|
||||
* map; // (width: 300px, height: 100px)
|
||||
* ```
|
||||
*
|
||||
* @param length - The number of (initially undefined) key/value pairs in the map.
|
||||
*/
|
||||
constructor(length: number);
|
||||
|
||||
/**
|
||||
* Returns the value in the key/value pair at `index`.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* // map is `(width: 300px, height: 100px)`
|
||||
* map.getValue(0); // 300px
|
||||
* map.getValue(1); // 100px
|
||||
* ```
|
||||
*
|
||||
* @param index - A (0-based) index of a key/value pair in this map.
|
||||
* @throws `Error` if `index` is less than 0 or greater than or equal to the
|
||||
* number of pairs in this map.
|
||||
*/
|
||||
getValue(index: number): LegacyValue;
|
||||
|
||||
/**
|
||||
* Sets the value in the key/value pair at `index` to `value`.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* // map is `("light": 200, "medium": 400, "bold": 600)`
|
||||
* map.setValue(1, new sass.types.Number(300));
|
||||
* map; // ("light": 200, "medium": 300, "bold": 600)
|
||||
* ```
|
||||
*
|
||||
* @param index - A (0-based) index of a key/value pair in this map.
|
||||
* @throws `Error` if `index` is less than 0 or greater than or equal to the
|
||||
* number of pairs in this map.
|
||||
*/
|
||||
setValue(index: number, value: LegacyValue): void;
|
||||
|
||||
/**
|
||||
* Returns the key in the key/value pair at `index`.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* // map is `(width: 300px, height: 100px)`
|
||||
* map.getKey(0); // width
|
||||
* map.getKey(1); // height
|
||||
* ```
|
||||
*
|
||||
* @param index - A (0-based) index of a key/value pair in this map.
|
||||
* @throws `Error` if `index` is less than 0 or greater than or equal to the
|
||||
* number of pairs in this map.
|
||||
*/
|
||||
getKey(index: number): LegacyValue;
|
||||
|
||||
/**
|
||||
* Sets the value in the key/value pair at `index` to `value`.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* // map is `("light": 200, "medium": 400, "bold": 600)`
|
||||
* map.setValue(1, new sass.types.String("lighter"));
|
||||
* map; // ("lighter": 200, "medium": 300, "bold": 600)
|
||||
* ```
|
||||
*
|
||||
* @param index - A (0-based) index of a key/value pair in this map.
|
||||
* @throws `Error` if `index` is less than 0 or greater than or equal to the
|
||||
* number of pairs in this map.
|
||||
*/
|
||||
setKey(index: number, key: LegacyValue): void;
|
||||
|
||||
/**
|
||||
* Returns the number of key/value pairs in this map.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* // map is `("light": 200, "medium": 400, "bold": 600)`
|
||||
* map.getLength(); // 3
|
||||
*
|
||||
* // map is `(width: 300px, height: 100px)`
|
||||
* map.getLength(); // 2
|
||||
* ```
|
||||
*/
|
||||
getLength(): number;
|
||||
}
|
||||
|
||||
/**
|
||||
* An error that can be returned from a Sass function to signal that it
|
||||
* encountered an error. This is the only way to signal an error
|
||||
* asynchronously from a [[LegacyAsyncFunction]].
|
||||
*/
|
||||
export class Error {
|
||||
constructor(message: string);
|
||||
}
|
||||
}
|
||||
+168
@@ -0,0 +1,168 @@
|
||||
import {LegacyPluginThis} from './plugin_this';
|
||||
|
||||
/**
|
||||
* The value of `this` in the context of a [[LegacyImporter]] function.
|
||||
*
|
||||
* @category Legacy
|
||||
* @deprecated This is only used by the legacy [[render]] and [[renderSync]]
|
||||
* APIs. Use [[Importer]] with [[compile]], [[compileString]], [[compileAsync]],
|
||||
* and [[compileStringAsync]] instead.
|
||||
*/
|
||||
interface LegacyImporterThis extends LegacyPluginThis {
|
||||
/**
|
||||
* Whether the importer is being invoked because of a Sass `@import` rule, as
|
||||
* opposed to a `@use` or `@forward` rule.
|
||||
*
|
||||
* This should *only* be used for determining whether or not to load
|
||||
* [import-only files](https://sass-lang.com/documentation/at-rules/import#import-only-files).
|
||||
*
|
||||
* @compatibility dart: "1.33.0", node: false
|
||||
*/
|
||||
fromImport: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* The result of running a [[LegacyImporter]]. It must be one of the following
|
||||
* types:
|
||||
*
|
||||
* * An object with the key `contents` whose value is the contents of a stylesheet
|
||||
* (in SCSS syntax). This causes Sass to load that stylesheet’s contents.
|
||||
*
|
||||
* * An object with the key `file` whose value is a path on disk. This causes Sass
|
||||
* to load that file as though it had been imported directly.
|
||||
*
|
||||
* * `null`, which indicates that it doesn’t recognize the URL and another
|
||||
* importer should be tried instead.
|
||||
*
|
||||
* * An [Error](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error)
|
||||
* object, indicating that importing failed.
|
||||
*
|
||||
* @category Legacy
|
||||
* @deprecated This only works with the legacy [[render]] and [[renderSync]]
|
||||
* APIs. Use [[ImporterResult]] with [[compile]], [[compileString]],
|
||||
* [[compileAsync]], and [[compileStringAsync]] instead.
|
||||
*/
|
||||
export type LegacyImporterResult =
|
||||
| {file: string}
|
||||
| {contents: string}
|
||||
| Error
|
||||
| null;
|
||||
|
||||
/**
|
||||
* A synchronous callback that implements custom Sass loading logic for
|
||||
* [`@import` rules](https://sass-lang.com/documentation/at-rules/import) and
|
||||
* [`@use` rules](https://sass-lang.com/documentation/at-rules/use). This can be
|
||||
* passed to [[LegacySharedOptions.importer]] for either [[render]] or
|
||||
* [[renderSync]].
|
||||
*
|
||||
* See [[LegacySharedOptions.importer]] for more detailed documentation.
|
||||
*
|
||||
* ```js
|
||||
* sass.renderSync({
|
||||
* file: "style.scss",
|
||||
* importer: [
|
||||
* function(url, prev) {
|
||||
* if (url != "big-headers") return null;
|
||||
*
|
||||
* return {
|
||||
* contents: 'h1 { font-size: 40px; }'
|
||||
* };
|
||||
* }
|
||||
* ]
|
||||
* });
|
||||
* ```
|
||||
*
|
||||
* @param url - The `@use` or `@import` rule’s URL as a string, exactly as it
|
||||
* appears in the stylesheet.
|
||||
*
|
||||
* @param prev - A string identifying the stylesheet that contained the `@use`
|
||||
* or `@import`. This string’s format depends on how that stylesheet was loaded:
|
||||
*
|
||||
* * If the stylesheet was loaded from the filesystem, it’s the absolute path of
|
||||
* its file.
|
||||
* * If the stylesheet was loaded from an importer that returned its contents,
|
||||
* it’s the URL of the `@use` or `@import` rule that loaded it.
|
||||
* * If the stylesheet came from the data option, it’s the string "stdin".
|
||||
*
|
||||
* @category Legacy
|
||||
* @deprecated This only works with the legacy [[render]] and [[renderSync]]
|
||||
* APIs. Use [[Importer]] with [[compile]], [[compileString]], [[compileAsync]],
|
||||
* and [[compileStringAsync]] instead.
|
||||
*/
|
||||
type LegacySyncImporter = (
|
||||
this: LegacyImporterThis,
|
||||
url: string,
|
||||
prev: string
|
||||
) => LegacyImporterResult;
|
||||
|
||||
/**
|
||||
* An asynchronous callback that implements custom Sass loading logic for
|
||||
* [`@import` rules](https://sass-lang.com/documentation/at-rules/import) and
|
||||
* [`@use` rules](https://sass-lang.com/documentation/at-rules/use). This can be
|
||||
* passed to [[LegacySharedOptions.importer]] for either [[render]] or
|
||||
* [[renderSync]].
|
||||
*
|
||||
* An asynchronous importer must return `undefined`, and then call `done` with
|
||||
* the result of its [[LegacyImporterResult]] once it's done running.
|
||||
*
|
||||
* See [[LegacySharedOptions.importer]] for more detailed documentation.
|
||||
*
|
||||
* ```js
|
||||
* sass.render({
|
||||
* file: "style.scss",
|
||||
* importer: [
|
||||
* function(url, prev, done) {
|
||||
* if (url != "big-headers") done(null);
|
||||
*
|
||||
* done({
|
||||
* contents: 'h1 { font-size: 40px; }'
|
||||
* });
|
||||
* }
|
||||
* ]
|
||||
* });
|
||||
* ```
|
||||
*
|
||||
* @param url - The `@use` or `@import` rule’s URL as a string, exactly as it
|
||||
* appears in the stylesheet.
|
||||
*
|
||||
* @param prev - A string identifying the stylesheet that contained the `@use`
|
||||
* or `@import`. This string’s format depends on how that stylesheet was loaded:
|
||||
*
|
||||
* * If the stylesheet was loaded from the filesystem, it’s the absolute path of
|
||||
* its file.
|
||||
* * If the stylesheet was loaded from an importer that returned its contents,
|
||||
* it’s the URL of the `@use` or `@import` rule that loaded it.
|
||||
* * If the stylesheet came from the data option, it’s the string "stdin".
|
||||
*
|
||||
* @param done - The callback to call once the importer has finished running.
|
||||
*
|
||||
* @category Legacy
|
||||
* @deprecated This only works with the legacy [[render]] and [[renderSync]]
|
||||
* APIs. Use [[Importer]] with [[compile]], [[compileString]], [[compileAsync]],
|
||||
* and [[compileStringAsync]] instead.
|
||||
*/
|
||||
type LegacyAsyncImporter = (
|
||||
this: LegacyImporterThis,
|
||||
url: string,
|
||||
prev: string,
|
||||
done: (result: LegacyImporterResult) => void
|
||||
) => void;
|
||||
|
||||
/**
|
||||
* A callback that implements custom Sass loading logic for [`@import`
|
||||
* rules](https://sass-lang.com/documentation/at-rules/import) and [`@use`
|
||||
* rules](https://sass-lang.com/documentation/at-rules/use). For [[renderSync]],
|
||||
* this must be a [[LegacySyncImporter]] which returns its result directly; for
|
||||
* [[render]], it may be either a [[LegacySyncImporter]] or a
|
||||
* [[LegacyAsyncImporter]] which calls a callback with its result.
|
||||
*
|
||||
* See [[LegacySharedOptions.importer]] for more details.
|
||||
*
|
||||
* @category Legacy
|
||||
* @deprecated This only works with the legacy [[render]] and [[renderSync]]
|
||||
* APIs. Use [[Importer]] with [[compile]], [[compileString]], [[compileAsync]],
|
||||
* and [[compileStringAsync]] instead.
|
||||
*/
|
||||
export type LegacyImporter<sync = 'sync' | 'async'> = sync extends 'async'
|
||||
? LegacySyncImporter | LegacyAsyncImporter
|
||||
: LegacySyncImporter;
|
||||
+642
@@ -0,0 +1,642 @@
|
||||
import {Logger} from '../logger';
|
||||
import {LegacyImporter} from './importer';
|
||||
import {LegacyFunction} from './function';
|
||||
|
||||
/**
|
||||
* Options for [[render]] and [[renderSync]] that are shared between
|
||||
* [[LegacyFileOptions]] and [[LegacyStringOptions]].
|
||||
*
|
||||
* @typeParam sync - This lets the TypeScript checker verify that
|
||||
* [[LegacyAsyncImporter]]s and [[LegacyAsyncFunction]]s aren't passed to
|
||||
* [[renderSync]].
|
||||
*
|
||||
* @category Legacy
|
||||
* @deprecated This only works with the legacy [[render]] and [[renderSync]]
|
||||
* APIs. Use [[Options]] with [[compile]], [[compileString]], [[compileAsync]],
|
||||
* and [[compileStringAsync]] instead.
|
||||
*/
|
||||
export interface LegacySharedOptions<sync extends 'sync' | 'async'> {
|
||||
/**
|
||||
* This array of strings option provides [load
|
||||
* paths](https://sass-lang.com/documentation/at-rules/import#load-paths) for
|
||||
* Sass to look for stylesheets. Earlier load paths will take precedence over
|
||||
* later ones.
|
||||
*
|
||||
* ```js
|
||||
* sass.renderSync({
|
||||
* file: "style.scss",
|
||||
* includePaths: ["node_modules/bootstrap/dist/css"]
|
||||
* });
|
||||
* ```
|
||||
*
|
||||
* Load paths are also loaded from the `SASS_PATH` environment variable, if
|
||||
* it’s set. This variable should be a list of paths separated by `;` (on
|
||||
* Windows) or `:` (on other operating systems). Load paths from the
|
||||
* `includePaths` option take precedence over load paths from `SASS_PATH`.
|
||||
*
|
||||
* ```sh
|
||||
* $ SASS_PATH=node_modules/bootstrap/dist/css sass style.scss style.css
|
||||
* ```
|
||||
*
|
||||
* @category Input
|
||||
* @compatibility feature: "SASS_PATH", dart: "1.15.0", node: "3.9.0"
|
||||
*
|
||||
* Earlier versions of Dart Sass and Node Sass didn’t support the `SASS_PATH`
|
||||
* environment variable.
|
||||
*/
|
||||
includePaths?: string[];
|
||||
|
||||
/**
|
||||
* Whether the generated CSS should use spaces or tabs for indentation.
|
||||
*
|
||||
* ```js
|
||||
* const result = sass.renderSync({
|
||||
* file: "style.scss",
|
||||
* indentType: "tab",
|
||||
* indentWidth: 1
|
||||
* });
|
||||
*
|
||||
* result.css.toString();
|
||||
* // "h1 {\n\tfont-size: 40px;\n}\n"
|
||||
* ```
|
||||
*
|
||||
* @defaultValue `'space'`
|
||||
* @category Output
|
||||
* @compatibility dart: true, node: "3.0.0"
|
||||
*/
|
||||
indentType?: 'space' | 'tab';
|
||||
|
||||
/**
|
||||
* How many spaces or tabs (depending on [[indentType]]) should be used per
|
||||
* indentation level in the generated CSS. It must be between 0 and 10
|
||||
* (inclusive).
|
||||
*
|
||||
* @defaultValue `2`
|
||||
* @category Output
|
||||
* @compatibility dart: true, node: "3.0.0"
|
||||
*/
|
||||
indentWidth?: number;
|
||||
|
||||
/**
|
||||
* Which character sequence to use at the end of each line in the generated
|
||||
* CSS. It can have the following values:
|
||||
*
|
||||
* * `'lf'` uses U+000A LINE FEED.
|
||||
* * `'lfcr'` uses U+000A LINE FEED followed by U+000D CARRIAGE RETURN.
|
||||
* * `'cr'` uses U+000D CARRIAGE RETURN.
|
||||
* * `'crlf'` uses U+000D CARRIAGE RETURN followed by U+000A LINE FEED.
|
||||
*
|
||||
* @defaultValue `'lf'`
|
||||
* @category Output
|
||||
* @compatibility dart: true, node: "3.0.0"
|
||||
*/
|
||||
linefeed?: 'cr' | 'crlf' | 'lf' | 'lfcr';
|
||||
|
||||
/**
|
||||
* If `true`, Sass won't add a link from the generated CSS to the source map.
|
||||
*
|
||||
* ```js
|
||||
* const result = sass.renderSync({
|
||||
* file: "style.scss",
|
||||
* sourceMap: "out.map",
|
||||
* omitSourceMapUrl: true
|
||||
* })
|
||||
* console.log(result.css.toString());
|
||||
* // h1 {
|
||||
* // font-size: 40px;
|
||||
* // }
|
||||
* ```
|
||||
*
|
||||
* @defaultValue `false`
|
||||
* @category Source Maps
|
||||
*/
|
||||
omitSourceMapUrl?: boolean;
|
||||
|
||||
/**
|
||||
* The location that Sass expects the generated CSS to be saved to. It’s used
|
||||
* to determine the URL used to link from the generated CSS to the source map,
|
||||
* and from the source map to the Sass source files.
|
||||
*
|
||||
* **Heads up!** Despite the name, Sass does *not* write the CSS output to
|
||||
* this file. The caller must do that themselves.
|
||||
*
|
||||
* ```js
|
||||
* result = sass.renderSync({
|
||||
* file: "style.scss",
|
||||
* sourceMap: true,
|
||||
* outFile: "out.css"
|
||||
* })
|
||||
* console.log(result.css.toString());
|
||||
* // h1 {
|
||||
* // font-size: 40px;
|
||||
* // }
|
||||
* // /*# sourceMappingURL=out.css.map * /
|
||||
* ```
|
||||
*
|
||||
* @category Source Maps
|
||||
*/
|
||||
outFile?: string;
|
||||
|
||||
/**
|
||||
* The output style of the compiled CSS. There are four possible output styles:
|
||||
*
|
||||
* * `"expanded"` (the default for Dart Sass) writes each selector and
|
||||
* declaration on its own line.
|
||||
*
|
||||
* * `"compressed"` removes as many extra characters as possible, and writes
|
||||
* the entire stylesheet on a single line.
|
||||
*
|
||||
* * `"nested"` (the default for Node Sass, not supported by Dart Sass)
|
||||
* indents CSS rules to match the nesting of the Sass source.
|
||||
*
|
||||
* * `"compact"` (not supported by Dart Sass) puts each CSS rule on its own single line.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* const source = `
|
||||
* h1 {
|
||||
* font-size: 40px;
|
||||
* code {
|
||||
* font-face: Roboto Mono;
|
||||
* }
|
||||
* }`;
|
||||
*
|
||||
* let result = sass.renderSync({
|
||||
* data: source,
|
||||
* outputStyle: "expanded"
|
||||
* });
|
||||
* console.log(result.css.toString());
|
||||
* // h1 {
|
||||
* // font-size: 40px;
|
||||
* // }
|
||||
* // h1 code {
|
||||
* // font-face: Roboto Mono;
|
||||
* // }
|
||||
*
|
||||
* result = sass.renderSync({
|
||||
* data: source,
|
||||
* outputStyle: "compressed"
|
||||
* });
|
||||
* console.log(result.css.toString());
|
||||
* // h1{font-size:40px}h1 code{font-face:Roboto Mono}
|
||||
*
|
||||
* result = sass.renderSync({
|
||||
* data: source,
|
||||
* outputStyle: "nested"
|
||||
* });
|
||||
* console.log(result.css.toString());
|
||||
* // h1 {
|
||||
* // font-size: 40px; }
|
||||
* // h1 code {
|
||||
* // font-face: Roboto Mono; }
|
||||
*
|
||||
* result = sass.renderSync({
|
||||
* data: source,
|
||||
* outputStyle: "compact"
|
||||
* });
|
||||
* console.log(result.css.toString());
|
||||
* // h1 { font-size: 40px; }
|
||||
* // h1 code { font-face: Roboto Mono; }
|
||||
* ```
|
||||
*
|
||||
* @category Output
|
||||
*/
|
||||
outputStyle?: 'compressed' | 'expanded' | 'nested' | 'compact';
|
||||
|
||||
/**
|
||||
* Whether or not Sass should generate a source map. If it does, the source
|
||||
* map will be available as [[LegacyResult.map]] (unless [[sourceMapEmbed]] is
|
||||
* `true`).
|
||||
*
|
||||
* If this option is a string, it’s the path that the source map is expected
|
||||
* to be written to, which is used to link to the source map from the
|
||||
* generated CSS and to link *from* the source map to the Sass source files.
|
||||
* Note that if `sourceMap` is a string and [[outFile]] isn’t passed, Sass
|
||||
* assumes that the CSS will be written to the same directory as the file
|
||||
* option if it’s passed.
|
||||
*
|
||||
* If this option is `true`, the path is assumed to be [[outFile]] with `.map`
|
||||
* added to the end. If it’s `true` and [[outFile]] isn’t passed, it has no
|
||||
* effect.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* let result = sass.renderSync({
|
||||
* file: "style.scss",
|
||||
* sourceMap: "out.map"
|
||||
* })
|
||||
* console.log(result.css.toString());
|
||||
* // h1 {
|
||||
* // font-size: 40px;
|
||||
* // }
|
||||
* // /*# sourceMappingURL=out.map * /
|
||||
*
|
||||
* result = sass.renderSync({
|
||||
* file: "style.scss",
|
||||
* sourceMap: true,
|
||||
* outFile: "out.css"
|
||||
* })
|
||||
* console.log(result.css.toString());
|
||||
* // h1 {
|
||||
* // font-size: 40px;
|
||||
* // }
|
||||
* // /*# sourceMappingURL=out.css.map * /
|
||||
* ```
|
||||
*
|
||||
* @defaultValue `false`
|
||||
* @category Source Maps
|
||||
*/
|
||||
sourceMap?: boolean | string;
|
||||
|
||||
/**
|
||||
* Whether to embed the entire contents of the Sass files that contributed to
|
||||
* the generated CSS in the source map. This may produce very large source
|
||||
* maps, but it guarantees that the source will be available on any computer
|
||||
* no matter how the CSS is served.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* sass.renderSync({
|
||||
* file: "style.scss",
|
||||
* sourceMap: "out.map",
|
||||
* sourceMapContents: true
|
||||
* })
|
||||
* ```
|
||||
*
|
||||
* @defaultValue `false`
|
||||
* @category Source Maps
|
||||
*/
|
||||
sourceMapContents?: boolean;
|
||||
|
||||
/**
|
||||
* Whether to embed the contents of the source map file in the generated CSS,
|
||||
* rather than creating a separate file and linking to it from the CSS.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* sass.renderSync({
|
||||
* file: "style.scss",
|
||||
* sourceMap: "out.map",
|
||||
* sourceMapEmbed: true
|
||||
* });
|
||||
* ```
|
||||
*
|
||||
* @defaultValue `false`
|
||||
* @category Source Maps
|
||||
*/
|
||||
sourceMapEmbed?: boolean;
|
||||
|
||||
/**
|
||||
* If this is passed, it's prepended to all the links from the source map to
|
||||
* the Sass source files.
|
||||
*
|
||||
* @category Source Maps
|
||||
*/
|
||||
sourceMapRoot?: string;
|
||||
|
||||
/**
|
||||
* Additional handler(s) for loading files when a [`@use`
|
||||
* rule](https://sass-lang.com/documentation/at-rules/use) or an [`@import`
|
||||
* rule](https://sass-lang.com/documentation/at-rules/import) is encountered.
|
||||
* It can either be a single [[LegacyImporter]] function, or an array of
|
||||
* [[LegacyImporter]]s.
|
||||
*
|
||||
* Importers take the URL of the `@import` or `@use` rule and return a
|
||||
* [[LegacyImporterResult]] indicating how to handle that rule. For more
|
||||
* details, see [[LegacySyncImporter]] and [[LegacyAsyncImporter]].
|
||||
*
|
||||
* Loads are resolved by trying, in order:
|
||||
*
|
||||
* * Loading a file from disk relative to the file in which the `@use` or
|
||||
* `@import` appeared.
|
||||
*
|
||||
* * Each custom importer.
|
||||
*
|
||||
* * Loading a file relative to the current working directory.
|
||||
*
|
||||
* * Each load path in [[includePaths]].
|
||||
*
|
||||
* * Each load path specified in the `SASS_PATH` environment variable, which
|
||||
* should be semicolon-separated on Windows and colon-separated elsewhere.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* sass.render({
|
||||
* file: "style.scss",
|
||||
* importer: [
|
||||
* // This importer uses the synchronous API, and can be passed to either
|
||||
* // renderSync() or render().
|
||||
* function(url, prev) {
|
||||
* // This generates a stylesheet from scratch for `@use "big-headers"`.
|
||||
* if (url != "big-headers") return null;
|
||||
*
|
||||
* return {
|
||||
* contents: `
|
||||
* h1 {
|
||||
* font-size: 40px;
|
||||
* }`
|
||||
* };
|
||||
* },
|
||||
*
|
||||
* // This importer uses the asynchronous API, and can only be passed to
|
||||
* // render().
|
||||
* function(url, prev, done) {
|
||||
* // Convert `@use "foo/bar"` to "node_modules/foo/sass/bar".
|
||||
* const components = url.split('/');
|
||||
* const innerPath = components.slice(1).join('/');
|
||||
* done({
|
||||
* file: `node_modules/${components.first}/sass/${innerPath}`
|
||||
* });
|
||||
* }
|
||||
* ]
|
||||
* }, function(err, result) {
|
||||
* // ...
|
||||
* });
|
||||
* ```
|
||||
*
|
||||
* @category Plugins
|
||||
* @compatibility dart: true, node: "3.0.0"
|
||||
*
|
||||
* Versions of Node Sass before 3.0.0 don’t support arrays of importers, nor
|
||||
* do they support importers that return `Error` objects.
|
||||
*
|
||||
* Versions of Node Sass before 2.0.0 don’t support the `importer` option at
|
||||
* all.
|
||||
*
|
||||
* @compatibility feature: "Import order", dart: "1.20.2", node: false
|
||||
*
|
||||
* Versions of Dart Sass before 1.20.2 preferred resolving imports using
|
||||
* [[includePaths]] before resolving them using custom importers.
|
||||
*
|
||||
* All versions of Node Sass currently pass imports to importers before
|
||||
* loading them relative to the file in which the `@import` appears. This
|
||||
* behavior is considered incorrect and should not be relied on because it
|
||||
* violates the principle of *locality*, which says that it should be possible
|
||||
* to reason about a stylesheet without knowing everything about how the
|
||||
* entire system is set up. If a user tries to import a stylesheet relative to
|
||||
* another stylesheet, that import should *always* work. It shouldn’t be
|
||||
* possible for some configuration somewhere else to break it.
|
||||
*/
|
||||
importer?: LegacyImporter<sync> | LegacyImporter<sync>[];
|
||||
|
||||
/**
|
||||
* Additional built-in Sass functions that are available in all stylesheets.
|
||||
* This option takes an object whose keys are Sass function signatures and
|
||||
* whose values are [[LegacyFunction]]s. Each function should take the same
|
||||
* arguments as its signature.
|
||||
*
|
||||
* Functions are passed JavaScript representations of [Sass value
|
||||
* types](https://sass-lang.com/documentation/js-api#value-types), and must
|
||||
* return the same.
|
||||
*
|
||||
* **Heads up!** When writing custom functions, it’s important to ensure that
|
||||
* all the arguments are the types you expect. Otherwise, users’ stylesheets
|
||||
* could crash in hard-to-debug ways or, worse, compile to meaningless CSS.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* sass.render({
|
||||
* data: `
|
||||
* h1 {
|
||||
* font-size: pow(2, 5) * 1px;
|
||||
* }`,
|
||||
* functions: {
|
||||
* // This function uses the synchronous API, and can be passed to either
|
||||
* // renderSync() or render().
|
||||
* 'pow($base, $exponent)': function(base, exponent) {
|
||||
* if (!(base instanceof sass.types.Number)) {
|
||||
* throw "$base: Expected a number.";
|
||||
* } else if (base.getUnit()) {
|
||||
* throw "$base: Expected a unitless number.";
|
||||
* }
|
||||
*
|
||||
* if (!(exponent instanceof sass.types.Number)) {
|
||||
* throw "$exponent: Expected a number.";
|
||||
* } else if (exponent.getUnit()) {
|
||||
* throw "$exponent: Expected a unitless number.";
|
||||
* }
|
||||
*
|
||||
* return new sass.types.Number(
|
||||
* Math.pow(base.getValue(), exponent.getValue()));
|
||||
* },
|
||||
*
|
||||
* // This function uses the asynchronous API, and can only be passed to
|
||||
* // render().
|
||||
* 'sqrt($number)': function(number, done) {
|
||||
* if (!(number instanceof sass.types.Number)) {
|
||||
* throw "$number: Expected a number.";
|
||||
* } else if (number.getUnit()) {
|
||||
* throw "$number: Expected a unitless number.";
|
||||
* }
|
||||
*
|
||||
* done(new sass.types.Number(Math.sqrt(number.getValue())));
|
||||
* }
|
||||
* }
|
||||
* }, function(err, result) {
|
||||
* console.log(result.css.toString());
|
||||
* // h1 {
|
||||
* // font-size: 32px;
|
||||
* // }
|
||||
* });
|
||||
* ```
|
||||
*
|
||||
* @category Plugins
|
||||
*/
|
||||
functions?: {[key: string]: LegacyFunction<sync>};
|
||||
|
||||
/**
|
||||
* By default, if the CSS document contains non-ASCII characters, Sass adds a
|
||||
* `@charset` declaration (in expanded output mode) or a byte-order mark (in
|
||||
* compressed mode) to indicate its encoding to browsers or other consumers.
|
||||
* If `charset` is `false`, these annotations are omitted.
|
||||
*
|
||||
* @category Output
|
||||
* @compatibility dart: "1.39.0", node: false
|
||||
*/
|
||||
charset?: boolean;
|
||||
|
||||
/**
|
||||
* If this option is set to `true`, Sass won’t print warnings that are caused
|
||||
* by dependencies. A “dependency” is defined as any file that’s loaded
|
||||
* through [[loadPaths]] or [[importer]]. Stylesheets that are imported
|
||||
* relative to the entrypoint are not considered dependencies.
|
||||
*
|
||||
* This is useful for silencing deprecation warnings that you can’t fix on
|
||||
* your own. However, please <em>also</em> notify your dependencies of the deprecations
|
||||
* so that they can get fixed as soon as possible!
|
||||
*
|
||||
* **Heads up!** If [[render]] or [[renderSync]] is called without
|
||||
* [[LegacyFileOptions.file]] or [[LegacyStringOptions.file]], <em>all</em>
|
||||
* stylesheets it loads will be considered dependencies. Since it doesn’t have
|
||||
* a path of its own, everything it loads is coming from a load path rather
|
||||
* than a relative import.
|
||||
*
|
||||
* @defaultValue `false`
|
||||
* @category Messages
|
||||
* @compatibility dart: "1.35.0", node: false
|
||||
*/
|
||||
quietDeps?: boolean;
|
||||
|
||||
/**
|
||||
* By default, Dart Sass will print only five instances of the same
|
||||
* deprecation warning per compilation to avoid deluging users in console
|
||||
* noise. If you set `verbose` to `true`, it will instead print every
|
||||
* deprecation warning it encounters.
|
||||
*
|
||||
* @defaultValue `false`
|
||||
* @category Messages
|
||||
* @compatibility dart: "1.35.0", node: false
|
||||
*/
|
||||
verbose?: boolean;
|
||||
|
||||
/**
|
||||
* An object to use to handle warnings and/or debug messages from Sass.
|
||||
*
|
||||
* By default, Sass emits warnings and debug messages to standard error, but
|
||||
* if [[Logger.warn]] or [[Logger.debug]] is set, this will invoke them
|
||||
* instead.
|
||||
*
|
||||
* The special value [[Logger.silent]] can be used to easily silence all
|
||||
* messages.
|
||||
*
|
||||
* @category Messages
|
||||
* @compatibility dart: "1.43.0", node: false
|
||||
*/
|
||||
logger?: Logger;
|
||||
}
|
||||
|
||||
/**
|
||||
* If [[file]] is passed without [[data]], Sass will load the stylesheet at
|
||||
* [[file]] and compile it to CSS.
|
||||
*
|
||||
* @typeParam sync - This lets the TypeScript checker verify that
|
||||
* [[LegacyAsyncImporter]]s and [[LegacyAsyncFunction]]s aren't passed to
|
||||
* [[renderSync]].
|
||||
*/
|
||||
export interface LegacyFileOptions<sync extends 'sync' | 'async'>
|
||||
extends LegacySharedOptions<sync> {
|
||||
/**
|
||||
* The path to the file for Sass to load and compile. If the file’s extension
|
||||
* is `.scss`, it will be parsed as SCSS; if it’s `.sass`, it will be parsed
|
||||
* as the indented syntax; and if it’s `.css`, it will be parsed as plain CSS.
|
||||
* If it has no extension, it will be parsed as SCSS.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* sass.renderSync({file: "style.scss"});
|
||||
* ```
|
||||
*
|
||||
* @category Input
|
||||
* @compatibility feature: "Plain CSS files", dart: "1.11.0", node: "partial"
|
||||
*
|
||||
* Node Sass and older versions of Dart Sass support loading files with the
|
||||
* extension `.css`, but contrary to the specification they’re treated as SCSS
|
||||
* files rather than being parsed as CSS. This behavior has been deprecated
|
||||
* and should not be relied on. Any files that use Sass features should use
|
||||
* the `.scss` extension.
|
||||
*
|
||||
* All versions of Node Sass and Dart Sass otherwise support the file option
|
||||
* as described below.
|
||||
*/
|
||||
file: string;
|
||||
|
||||
/**
|
||||
* See [[LegacyStringOptions.file]] for documentation of passing [[file]] along
|
||||
* with [[data]].
|
||||
*
|
||||
* @category Input
|
||||
*/
|
||||
data?: never;
|
||||
}
|
||||
|
||||
/**
|
||||
* If [[data]] is passed, Sass will use it as the contents of the stylesheet to
|
||||
* compile.
|
||||
*
|
||||
* @typeParam sync - This lets the TypeScript checker verify that
|
||||
* [[LegacyAsyncImporter]]s and [[LegacyAsyncFunction]]s aren't passed to
|
||||
* [[renderSync]].
|
||||
*
|
||||
* @category Legacy
|
||||
* @deprecated This only works with the legacy [[render]] and [[renderSync]]
|
||||
* APIs. Use [[StringOptions]] with [[compile]], [[compileString]],
|
||||
* [[compileAsync]], and [[compileStringAsync]] instead.
|
||||
*/
|
||||
export interface LegacyStringOptions<sync extends 'sync' | 'async'>
|
||||
extends LegacySharedOptions<sync> {
|
||||
/**
|
||||
* The contents of the stylesheet to compile. Unless [[file]] is passed as
|
||||
* well, the stylesheet’s URL is set to `"stdin"`.
|
||||
*
|
||||
* By default, this stylesheet is parsed as SCSS. This can be controlled using
|
||||
* [[indentedSyntax]].
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* sass.renderSync({
|
||||
* data: `
|
||||
* h1 {
|
||||
* font-size: 40px;
|
||||
* }`
|
||||
* });
|
||||
* ```
|
||||
*
|
||||
* @category Input
|
||||
*/
|
||||
data: string;
|
||||
|
||||
/**
|
||||
* If `file` and [[data]] are both passed, `file` is used as the path of the
|
||||
* stylesheet for error reporting, but [[data]] is used as the contents of the
|
||||
* stylesheet. In this case, `file`’s extension is not used to determine the
|
||||
* syntax of the stylesheet.
|
||||
*
|
||||
* @category Input
|
||||
*/
|
||||
file?: string;
|
||||
|
||||
/**
|
||||
* This flag controls whether [[data]] is parsed as the indented syntax or
|
||||
* not.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* sass.renderSync({
|
||||
* data: `
|
||||
* h1
|
||||
* font-size: 40px`,
|
||||
* indentedSyntax: true
|
||||
* });
|
||||
* ```
|
||||
*
|
||||
* @defaultValue `false`
|
||||
* @category Input
|
||||
*/
|
||||
indentedSyntax?: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* Options for [[render]] and [[renderSync]]. This can either be
|
||||
* [[LegacyFileOptions]] to load a file from disk, or [[LegacyStringOptions]] to
|
||||
* compile a string of Sass code.
|
||||
*
|
||||
* See [[LegacySharedOptions]] for options that are shared across both file and
|
||||
* string inputs.
|
||||
*
|
||||
* @category Legacy
|
||||
* @deprecated This only works with the legacy [[render]] and [[renderSync]]
|
||||
* APIs. Use [[Options]] with [[compile]], [[compileString]], [[compileAsync]],
|
||||
* and [[compileStringAsync]] instead.
|
||||
*/
|
||||
export type LegacyOptions<sync extends 'sync' | 'async'> =
|
||||
| LegacyFileOptions<sync>
|
||||
| LegacyStringOptions<sync>;
|
||||
+73
@@ -0,0 +1,73 @@
|
||||
/**
|
||||
* The value of `this` in the context of a [[LegacyImporter]] or
|
||||
* [[LegacyFunction]] callback.
|
||||
*
|
||||
* @category Legacy
|
||||
* @deprecated This is only used by the legacy [[render]] and [[renderSync]]
|
||||
* APIs. Use [[compile]], [[compileString]], [[compileAsync]], and
|
||||
* [[compileStringAsync]] instead.
|
||||
*/
|
||||
export interface LegacyPluginThis {
|
||||
/**
|
||||
* A partial representation of the options passed to [[render]] or
|
||||
* [[renderSync]].
|
||||
*/
|
||||
options: {
|
||||
/** The same [[LegacyPluginThis]] instance that contains this object. */
|
||||
context: LegacyPluginThis;
|
||||
|
||||
/**
|
||||
* The value passed to [[LegacyFileOptions.file]] or
|
||||
* [[LegacyStringOptions.file]].
|
||||
*/
|
||||
file?: string;
|
||||
|
||||
/** The value passed to [[LegacyStringOptions.data]]. */
|
||||
data?: string;
|
||||
|
||||
/**
|
||||
* The value passed to [[LegacySharedOptions.includePaths]] separated by
|
||||
* `";"` on Windows or `":"` on other operating systems. This always
|
||||
* includes the current working directory as the first entry.
|
||||
*/
|
||||
includePaths: string;
|
||||
|
||||
/** Always the number 10. */
|
||||
precision: 10;
|
||||
|
||||
/** Always the number 1. */
|
||||
style: 1;
|
||||
|
||||
/** 1 if [[LegacySharedOptions.indentType]] was `"tab"`, 0 otherwise. */
|
||||
indentType: 1 | 0;
|
||||
|
||||
/**
|
||||
* The value passed to [[LegacySharedOptions.indentWidth]], or `2` otherwise.
|
||||
*/
|
||||
indentWidth: number;
|
||||
|
||||
/**
|
||||
* The value passed to [[LegacySharedOptions.linefeed]], or `"\n"`
|
||||
* otherwise.
|
||||
*/
|
||||
linefeed: '\r' | '\r\n' | '\n' | '\n\r';
|
||||
|
||||
/** A partially-constructed [[LegacyResult]] object. */
|
||||
result: {
|
||||
/** Partial information about the compilation in progress. */
|
||||
stats: {
|
||||
/**
|
||||
* The number of milliseconds between 1 January 1970 at 00:00:00 UTC and
|
||||
* the time at which Sass compilation began.
|
||||
*/
|
||||
start: number;
|
||||
|
||||
/**
|
||||
* [[LegacyFileOptions.file]] if it was passed, otherwise the string
|
||||
* `"data"`.
|
||||
*/
|
||||
entry: string;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
+139
@@ -0,0 +1,139 @@
|
||||
import {LegacyException} from './exception';
|
||||
import {LegacyOptions} from './options';
|
||||
|
||||
/**
|
||||
* The object returned by [[render]] and [[renderSync]] after a successful
|
||||
* compilation.
|
||||
*
|
||||
* @category Legacy
|
||||
* @deprecated This is only used by the legacy [[render]] and [[renderSync]]
|
||||
* APIs. Use [[compile]], [[compileString]], [[compileAsync]], and
|
||||
* [[compileStringAsync]] instead.
|
||||
*/
|
||||
export interface LegacyResult {
|
||||
/**
|
||||
* The compiled CSS. This can be converted to a string by calling
|
||||
* [Buffer.toString](https://nodejs.org/api/buffer.html#buffer_buf_tostring_encoding_start_end).
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* const result = sass.renderSync({file: "style.scss"});
|
||||
*
|
||||
* console.log(result.css.toString());
|
||||
* ```
|
||||
*/
|
||||
css: Buffer;
|
||||
|
||||
/**
|
||||
* The source map that maps the compiled CSS to the source files from which it
|
||||
* was generated. This can be converted to a string by calling
|
||||
* [Buffer.toString](https://nodejs.org/api/buffer.html#buffer_buf_tostring_encoding_start_end).
|
||||
*
|
||||
* This is `undefined` unless either
|
||||
*
|
||||
* * [[LegacySharedOptions.sourceMap]] is a string; or
|
||||
* * [[LegacySharedOptions.sourceMap]] is `true` and
|
||||
* [[LegacySharedOptions.outFile]] is set.
|
||||
*
|
||||
* The source map uses absolute [`file:`
|
||||
* URLs](https://en.wikipedia.org/wiki/File_URI_scheme) to link to the Sass
|
||||
* source files, except if the source file comes from
|
||||
* [[LegacyStringOptions.data]] in which case it lists its URL as `"stdin"`.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* const result = sass.renderSync({
|
||||
* file: "style.scss",
|
||||
* sourceMap: true,
|
||||
* outFile: "style.css"
|
||||
* })
|
||||
*
|
||||
* console.log(result.map.toString());
|
||||
* ```
|
||||
*/
|
||||
map?: Buffer;
|
||||
|
||||
/** Additional information about the compilation. */
|
||||
stats: {
|
||||
/**
|
||||
* The absolute path of [[LegacyFileOptions.file]] or
|
||||
* [[LegacyStringOptions.file]], or `"data"` if [[LegacyStringOptions.file]]
|
||||
* wasn't set.
|
||||
*/
|
||||
entry: string;
|
||||
|
||||
/**
|
||||
* The number of milliseconds between 1 January 1970 at 00:00:00 UTC and the
|
||||
* time at which Sass compilation began.
|
||||
*/
|
||||
start: number;
|
||||
|
||||
/**
|
||||
* The number of milliseconds between 1 January 1970 at 00:00:00 UTC and the
|
||||
* time at which Sass compilation ended.
|
||||
*/
|
||||
end: number;
|
||||
|
||||
/**
|
||||
* The number of milliseconds it took to compile the Sass file. This is
|
||||
* always equal to `start` minus `end`.
|
||||
*/
|
||||
duration: number;
|
||||
|
||||
/**
|
||||
* An array of the absolute paths of all Sass files loaded during
|
||||
* compilation. If a stylesheet was loaded from a [[LegacyImporter]] that
|
||||
* returned the stylesheet’s contents, the raw string of the `@use` or
|
||||
* `@import` that loaded that stylesheet included in this array.
|
||||
*/
|
||||
includedFiles: string[];
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* This function synchronously compiles a Sass file to CSS. If it succeeds, it
|
||||
* returns the result, and if it fails it throws an error.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* const sass = require('sass'); // or require('node-sass');
|
||||
*
|
||||
* const result = sass.renderSync({file: "style.scss"});
|
||||
* // ...
|
||||
* ```
|
||||
*
|
||||
* @category Legacy
|
||||
* @deprecated Use [[compile]] or [[compileString]] instead.
|
||||
*/
|
||||
export function renderSync(options: LegacyOptions<'sync'>): LegacyResult;
|
||||
|
||||
/**
|
||||
|
||||
* This function asynchronously compiles a Sass file to CSS, and calls
|
||||
* `callback` with a [[LegacyResult]] if compilation succeeds or
|
||||
* [[LegacyException]] if it fails.
|
||||
*
|
||||
* **Heads up!** When using Dart Sass, **[[renderSync]] is almost twice as fast
|
||||
* as [[render]]** by default, due to the overhead of making the entire
|
||||
* evaluation process asynchronous.
|
||||
*
|
||||
* ```js
|
||||
* const sass = require('sass'); // or require('node-sass');
|
||||
*
|
||||
* sass.render({
|
||||
* file: "style.scss"
|
||||
* }, function(err, result) {
|
||||
* // ...
|
||||
* });
|
||||
* ```
|
||||
*
|
||||
* @category Legacy
|
||||
* @deprecated Use [[compileAsync]] or [[compileStringAsync]] instead.
|
||||
*/
|
||||
export function render(
|
||||
options: LegacyOptions<'async'>,
|
||||
callback: (exception?: LegacyException, result?: LegacyResult) => void
|
||||
): void;
|
||||
+94
@@ -0,0 +1,94 @@
|
||||
import {SourceSpan} from './source_span';
|
||||
|
||||
export {SourceLocation} from './source_location';
|
||||
export {SourceSpan} from './source_span';
|
||||
|
||||
/**
|
||||
* An object that can be passed to [[LegacySharedOptions.logger]] to control how
|
||||
* Sass emits warnings and debug messages.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* const fs = require('fs');
|
||||
* const sass = require('sass');
|
||||
*
|
||||
* let log = "";
|
||||
* sass.renderSync({
|
||||
* file: 'input.scss',
|
||||
* logger: {
|
||||
* warn(message, options) {
|
||||
* if (options.span) {
|
||||
* log += `${span.url}:${span.start.line}:${span.start.column}: ` +
|
||||
* `${message}\n`;
|
||||
* } else {
|
||||
* log += `::: ${message}\n`;
|
||||
* }
|
||||
* }
|
||||
* }
|
||||
* });
|
||||
*
|
||||
* fs.writeFileSync('log.txt', log);
|
||||
* ```
|
||||
*
|
||||
* @category Logger
|
||||
*/
|
||||
export interface Logger {
|
||||
/**
|
||||
* This method is called when Sass emits a warning, whether due to a [`@warn`
|
||||
* rule](https://sass-lang.com/documentation/at-rules/warn) or a warning
|
||||
* generated by the Sass compiler.
|
||||
*
|
||||
* If this is `undefined`, Sass will print warnings to standard error.
|
||||
*
|
||||
* @param message - The warning message.
|
||||
* @param options.deprecation - Whether this is a deprecation warning.
|
||||
* @param options.span - The location in the Sass source code that generated this
|
||||
* warning.
|
||||
* @param options.stack - The Sass stack trace at the point the warning was issued.
|
||||
*/
|
||||
warn?(
|
||||
message: string,
|
||||
options: {
|
||||
deprecation: boolean;
|
||||
span?: SourceSpan;
|
||||
stack?: string;
|
||||
}
|
||||
): void;
|
||||
|
||||
/**
|
||||
* This method is called when Sass emits a debug message due to a [`@debug`
|
||||
* rule](https://sass-lang.com/documentation/at-rules/debug).
|
||||
*
|
||||
* If this is `undefined`, Sass will print debug messages to standard error.
|
||||
*
|
||||
* @param message - The debug message.
|
||||
* @param options.span - The location in the Sass source code that generated this
|
||||
* debug message.
|
||||
*/
|
||||
debug?(message: string, options: {span: SourceSpan}): void;
|
||||
}
|
||||
|
||||
/**
|
||||
* A namespace for built-in [[Logger]]s.
|
||||
*
|
||||
* @category Logger
|
||||
* @compatibility dart: "1.43.0", node: false
|
||||
*/
|
||||
export namespace Logger {
|
||||
/**
|
||||
* A [[Logger]] that silently ignores all warnings and debug messages.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* const sass = require('sass');
|
||||
*
|
||||
* const result = sass.renderSync({
|
||||
* file: 'input.scss',
|
||||
* logger: sass.Logger.silent,
|
||||
* });
|
||||
* ```
|
||||
*/
|
||||
export const silent: Logger;
|
||||
}
|
||||
+21
@@ -0,0 +1,21 @@
|
||||
/**
|
||||
* A specific location within a source file.
|
||||
*
|
||||
* This is always associated with a [[SourceSpan]] which indicates *which* file
|
||||
* it refers to.
|
||||
*
|
||||
* @category Logger
|
||||
*/
|
||||
export interface SourceLocation {
|
||||
/**
|
||||
* The 0-based index of this location within its source file, in terms of
|
||||
* UTF-16 code units.
|
||||
*/
|
||||
offset: number;
|
||||
|
||||
/** The 0-based line number of this location. */
|
||||
line: number;
|
||||
|
||||
/** The 0-based column number of this location. */
|
||||
column: number;
|
||||
}
|
||||
+34
@@ -0,0 +1,34 @@
|
||||
import {SourceLocation} from './source_location';
|
||||
|
||||
/**
|
||||
* A span of text within a source file.
|
||||
*
|
||||
* @category Logger
|
||||
*/
|
||||
export interface SourceSpan {
|
||||
/** The beginning of this span, inclusive. */
|
||||
start: SourceLocation;
|
||||
|
||||
/**
|
||||
* The end of this span, exclusive.
|
||||
*
|
||||
* If [[start]] and [[end]] refer to the same location, the span has zero
|
||||
* length and refers to the point immediately after [[start]] and before the
|
||||
* next character.
|
||||
*/
|
||||
end: SourceLocation;
|
||||
|
||||
/** The canonical URL of the file this span refers to. */
|
||||
url?: URL;
|
||||
|
||||
/** The text covered by the span. */
|
||||
text: string;
|
||||
|
||||
/**
|
||||
* Text surrounding the span.
|
||||
*
|
||||
* If this is set, it must include only whole lines, and it must include at
|
||||
* least all line(s) which are partially covered by this span.
|
||||
*/
|
||||
context?: string;
|
||||
}
|
||||
+418
@@ -0,0 +1,418 @@
|
||||
import {FileImporter, Importer} from './importer';
|
||||
import {Logger} from './logger';
|
||||
import {Value} from './value';
|
||||
import {PromiseOr} from './util/promise_or';
|
||||
|
||||
/**
|
||||
* Syntaxes supported by Sass:
|
||||
*
|
||||
* - `'scss'` is the [SCSS
|
||||
* syntax](https://sass-lang.com/documentation/syntax#scss).
|
||||
* - `'indented'` is the [indented
|
||||
* syntax](https://sass-lang.com/documentation/syntax#the-indented-syntax)
|
||||
* - `'css'` is plain CSS, which is parsed like SCSS but forbids the use of any
|
||||
* special Sass features.
|
||||
*
|
||||
* @category Options
|
||||
*/
|
||||
export type Syntax = 'scss' | 'indented' | 'css';
|
||||
|
||||
/**
|
||||
* Possible output styles for the compiled CSS:
|
||||
*
|
||||
* - `"expanded"` (the default for Dart Sass) writes each selector and
|
||||
* declaration on its own line.
|
||||
*
|
||||
* - `"compressed"` removes as many extra characters as possible, and writes
|
||||
* the entire stylesheet on a single line.
|
||||
*
|
||||
* @category Options
|
||||
*/
|
||||
export type OutputStyle = 'expanded' | 'compressed';
|
||||
|
||||
/**
|
||||
* A callback that implements a custom Sass function. This can be passed to
|
||||
* [[Options.functions]].
|
||||
*
|
||||
* ```js
|
||||
* const result = sass.compile('style.scss', {
|
||||
* functions: {
|
||||
* "sum($arg1, $arg2)": (args) => {
|
||||
* const value1 = args[0].assertNumber('arg1').value;
|
||||
* const value2 = args[1].assertNumber('arg2')
|
||||
* .convertValueToMatch(arg1, 'arg2', 'arg1');
|
||||
* return new sass.SassNumber(value1 + value2).coerceToMatch(arg1);
|
||||
* }
|
||||
* }
|
||||
* });
|
||||
* ```
|
||||
*
|
||||
* @typeParam sync - A `CustomFunction<'sync'>` must return synchronously, but
|
||||
* in return it can be passed to [[compile]] and [[compileString]] in addition
|
||||
* to [[compileAsync]] and [[compileStringAsync]].
|
||||
*
|
||||
* A `CustomFunction<'async'>` may either return synchronously or
|
||||
* asynchronously, but it can only be used with [[compileAsync]] and
|
||||
* [[compileStringAsync]].
|
||||
*
|
||||
* @param args - An array of arguments passed by the function's caller. If the
|
||||
* function takes [arbitrary
|
||||
* arguments](https://sass-lang.com/documentation/at-rules/function#taking-arbitrary-arguments),
|
||||
* the last element will be a [[SassArgumentList]].
|
||||
*
|
||||
* @returns The function's result. This may be in the form of a `Promise`, but
|
||||
* if it is the function may only be passed to [[compileAsync]] and
|
||||
* [[compileStringAsync]], not [[compile]] or [[compileString]].
|
||||
*
|
||||
* @throws any - This function may throw an error, which the Sass compiler will
|
||||
* treat as the function call failing. If the exception object has a `message`
|
||||
* property, it will be used as the wrapped exception's message; otherwise, the
|
||||
* exception object's `toString()` will be used. This means it's safe for custom
|
||||
* functions to throw plain strings.
|
||||
*
|
||||
* @category Custom Function
|
||||
*/
|
||||
export type CustomFunction<sync extends 'sync' | 'async'> = (
|
||||
args: Value[]
|
||||
) => PromiseOr<Value, sync>;
|
||||
|
||||
/**
|
||||
* Options that can be passed to [[compile]], [[compileAsync]],
|
||||
* [[compileString]], or [[compileStringAsync]].
|
||||
*
|
||||
* @typeParam sync - This lets the TypeScript checker verify that asynchronous
|
||||
* [[Importer]]s, [[FileImporter]]s, and [[CustomFunction]]s aren't passed to
|
||||
* [[compile]] or [[compileString]].
|
||||
*
|
||||
* @category Options
|
||||
*/
|
||||
export interface Options<sync extends 'sync' | 'async'> {
|
||||
/**
|
||||
* If this is `true`, the compiler will exclusively use ASCII characters in
|
||||
* its error and warning messages. Otherwise, it may use non-ASCII Unicode
|
||||
* characters as well.
|
||||
*
|
||||
* @defaultValue `false`
|
||||
* @category Messages
|
||||
*/
|
||||
alertAscii?: boolean;
|
||||
|
||||
/**
|
||||
* If this is `true`, the compiler will use ANSI color escape codes in its
|
||||
* error and warning messages. If it's `false`, it won't use these. If it's
|
||||
* undefined, the compiler will determine whether or not to use colors
|
||||
* depending on whether the user is using an interactive terminal.
|
||||
*
|
||||
* @category Messages
|
||||
*/
|
||||
alertColor?: boolean;
|
||||
|
||||
/**
|
||||
* Additional built-in Sass functions that are available in all stylesheets.
|
||||
* This option takes an object whose keys are Sass function signatures like
|
||||
* you'd write for the [`@function
|
||||
* rule`](https://sass-lang.com/documentation/at-rules/function) and whose
|
||||
* values are [[CustomFunction]]s.
|
||||
*
|
||||
* Functions are passed JavaScript representations of [Sass value
|
||||
* types](https://sass-lang.com/documentation/js-api#value-types), and must
|
||||
* return the same.
|
||||
*
|
||||
* When writing custom functions, it's important to make them as user-friendly
|
||||
* and as close to the standards set by Sass's core functions as possible. Some
|
||||
* good guidelines to follow include:
|
||||
*
|
||||
* * Use `Value.assert*` methods, like [[Value.assertString]], to cast untyped
|
||||
* `Value` objects to more specific types. For values that were passed
|
||||
* directly as arguments, pass in the argument name as well. This ensures
|
||||
* that the user gets good error messages when they pass in the wrong type
|
||||
* to your function.
|
||||
*
|
||||
* * Individual classes may have more specific `assert*` methods, like
|
||||
* [[SassNumber.assertInt]], which should be used when possible.
|
||||
*
|
||||
* * In Sass, every value counts as a list. Rather than trying to detect the
|
||||
* [[SassList]] type, you should use [[Value.asList]] to treat all values as
|
||||
* lists.
|
||||
*
|
||||
* * When manipulating values like lists, strings, and numbers that have
|
||||
* metadata (comma versus space separated, bracketed versus unbracketed,
|
||||
* quoted versus unquoted, units), the output metadata should match the
|
||||
* input metadata.
|
||||
*
|
||||
* * When in doubt, lists should default to comma-separated, strings should
|
||||
* default to quoted, and numbers should default to unitless.
|
||||
*
|
||||
* * In Sass, lists and strings use one-based indexing and use negative
|
||||
* indices to index from the end of value. Functions should follow these
|
||||
* conventions. [[Value.sassIndexToListIndex]] and
|
||||
* [[SassString.sassIndexToStringIndex]] can be used to do this
|
||||
* automatically.
|
||||
*
|
||||
* * String indexes in Sass refer to Unicode code points while JavaScript
|
||||
* string indices refer to UTF-16 code units. For example, the character
|
||||
* U+1F60A SMILING FACE WITH SMILING EYES is a single Unicode code point but
|
||||
* is represented in UTF-16 as two code units (`0xD83D` and `0xDE0A`). So in
|
||||
* JavaScript, `"a😊b".charCodeAt(1)` returns `0xD83D`, whereas in Sass
|
||||
* `str-slice("a😊b", 1, 1)` returns `"😊"`. Functions should follow Sass's
|
||||
* convention. [[SassString.sassIndexToStringIndex]] can be used to do this
|
||||
* automatically, and the [[SassString.sassLength]] getter can be used to
|
||||
* access a string's length in code points.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* sass.compileString(`
|
||||
* h1 {
|
||||
* font-size: pow(2, 5) * 1px;
|
||||
* }`, {
|
||||
* functions: {
|
||||
* // Note: in real code, you should use `math.pow()` from the built-in
|
||||
* // `sass:math` module.
|
||||
* 'pow($base, $exponent)': function(args) {
|
||||
* const base = args[0].assertNumber('base').assertNoUnits('base');
|
||||
* const exponent =
|
||||
* args[1].assertNumber('exponent').assertNoUnits('exponent');
|
||||
*
|
||||
* return new sass.SassNumber(Math.pow(base.value, exponent.value));
|
||||
* }
|
||||
* }
|
||||
* });
|
||||
* ```
|
||||
*
|
||||
* @category Plugins
|
||||
*/
|
||||
functions?: Record<string, CustomFunction<sync>>;
|
||||
|
||||
/**
|
||||
* Custom importers that control how Sass resolves loads from rules like
|
||||
* [`@use`](https://sass-lang.com/documentation/at-rules/use) and
|
||||
* [`@import`](https://sass-lang.com/documentation/at-rules/import).
|
||||
*
|
||||
* Loads are resolved by trying, in order:
|
||||
*
|
||||
* - The importer that was used to load the current stylesheet, with the
|
||||
* loaded URL resolved relative to the current stylesheet's canonical URL.
|
||||
*
|
||||
* - Each [[Importer]] or [[FileImporter]] in [[importers]], in order.
|
||||
*
|
||||
* - Each load path in [[loadPaths]], in order.
|
||||
*
|
||||
* If none of these return a Sass file, the load fails and Sass throws an
|
||||
* error.
|
||||
*
|
||||
* @category Plugins
|
||||
*/
|
||||
importers?: (Importer<sync> | FileImporter<sync>)[];
|
||||
|
||||
/**
|
||||
* Paths in which to look for stylesheets loaded by rules like
|
||||
* [`@use`](https://sass-lang.com/documentation/at-rules/use) and
|
||||
* [`@import`](https://sass-lang.com/documentation/at-rules/import).
|
||||
*
|
||||
* A load path `loadPath` is equivalent to the following [[FileImporter]]:
|
||||
*
|
||||
* ```js
|
||||
* {
|
||||
* findFileUrl(url) {
|
||||
* // Load paths only support relative URLs.
|
||||
* if (/^[a-z]+:/i.test(url)) return null;
|
||||
* return new URL(url, pathToFileURL(loadPath));
|
||||
* }
|
||||
* }
|
||||
* ```
|
||||
*
|
||||
* @category Input
|
||||
*/
|
||||
loadPaths?: string[];
|
||||
|
||||
/**
|
||||
* An object to use to handle warnings and/or debug messages from Sass.
|
||||
*
|
||||
* By default, Sass emits warnings and debug messages to standard error, but
|
||||
* if [[Logger.warn]] or [[Logger.debug]] is set, this will invoke them
|
||||
* instead.
|
||||
*
|
||||
* The special value [[Logger.silent]] can be used to easily silence all
|
||||
* messages.
|
||||
*
|
||||
* @category Messages
|
||||
*/
|
||||
logger?: Logger;
|
||||
|
||||
/**
|
||||
* If this option is set to `true`, Sass won’t print warnings that are caused
|
||||
* by dependencies. A “dependency” is defined as any file that’s loaded
|
||||
* through [[loadPaths]] or [[importer]]. Stylesheets that are imported
|
||||
* relative to the entrypoint are not considered dependencies.
|
||||
*
|
||||
* This is useful for silencing deprecation warnings that you can’t fix on
|
||||
* your own. However, please <em>also</em> notify your dependencies of the deprecations
|
||||
* so that they can get fixed as soon as possible!
|
||||
*
|
||||
* **Heads up!** If [[compileString]] or [[compileStringAsync]] is called
|
||||
* without [[StringWithoutImporter.url]], <em>all</em> stylesheets it loads
|
||||
* will be considered dependencies. Since it doesn’t have a path of its own,
|
||||
* everything it loads is coming from a load path rather than a relative
|
||||
* import.
|
||||
*
|
||||
* @defaultValue `false`
|
||||
* @category Messages
|
||||
*/
|
||||
quietDeps?: boolean;
|
||||
|
||||
/**
|
||||
* Whether or not Sass should generate a source map. If it does, the source
|
||||
* map will be available as [[CompileResult.sourceMap]].
|
||||
*
|
||||
* **Heads up!** Sass doesn't automatically add a `sourceMappingURL` comment
|
||||
* to the generated CSS. It's up to callers to do that, since callers have
|
||||
* full knowledge of where the CSS and the source map will exist in relation
|
||||
* to one another and how they'll be served to the browser.
|
||||
*
|
||||
* @defaultValue `false`
|
||||
* @category Output
|
||||
*/
|
||||
sourceMap?: boolean;
|
||||
|
||||
/**
|
||||
* Whether Sass should include the sources in the generated source map.
|
||||
*
|
||||
* This option has no effect if [[sourceMap]] is `false`.
|
||||
*
|
||||
* @defaultValue `false`
|
||||
* @category Output
|
||||
*/
|
||||
sourceMapIncludeSources?: boolean;
|
||||
|
||||
/**
|
||||
* The [[OutputStyle]] of the compiled CSS.
|
||||
*
|
||||
* @example
|
||||
*
|
||||
* ```js
|
||||
* const source = `
|
||||
* h1 {
|
||||
* font-size: 40px;
|
||||
* code {
|
||||
* font-face: Roboto Mono;
|
||||
* }
|
||||
* }`;
|
||||
*
|
||||
* let result = sass.compileString(source, {style: "expanded"});
|
||||
* console.log(result.css.toString());
|
||||
* // h1 {
|
||||
* // font-size: 40px;
|
||||
* // }
|
||||
* // h1 code {
|
||||
* // font-face: Roboto Mono;
|
||||
* // }
|
||||
*
|
||||
* result = sass.compileString(source, {style: "compressed"})
|
||||
* console.log(result.css.toString());
|
||||
* // h1{font-size:40px}h1 code{font-face:Roboto Mono}
|
||||
* ```
|
||||
*
|
||||
* @category Output
|
||||
*/
|
||||
style?: OutputStyle;
|
||||
|
||||
/**
|
||||
* By default, Dart Sass will print only five instances of the same
|
||||
* deprecation warning per compilation to avoid deluging users in console
|
||||
* noise. If you set `verbose` to `true`, it will instead print every
|
||||
* deprecation warning it encounters.
|
||||
*
|
||||
* @defaultValue `false`
|
||||
* @category Messages
|
||||
*/
|
||||
verbose?: boolean;
|
||||
}
|
||||
|
||||
/**
|
||||
* Options that can be passed to [[compileString]] or [[compileStringAsync]].
|
||||
*
|
||||
* If the [[StringOptionsWithImporter.importer]] field isn't passed, the
|
||||
* entrypoint file can't load files relative to itself and the [[url]] field is
|
||||
* optional.
|
||||
*
|
||||
* @typeParam sync - This lets the TypeScript checker verify that asynchronous
|
||||
* [[Importer]]s, [[FileImporter]]s, and [[CustomFunction]]s aren't passed to
|
||||
* [[compile]] or [[compileString]].
|
||||
*
|
||||
* @category Options
|
||||
*/
|
||||
export interface StringOptionsWithoutImporter<sync extends 'sync' | 'async'>
|
||||
extends Options<sync> {
|
||||
/**
|
||||
* The [[Syntax]] to use to parse the entrypoint stylesheet.
|
||||
*
|
||||
* @default `'scss'`
|
||||
*
|
||||
* @category Input
|
||||
*/
|
||||
syntax?: Syntax;
|
||||
|
||||
/**
|
||||
* The canonical URL of the entrypoint stylesheet. If this isn't passed along
|
||||
* with [[StringOptionsWithoutImporter.importer]], it's optional and only used
|
||||
* for error reporting.
|
||||
*
|
||||
* @category Input
|
||||
*/
|
||||
url?: URL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Options that can be passed to [[compileString]] or [[compileStringAsync]].
|
||||
*
|
||||
* If the [[StringOptionsWithImporter.importer]] field is passed, the entrypoint
|
||||
* file uses it to load files relative to itself and the [[url]] field is
|
||||
* mandatory.
|
||||
*
|
||||
* @typeParam sync - This lets the TypeScript checker verify that asynchronous
|
||||
* [[Importer]]s, [[FileImporter]]s, and [[CustomFunction]]s aren't passed to
|
||||
* [[compile]] or [[compileString]].
|
||||
*
|
||||
* @category Options
|
||||
*/
|
||||
export interface StringOptionsWithImporter<sync extends 'sync' | 'async'>
|
||||
extends StringOptionsWithoutImporter<sync> {
|
||||
/**
|
||||
* The importer to use to handle loads that are relative to the entrypoint
|
||||
* stylesheet.
|
||||
*
|
||||
* A relative load's URL is first resolved relative to [[url]], then passed to
|
||||
* [[importer]]. If the importer doesn't recognize it, it's then passed to
|
||||
* [[importers]] and [[loadPaths]].
|
||||
*
|
||||
* @category Input
|
||||
*/
|
||||
importer: Importer<sync> | FileImporter<sync>;
|
||||
|
||||
/**
|
||||
* The canonical URL of the entrypoint stylesheet. If this is passed along
|
||||
* with [[importer]], it's used to resolve relative loads in the entrypoint
|
||||
* stylesheet.
|
||||
*
|
||||
* @category Input
|
||||
*/
|
||||
url: URL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Options that can be passed to [[compileString]] or [[compileStringAsync]].
|
||||
*
|
||||
* This is a [[StringOptionsWithImporter]] if it has a
|
||||
* [[StringOptionsWithImporter.importer]] field, and a
|
||||
* [[StringOptionsWithoutImporter]] otherwise.
|
||||
*
|
||||
* @typeParam sync - This lets the TypeScript checker verify that asynchronous
|
||||
* [[Importer]]s, [[FileImporter]]s, and [[CustomFunction]]s aren't passed to
|
||||
* [[compile]] or [[compileString]].
|
||||
*
|
||||
* @category Options
|
||||
*/
|
||||
export type StringOptions<sync extends 'sync' | 'async'> =
|
||||
| StringOptionsWithImporter<sync>
|
||||
| StringOptionsWithoutImporter<sync>;
|
||||
+17
@@ -0,0 +1,17 @@
|
||||
/**
|
||||
* A utility type for choosing between synchronous and asynchronous return
|
||||
* values.
|
||||
*
|
||||
* This is used as the return value for plugins like [[CustomFunction]],
|
||||
* [[Importer]], and [[FileImporter]] so that TypeScript enforces that
|
||||
* asynchronous plugins are only passed to [[compileAsync]] and
|
||||
* [[compileStringAsync]], not [[compile]] or [[compileString]].
|
||||
*
|
||||
* @typeParam sync - If this is `'sync'`, this can only be a `T`. If it's
|
||||
* `'async'`, this can be either a `T` or a `Promise<T>`.
|
||||
*
|
||||
* @category Other
|
||||
*/
|
||||
export type PromiseOr<T, sync extends 'sync' | 'async'> = sync extends 'async'
|
||||
? T | Promise<T>
|
||||
: T;
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
import {List, OrderedMap} from 'immutable';
|
||||
|
||||
import {Value} from './index';
|
||||
import {SassList, ListSeparator} from './list';
|
||||
|
||||
/**
|
||||
* Sass's [argument list
|
||||
* type](https://sass-lang.com/documentation/values/lists#argument-lists).
|
||||
*
|
||||
* An argument list comes from a rest argument. It's distinct from a normal
|
||||
* [[SassList]] in that it may contain a keyword map as well as the positional
|
||||
* arguments.
|
||||
*
|
||||
* @category Custom Function
|
||||
*/
|
||||
export class SassArgumentList extends SassList {
|
||||
/**
|
||||
* Creates a new argument list.
|
||||
*
|
||||
* @param contents - The positional arguments that make up the primary
|
||||
* contents of the list. This may be either a plain JavaScript array or an
|
||||
* immutable [[List]] from the [`immutable`
|
||||
* package](https://immutable-js.com/).
|
||||
*
|
||||
* @param keywords - The keyword arguments attached to this argument list,
|
||||
* whose names should exclude `$`. This can be either a plain JavaScript
|
||||
* object with argument names as fields, or an immutable [[OrderedMap]] from
|
||||
* the [`immutable` package](https://immutable-js.com/)
|
||||
*
|
||||
* @param separator - The separator for this list. Defaults to `','`.
|
||||
*/
|
||||
constructor(
|
||||
contents: Value[] | List<Value>,
|
||||
keywords: Record<string, Value> | OrderedMap<string, Value>,
|
||||
separator?: ListSeparator
|
||||
);
|
||||
|
||||
/**
|
||||
* The keyword arguments attached to this argument list.
|
||||
*
|
||||
* The argument names don't include `$`.
|
||||
*
|
||||
* @returns An immutable [[OrderedMap]] from the [`immutable`
|
||||
* package](https://immutable-js.com/).
|
||||
*/
|
||||
get keywords(): OrderedMap<string, Value>;
|
||||
}
|
||||
+29
@@ -0,0 +1,29 @@
|
||||
import {Value} from './index';
|
||||
|
||||
/**
|
||||
* Sass's [`true` value](https://sass-lang.com/documentation/values/booleans).
|
||||
*
|
||||
* @category Custom Function
|
||||
*/
|
||||
export const sassTrue: SassBoolean;
|
||||
|
||||
/**
|
||||
* Sass's [`false` value](https://sass-lang.com/documentation/values/booleans).
|
||||
*
|
||||
* @category Custom Function
|
||||
*/
|
||||
export const sassFalse: SassBoolean;
|
||||
|
||||
/**
|
||||
* Sass's [boolean type](https://sass-lang.com/documentation/values/booleans).
|
||||
*
|
||||
* @category Custom Function
|
||||
*/
|
||||
export class SassBoolean extends Value {
|
||||
private constructor();
|
||||
|
||||
/**
|
||||
* Whether this value is `true` or `false`.
|
||||
*/
|
||||
get value(): boolean;
|
||||
}
|
||||
+107
@@ -0,0 +1,107 @@
|
||||
import {Value} from './index';
|
||||
|
||||
/**
|
||||
* Sass's [color type](https://sass-lang.com/documentation/values/colors).
|
||||
*
|
||||
* No matter what representation was originally used to create this color, all
|
||||
* of its channels are accessible.
|
||||
*
|
||||
* @category Custom Function
|
||||
*/
|
||||
export class SassColor extends Value {
|
||||
/**
|
||||
* Creates an RGB color.
|
||||
*
|
||||
* @throws `Error` if `red`, `green`, and `blue` aren't between `0` and
|
||||
* `255`, or if `alpha` isn't between `0` and `1`.
|
||||
*/
|
||||
constructor(options: {
|
||||
red: number;
|
||||
green: number;
|
||||
blue: number;
|
||||
alpha?: number;
|
||||
});
|
||||
|
||||
/**
|
||||
* Creates an HSL color.
|
||||
*
|
||||
* @throws `Error` if `saturation` or `lightness` aren't between `0` and
|
||||
* `100`, or if `alpha` isn't between `0` and `1`.
|
||||
*/
|
||||
constructor(options: {
|
||||
hue: number;
|
||||
saturation: number;
|
||||
lightness: number;
|
||||
alpha?: number;
|
||||
});
|
||||
|
||||
/**
|
||||
* Creates an HWB color.
|
||||
*
|
||||
* @throws `Error` if `whiteness` or `blackness` aren't between `0` and `100`,
|
||||
* or if `alpha` isn't between `0` and `1`.
|
||||
*/
|
||||
constructor(options: {
|
||||
hue: number;
|
||||
whiteness: number;
|
||||
blackness: number;
|
||||
alpha?: number;
|
||||
});
|
||||
|
||||
/** This color's red channel, between `0` and `255`. */
|
||||
get red(): number;
|
||||
|
||||
/** This color's green channel, between `0` and `255`. */
|
||||
get green(): number;
|
||||
|
||||
/** This color's blue channel, between `0` and `255`. */
|
||||
get blue(): number;
|
||||
|
||||
/** This color's hue, between `0` and `360`. */
|
||||
get hue(): number;
|
||||
|
||||
/** This color's saturation, between `0` and `100`. */
|
||||
get saturation(): number;
|
||||
|
||||
/** This color's lightness, between `0` and `100`. */
|
||||
get lightness(): number;
|
||||
|
||||
/** This color's whiteness, between `0` and `100`. */
|
||||
get whiteness(): number;
|
||||
|
||||
/** This color's blackness, between `0` and `100`. */
|
||||
get blackness(): number;
|
||||
|
||||
/** This color's alpha channel, between `0` and `1`. */
|
||||
get alpha(): number;
|
||||
|
||||
/**
|
||||
* Changes one or more of this color's RGB channels and returns the result.
|
||||
*/
|
||||
change(options: {
|
||||
red?: number;
|
||||
green?: number;
|
||||
blue?: number;
|
||||
alpha?: number;
|
||||
}): SassColor;
|
||||
|
||||
/**
|
||||
* Changes one or more of this color's HSL channels and returns the result.
|
||||
*/
|
||||
change(options: {
|
||||
hue?: number;
|
||||
saturation?: number;
|
||||
lightness?: number;
|
||||
alpha?: number;
|
||||
}): SassColor;
|
||||
|
||||
/**
|
||||
* Changes one or more of this color's HWB channels and returns the result.
|
||||
*/
|
||||
change(options: {
|
||||
hue?: number;
|
||||
whiteness?: number;
|
||||
blackness?: number;
|
||||
alpha?: number;
|
||||
}): SassColor;
|
||||
}
|
||||
+22
@@ -0,0 +1,22 @@
|
||||
import {Value} from './index';
|
||||
|
||||
/**
|
||||
* Sass's [function type](https://sass-lang.com/documentation/values/functions).
|
||||
*
|
||||
* **Heads up!** Although first-class Sass functions can be processed by custom
|
||||
* functions, there's no way to invoke them outside of a Sass stylesheet.
|
||||
*
|
||||
* @category Custom Function
|
||||
*/
|
||||
export class SassFunction extends Value {
|
||||
/**
|
||||
* Creates a new first-class function that can be invoked using
|
||||
* [`meta.call()`](https://sass-lang.com/documentation/modules/meta#call).
|
||||
*
|
||||
* @param signature - The function signature, like you'd write for the
|
||||
* [`@function rule`](https://sass-lang.com/documentation/at-rules/function).
|
||||
* @param callback - The callback that's invoked when this function is called,
|
||||
* just like for a [[CustomFunction]].
|
||||
*/
|
||||
constructor(signature: string, callback: (args: Value[]) => Value);
|
||||
}
|
||||
+173
@@ -0,0 +1,173 @@
|
||||
import {List, ValueObject} from 'immutable';
|
||||
|
||||
import {SassBoolean} from './boolean';
|
||||
import {SassColor} from './color';
|
||||
import {SassFunction} from './function';
|
||||
import {ListSeparator} from './list';
|
||||
import {SassMap} from './map';
|
||||
import {SassNumber} from './number';
|
||||
import {SassString} from './string';
|
||||
|
||||
export {SassArgumentList} from './argument_list';
|
||||
export {SassBoolean, sassTrue, sassFalse} from './boolean';
|
||||
export {SassColor} from './color';
|
||||
export {SassFunction} from './function';
|
||||
export {SassList, ListSeparator} from './list';
|
||||
export {SassMap} from './map';
|
||||
export {SassNumber} from './number';
|
||||
export {SassString} from './string';
|
||||
|
||||
/**
|
||||
* Sass's [`null` value](https://sass-lang.com/documentation/values/null).
|
||||
*
|
||||
* @category Custom Function
|
||||
*/
|
||||
export const sassNull: Value;
|
||||
|
||||
/**
|
||||
* The abstract base class of Sass's value types.
|
||||
*
|
||||
* This is passed to and returned by [[CustomFunction]]s, which are passed into
|
||||
* the Sass implementation using [[Options.functions]].
|
||||
*
|
||||
* @category Custom Function
|
||||
*/
|
||||
export abstract class Value implements ValueObject {
|
||||
protected constructor();
|
||||
|
||||
/**
|
||||
* This value as a list.
|
||||
*
|
||||
* All SassScript values can be used as lists. Maps count as lists of pairs,
|
||||
* and all other values count as single-value lists.
|
||||
*
|
||||
* @returns An immutable [[List]] from the [`immutable`
|
||||
* package](https://immutable-js.com/).
|
||||
*/
|
||||
get asList(): List<Value>;
|
||||
|
||||
/**
|
||||
* Whether this value as a list has brackets.
|
||||
*
|
||||
* All SassScript values can be used as lists. Maps count as lists of pairs,
|
||||
* and all other values count as single-value lists.
|
||||
*/
|
||||
get hasBrackets(): boolean;
|
||||
|
||||
/**
|
||||
* Whether the value counts as `true` in an `@if` statement and other
|
||||
* contexts.
|
||||
*/
|
||||
get isTruthy(): boolean;
|
||||
|
||||
/**
|
||||
* Returns JavaScript's `null` value if this is [[sassNull]], and returns
|
||||
* `this` otherwise.
|
||||
*/
|
||||
get realNull(): null | Value;
|
||||
|
||||
/**
|
||||
* The separator for this value as a list.
|
||||
*
|
||||
* All SassScript values can be used as lists. Maps count as lists of pairs,
|
||||
* and all other values count as single-value lists.
|
||||
*/
|
||||
get separator(): ListSeparator;
|
||||
|
||||
/**
|
||||
* Converts `sassIndex` into a JavaScript-style index into the list returned
|
||||
* by [[asList]].
|
||||
*
|
||||
* Sass indexes are one-based, while JavaScript indexes are zero-based. Sass
|
||||
* indexes may also be negative in order to index from the end of the list.
|
||||
*
|
||||
* @param sassIndex - The Sass-style index into this as a list.
|
||||
* @param name - The name of the function argument `sassIndex` came from
|
||||
* (without the `$`) if it came from an argument. Used for error reporting.
|
||||
* @throws `Error` If `sassIndex` isn't a number, if that number isn't an
|
||||
* integer, or if that integer isn't a valid index for [[asList]].
|
||||
*/
|
||||
sassIndexToListIndex(sassIndex: Value, name?: string): number;
|
||||
|
||||
/**
|
||||
* Returns the value at index `index` in this value as a list, or `undefined`
|
||||
* if `index` isn't valid for this list.
|
||||
*
|
||||
* All SassScript values can be used as lists. Maps count as lists of pairs,
|
||||
* and all other values count as single-value lists.
|
||||
*
|
||||
* This is a shorthand for `this.asList.get(index)`, although it may be more
|
||||
* efficient in some cases.
|
||||
*
|
||||
* **Heads up!** This method uses the same indexing conventions as the
|
||||
* `immutable` package: unlike Sass the index of the first element is 0, but
|
||||
* like Sass negative numbers index from the end of the list.
|
||||
*/
|
||||
get(index: number): Value | undefined;
|
||||
|
||||
/**
|
||||
* Throws if `this` isn't a [[SassBoolean]].
|
||||
*
|
||||
* **Heads up!** Functions should generally use [[isTruthy]] rather than
|
||||
* requiring a literal boolean.
|
||||
*
|
||||
* @param name - The name of the function argument `this` came from (without
|
||||
* the `$`) if it came from an argument. Used for error reporting.
|
||||
*/
|
||||
assertBoolean(name?: string): SassBoolean;
|
||||
|
||||
/**
|
||||
* Throws if `this` isn't a [[SassColor]].
|
||||
*
|
||||
* @param name - The name of the function argument `this` came from (without
|
||||
* the `$`) if it came from an argument. Used for error reporting.
|
||||
*/
|
||||
assertColor(name?: string): SassColor;
|
||||
|
||||
/**
|
||||
* Throws if `this` isn't a [[SassFunction]].
|
||||
*
|
||||
* @param name - The name of the function argument `this` came from (without
|
||||
* the `$`) if it came from an argument. Used for error reporting.
|
||||
*/
|
||||
assertFunction(name?: string): SassFunction;
|
||||
|
||||
/**
|
||||
* Throws if `this` isn't a [[SassMap]].
|
||||
*
|
||||
* @param name - The name of the function argument `this` came from (without
|
||||
* the `$`) if it came from an argument. Used for error reporting.
|
||||
*/
|
||||
assertMap(name?: string): SassMap;
|
||||
|
||||
/**
|
||||
* Throws if `this` isn't a [[SassNumber]].
|
||||
*
|
||||
* @param name - The name of the function argument `this` came from (without
|
||||
* the `$`) if it came from an argument. Used for error reporting.
|
||||
*/
|
||||
assertNumber(name?: string): SassNumber;
|
||||
|
||||
/**
|
||||
* Throws if `this` isn't a [[SassString]].
|
||||
*
|
||||
* @param name - The name of the function argument `this` came from (without
|
||||
* the `$`) if it came from an argument. Used for error reporting.
|
||||
*/
|
||||
assertString(name?: string): SassString;
|
||||
|
||||
/**
|
||||
* Returns `this` as a map if it counts as one (empty lists count as empty
|
||||
* maps) or `null` if it doesn't.
|
||||
*/
|
||||
tryMap(): SassMap | null;
|
||||
|
||||
/** Returns whether `this` represents the same value as `other`. */
|
||||
equals(other: Value): boolean;
|
||||
|
||||
/** Returns a hash code that can be used to store `this` in a hash map. */
|
||||
hashCode(): number;
|
||||
|
||||
/** @hidden */
|
||||
toString(): string;
|
||||
}
|
||||
+54
@@ -0,0 +1,54 @@
|
||||
import {List} from 'immutable';
|
||||
|
||||
import {Value} from './index';
|
||||
|
||||
/**
|
||||
* Possible separators used by Sass lists. The special separator `null` is only
|
||||
* used for lists with fewer than two elements, and indicates that the separator
|
||||
* has not yet been decided for this list.
|
||||
*
|
||||
* @category Custom Function
|
||||
*/
|
||||
export type ListSeparator = ',' | '/' | ' ' | null;
|
||||
|
||||
/**
|
||||
* Sass's [list type](https://sass-lang.com/documentation/values/lists).
|
||||
*
|
||||
* @category Custom Function
|
||||
*/
|
||||
export class SassList extends Value {
|
||||
/**
|
||||
* Creates a new list.
|
||||
*
|
||||
* @param contents - The contents of the list. This may be either a plain
|
||||
* JavaScript array or an immutable [[List]] from the [`immutable`
|
||||
* package](https://immutable-js.com/).
|
||||
*
|
||||
* @param options.separator - The separator to use between elements of this
|
||||
* list. Defaults to `','`.
|
||||
*
|
||||
* @param options.brackets - Whether the list has square brackets. Defaults to
|
||||
* `false`.
|
||||
*/
|
||||
constructor(
|
||||
contents: Value[] | List<Value>,
|
||||
options?: {
|
||||
separator?: ListSeparator;
|
||||
brackets?: boolean;
|
||||
}
|
||||
);
|
||||
|
||||
/**
|
||||
* Creates an empty list.
|
||||
*
|
||||
* @param options.separator - The separator to use between elements of this
|
||||
* list. Defaults to `','`.
|
||||
*
|
||||
* @param options.brackets - Whether the list has square brackets. Defaults to
|
||||
* `false`.
|
||||
*/
|
||||
constructor(options?: {separator?: ListSeparator; brackets?: boolean});
|
||||
|
||||
/** @hidden */
|
||||
get separator(): ListSeparator;
|
||||
}
|
||||
+41
@@ -0,0 +1,41 @@
|
||||
import {OrderedMap} from 'immutable';
|
||||
|
||||
import {SassList} from './list';
|
||||
import {Value} from './index';
|
||||
|
||||
/**
|
||||
* Sass's [map type](https://sass-lang.com/documentation/values/maps).
|
||||
*
|
||||
* @category Custom Function
|
||||
*/
|
||||
export class SassMap extends Value {
|
||||
/**
|
||||
* Creates a new map.
|
||||
*
|
||||
* @param contents - The contents of the map. This is an immutable
|
||||
* [[OrderedMap]] from the [`immutable` package](https://immutable-js.com/).
|
||||
* Defaults to an empty map.
|
||||
*/
|
||||
constructor(contents?: OrderedMap<Value, Value>);
|
||||
|
||||
/**
|
||||
* Returns the contents of this map as an immutable [[OrderedMap]] from the
|
||||
* [`immutable` package](https://immutable-js.com/).
|
||||
*/
|
||||
get contents(): OrderedMap<Value, Value>;
|
||||
|
||||
/**
|
||||
* Returns the value associated with `key` in this map, or `undefined` if
|
||||
* `key` isn't in the map.
|
||||
*
|
||||
* This is a shorthand for `this.contents.get(key)`, although it may be more
|
||||
* efficient in some cases.
|
||||
*/
|
||||
get(key: Value): Value | undefined;
|
||||
|
||||
/** Inherited from [[Value.get]]. */
|
||||
get(index: number): SassList | undefined;
|
||||
|
||||
/** @hidden */
|
||||
tryMap(): SassMap;
|
||||
}
|
||||
+305
@@ -0,0 +1,305 @@
|
||||
import {List} from 'immutable';
|
||||
|
||||
import {Value} from './index';
|
||||
|
||||
/**
|
||||
* Sass's [number type](https://sass-lang.com/documentation/values/numbers).
|
||||
*
|
||||
* @category Custom Function
|
||||
*/
|
||||
export class SassNumber extends Value {
|
||||
/**
|
||||
* Creates a new number with more complex units than just a single numerator.
|
||||
*
|
||||
* Upon construction, any compatible numerator and denominator units are
|
||||
* simplified away according to the conversion factor between them.
|
||||
*
|
||||
* @param value - The number's numeric value.
|
||||
*
|
||||
* @param unit - If this is a string, it's used as the single numerator unit
|
||||
* for the number.
|
||||
*
|
||||
* @param unit.numeratorUnits - If passed, these are the numerator units to
|
||||
* use for the number. This may be either a plain JavaScript array or an
|
||||
* immutable [[List]] from the [`immutable`
|
||||
* package](https://immutable-js.com/).
|
||||
*
|
||||
* @param unit.denominatorUnits - If passed, these are the denominator units
|
||||
* to use for the number. This may be either a plain JavaScript array or an
|
||||
* immutable [[List]] from the [`immutable`
|
||||
* package](https://immutable-js.com/).
|
||||
*/
|
||||
constructor(
|
||||
value: number,
|
||||
unit?:
|
||||
| string
|
||||
| {
|
||||
numeratorUnits?: string[] | List<string>;
|
||||
denominatorUnits?: string[] | List<string>;
|
||||
}
|
||||
);
|
||||
|
||||
/** This number's numeric value. */
|
||||
get value(): number;
|
||||
|
||||
/** Whether [[value]] is an integer according to Sass's equality logic. */
|
||||
get isInt(): boolean;
|
||||
|
||||
/**
|
||||
* If [[value]] is an integer according to [[isInt]], returns [[value]]
|
||||
* rounded to that integer. If it's not an integer, returns `null`.
|
||||
*/
|
||||
get asInt(): number | null;
|
||||
|
||||
/**
|
||||
* This number's numerator units as an immutable [[List]] from the
|
||||
* [`immutable` package](https://immutable-js.com/).
|
||||
*/
|
||||
get numeratorUnits(): List<string>;
|
||||
|
||||
/**
|
||||
* This number's denominator units as an immutable [[List]] from the
|
||||
* [`immutable` package](https://immutable-js.com/).
|
||||
*/
|
||||
get denominatorUnits(): List<string>;
|
||||
|
||||
/** Whether this number has any numerator or denominator units. */
|
||||
get hasUnits(): boolean;
|
||||
|
||||
/**
|
||||
* If [[value]] is an integer according to [[isInt]], returns it rounded to
|
||||
* that integer. Otherwise, throws an error.
|
||||
*
|
||||
* @param name - The name of the function argument `this` came from (without
|
||||
* the `$`) if it came from an argument. Used for error reporting.
|
||||
*/
|
||||
assertInt(name?: string): number;
|
||||
|
||||
/**
|
||||
* Returns [[value]] if it's within `min` and `max`. If [[value]] is equal to
|
||||
* `min` or `max` according to Sass's equality, returns `min` or `max`
|
||||
* respectively. Otherwise, throws an error.
|
||||
*
|
||||
* @param name - The name of the function argument `this` came from (without
|
||||
* the `$`) if it came from an argument. Used for error reporting.
|
||||
*/
|
||||
assertInRange(min: number, max: number, name?: string): number;
|
||||
|
||||
/**
|
||||
* If this number has no units, returns it. Otherwise, throws an error.
|
||||
*
|
||||
* @param name - The name of the function argument `this` came from (without
|
||||
* the `$`) if it came from an argument. Used for error reporting.
|
||||
*/
|
||||
assertNoUnits(name?: string): SassNumber;
|
||||
|
||||
/**
|
||||
* If this number has `unit` as its only unit (and as a numerator), returns
|
||||
* this number. Otherwise, throws an error.
|
||||
*
|
||||
* @param name - The name of the function argument `this` came from (without
|
||||
* the `$`) if it came from an argument. Used for error reporting.
|
||||
*/
|
||||
assertUnit(unit: string, name?: string): SassNumber;
|
||||
|
||||
/** Whether this number has `unit` as its only unit (and as a numerator). */
|
||||
hasUnit(unit: string): boolean;
|
||||
|
||||
/**
|
||||
* Whether this has exactly one numerator unit, and that unit is compatible
|
||||
* with `unit`.
|
||||
*/
|
||||
compatibleWithUnit(unit: string): boolean;
|
||||
|
||||
/**
|
||||
* Returns a copy of this number, converted to the units represented by
|
||||
* `newNumerators` and `newDenominators`.
|
||||
*
|
||||
* @throws `Error` if this number's units are incompatible with
|
||||
* `newNumerators` and `newDenominators`; or if this number is unitless and
|
||||
* either `newNumerators` or `newDenominators` are not empty, or vice-versa.
|
||||
*
|
||||
* @param newNumerators - The numerator units to convert this number to. This
|
||||
* may be either a plain JavaScript array or an immutable [[List]] from the
|
||||
* [`immutable` package](https://immutable-js.com/).
|
||||
*
|
||||
* @param newDenominators - The denominator units to convert this number to.
|
||||
* This may be either a plain JavaScript array or an immutable [[List]] from
|
||||
* the [`immutable` package](https://immutable-js.com/).
|
||||
*
|
||||
* @param name - The name of the function argument `this` came from (without
|
||||
* the `$`) if it came from an argument. Used for error reporting.
|
||||
*/
|
||||
convert(
|
||||
newNumerators: string[] | List<string>,
|
||||
newDenominators: string[] | List<string>,
|
||||
name?: string
|
||||
): SassNumber;
|
||||
|
||||
/**
|
||||
* Returns a copy of this number, converted to the same units as `other`.
|
||||
*
|
||||
* @throws `Error` if this number's units are incompatible with `other`'s
|
||||
* units, or if either number is unitless but the other is not.
|
||||
*
|
||||
* @param name - The name of the function argument `this` came from (without
|
||||
* the `$`) if it came from an argument. Used for error reporting.
|
||||
*
|
||||
* @param otherName - The name of the function argument `other` came from
|
||||
* (without the `$`) if it came from an argument. Used for error reporting.
|
||||
*/
|
||||
convertToMatch(
|
||||
other: SassNumber,
|
||||
name?: string,
|
||||
otherName?: string
|
||||
): SassNumber;
|
||||
|
||||
/**
|
||||
* Returns [[value]], converted to the units represented by `newNumerators`
|
||||
* and `newDenominators`.
|
||||
*
|
||||
* @throws `Error` if this number's units are incompatible with
|
||||
* `newNumerators` and `newDenominators`; or if this number is unitless and
|
||||
* either `newNumerators` or `newDenominators` are not empty, or vice-versa.
|
||||
*
|
||||
* @param newNumerators - The numerator units to convert [[value]] to. This
|
||||
* may be either a plain JavaScript array or an immutable [[List]] from the
|
||||
* [`immutable` package](https://immutable-js.com/).
|
||||
*
|
||||
* @param newDenominators - The denominator units to convert [[value]] to.
|
||||
* This may be either a plain JavaScript array or an immutable [[List]] from
|
||||
* the [`immutable` package](https://immutable-js.com/).
|
||||
*
|
||||
* @param name - The name of the function argument `this` came from (without
|
||||
* the `$`) if it came from an argument. Used for error reporting.
|
||||
*/
|
||||
convertValue(
|
||||
newNumerators: string[] | List<string>,
|
||||
newDenominators: string[] | List<string>,
|
||||
name?: string
|
||||
): number;
|
||||
|
||||
/**
|
||||
* Returns [[value]], converted to the same units as `other`.
|
||||
*
|
||||
* @throws `Error` if this number's units are incompatible with `other`'s
|
||||
* units, or if either number is unitless but the other is not.
|
||||
*
|
||||
* @param name - The name of the function argument `this` came from (without
|
||||
* the `$`) if it came from an argument. Used for error reporting.
|
||||
*
|
||||
* @param otherName - The name of the function argument `other` came from
|
||||
* (without the `$`) if it came from an argument. Used for error reporting.
|
||||
*/
|
||||
convertValueToMatch(
|
||||
other: SassNumber,
|
||||
name?: string,
|
||||
otherName?: string
|
||||
): number;
|
||||
|
||||
/**
|
||||
* Returns a copy of this number, converted to the units represented by
|
||||
* `newNumerators` and `newDenominators`.
|
||||
*
|
||||
* Unlike [[convert]] this does *not* throw an error if this number is
|
||||
* unitless and either `newNumerators` or `newDenominators` are not empty, or
|
||||
* vice-versa. Instead, it treats all unitless numbers as convertible to and
|
||||
* from all units without changing the value.
|
||||
*
|
||||
* @throws `Error` if this number's units are incompatible with
|
||||
* `newNumerators` and `newDenominators`.
|
||||
*
|
||||
* @param newNumerators - The numerator units to convert this number to. This
|
||||
* may be either a plain JavaScript array or an immutable [[List]] from the
|
||||
* [`immutable` package](https://immutable-js.com/).
|
||||
*
|
||||
* @param newDenominators - The denominator units to convert this number to.
|
||||
* This may be either a plain JavaScript array or an immutable [[List]] from
|
||||
* the [`immutable` package](https://immutable-js.com/).
|
||||
*
|
||||
* @param name - The name of the function argument `this` came from (without
|
||||
* the `$`) if it came from an argument. Used for error reporting.
|
||||
*/
|
||||
coerce(
|
||||
newNumerators: string[] | List<string>,
|
||||
newDenominators: string[] | List<string>,
|
||||
name?: string
|
||||
): SassNumber;
|
||||
|
||||
/**
|
||||
* Returns a copy of this number, converted to the units represented by
|
||||
* `newNumerators` and `newDenominators`.
|
||||
*
|
||||
* Unlike [[convertToMatch]] this does *not* throw an error if this number is
|
||||
* unitless and either `newNumerators` or `newDenominators` are not empty, or
|
||||
* vice-versa. Instead, it treats all unitless numbers as convertible to and
|
||||
* from all units without changing the value.
|
||||
*
|
||||
* @throws `Error` if this number's units are incompatible with `other`'s
|
||||
* units.
|
||||
*
|
||||
* @param name - The name of the function argument `this` came from (without
|
||||
* the `$`) if it came from an argument. Used for error reporting.
|
||||
*
|
||||
* @param otherName - The name of the function argument `other` came from
|
||||
* (without the `$`) if it came from an argument. Used for error reporting.
|
||||
*/
|
||||
coerceToMatch(
|
||||
other: SassNumber,
|
||||
name?: string,
|
||||
otherName?: string
|
||||
): SassNumber;
|
||||
|
||||
/**
|
||||
* Returns [[value]], converted to the units represented by `newNumerators` and
|
||||
* `newDenominators`.
|
||||
*
|
||||
* Unlike [[convertValue]] this does *not* throw an error if this number is
|
||||
* unitless and either `newNumerators` or `newDenominators` are not empty, or
|
||||
* vice-versa. Instead, it treats all unitless numbers as convertible to and
|
||||
* from all units without changing the value.
|
||||
*
|
||||
* @throws `Error` if this number's units are incompatible with
|
||||
* `newNumerators` and `newDenominators`.
|
||||
*
|
||||
* @param newNumerators - The numerator units to convert [[value]] to. This
|
||||
* may be either a plain JavaScript array or an immutable [[List]] from the
|
||||
* [`immutable` package](https://immutable-js.com/).
|
||||
*
|
||||
* @param newDenominators - The denominator units to convert [[value]] to.
|
||||
* This may be either a plain JavaScript array or an immutable [[List]] from
|
||||
* the [`immutable` package](https://immutable-js.com/).
|
||||
*
|
||||
* @param name - The name of the function argument `this` came from (without
|
||||
* the `$`) if it came from an argument. Used for error reporting.
|
||||
*/
|
||||
coerceValue(
|
||||
newNumerators: string[] | List<string>,
|
||||
newDenominators: string[] | List<string>,
|
||||
name?: string
|
||||
): number;
|
||||
|
||||
/**
|
||||
* Returns [[value]], converted to the units represented by `newNumerators`
|
||||
* and `newDenominators`.
|
||||
*
|
||||
* Unlike [[convertValueToMatch]] this does *not* throw an error if this
|
||||
* number is unitless and either `newNumerators` or `newDenominators` are not
|
||||
* empty, or vice-versa. Instead, it treats all unitless numbers as
|
||||
* convertible to and from all units without changing the value.
|
||||
*
|
||||
* @throws `Error` if this number's units are incompatible with `other`'s
|
||||
* units.
|
||||
*
|
||||
* @param name - The name of the function argument `this` came from (without
|
||||
* the `$`) if it came from an argument. Used for error reporting.
|
||||
*
|
||||
* @param otherName - The name of the function argument `other` came from
|
||||
* (without the `$`) if it came from an argument. Used for error reporting.
|
||||
*/
|
||||
coerceValueToMatch(
|
||||
other: SassNumber,
|
||||
name?: string,
|
||||
otherName?: string
|
||||
): number;
|
||||
}
|
||||
+84
@@ -0,0 +1,84 @@
|
||||
import {Value} from './index';
|
||||
|
||||
/**
|
||||
* Sass's [string type](https://sass-lang.com/documentation/values/strings).
|
||||
*
|
||||
* @category Custom Function
|
||||
*/
|
||||
export class SassString extends Value {
|
||||
/**
|
||||
* Creates a new string.
|
||||
*
|
||||
* @param text - The contents of the string. For quoted strings, this is the
|
||||
* semantic content—any escape sequences that were been written in the source
|
||||
* text are resolved to their Unicode values. For unquoted strings, though,
|
||||
* escape sequences are preserved as literal backslashes.
|
||||
*
|
||||
* @param options.quotes - Whether the string is quoted. Defaults to `true`.
|
||||
*/
|
||||
constructor(
|
||||
text: string,
|
||||
options?: {
|
||||
quotes?: boolean;
|
||||
}
|
||||
);
|
||||
|
||||
/**
|
||||
* Creates an empty string.
|
||||
*
|
||||
* @param options.quotes - Whether the string is quoted. Defaults to `true`.
|
||||
*/
|
||||
constructor(options?: {quotes?: boolean});
|
||||
|
||||
/**
|
||||
* The contents of the string.
|
||||
*
|
||||
* For quoted strings, this is the semantic content—any escape sequences that
|
||||
* were been written in the source text are resolved to their Unicode values.
|
||||
* For unquoted strings, though, escape sequences are preserved as literal
|
||||
* backslashes.
|
||||
*
|
||||
* This difference allows us to distinguish between identifiers with escapes,
|
||||
* such as `url\u28 http://example.com\u29`, and unquoted strings that contain
|
||||
* characters that aren't valid in identifiers, such as
|
||||
* `url(http://example.com)`. Unfortunately, it also means that we don't
|
||||
* consider `foo` and `f\6F\6F` the same string.
|
||||
*/
|
||||
get text(): string;
|
||||
|
||||
/** Whether this string has quotes. */
|
||||
get hasQuotes(): boolean;
|
||||
|
||||
/**
|
||||
* Sass's notion of this string's length.
|
||||
*
|
||||
* Sass treats strings as a series of Unicode code points while JavaScript
|
||||
* treats them as a series of UTF-16 code units. For example, the character
|
||||
* U+1F60A SMILING FACE WITH SMILING EYES is a single Unicode code point but
|
||||
* is represented in UTF-16 as two code units (`0xD83D` and `0xDE0A`). So in
|
||||
* JavaScript, `"n😊b".length` returns `4`, whereas in Sass
|
||||
* `string.length("n😊b")` returns `3`.
|
||||
*/
|
||||
get sassLength(): number;
|
||||
|
||||
/**
|
||||
* Converts `sassIndex` to a JavaScript index into [[text]].
|
||||
*
|
||||
* Sass indices are one-based, while JavaScript indices are zero-based. Sass
|
||||
* indices may also be negative in order to index from the end of the string.
|
||||
*
|
||||
* In addition, Sass indices refer to Unicode code points while JavaScript
|
||||
* string indices refer to UTF-16 code units. For example, the character
|
||||
* U+1F60A SMILING FACE WITH SMILING EYES is a single Unicode code point but
|
||||
* is represented in UTF-16 as two code units (`0xD83D` and `0xDE0A`). So in
|
||||
* JavaScript, `"n😊b".charCodeAt(1)` returns `0xD83D`, whereas in Sass
|
||||
* `string.slice("n😊b", 1, 1)` returns `"😊"`.
|
||||
*
|
||||
* This function converts Sass's code point indices to JavaScript's code unit
|
||||
* indices. This means it's O(n) in the length of `text`.
|
||||
*
|
||||
* @throws `Error` - If `sassIndex` isn't a number, if that number isn't an
|
||||
* integer, or if that integer isn't a valid index for this string.
|
||||
*/
|
||||
sassIndexToStringIndex(sassIndex: Value, name?: string): number;
|
||||
}
|
||||
Reference in New Issue
Block a user