diff --git a/.github/util/dart-sass/action.yml b/.github/util/dart-sass/action.yml new file mode 100644 index 0000000000..9e11c5ff36 --- /dev/null +++ b/.github/util/dart-sass/action.yml @@ -0,0 +1,34 @@ +name: Dart Sass +description: Check out Dart Sass and build the embedded protocol buffer. +inputs: + github-token: {required: true} + dart-sdk: {required: false, default: stable} + architecture: {required: false} +runs: + using: composite + steps: + - uses: dart-lang/setup-dart@v1 + with: + sdk: "${{ inputs.dart-sdk }}" + architecture: "${{ inputs.architecture }}" + + - uses: bufbuild/buf-setup-action@v1.13.1 + with: {github_token: "${{ inputs.github-token }}"} + + - uses: sass/clone-linked-repo@v1 + with: {repo: sass/dart-sass, path: dart-sass} + + - run: dart pub get + shell: bash + working-directory: dart-sass + + - name: Check out the language repo + uses: sass/clone-linked-repo@v1 + with: {repo: sass/sass, path: dart-sass/build/language} + + - name: Generate Dart from protobuf + run: dart run grinder protobuf + env: {UPDATE_SASS_PROTOCOL: false} + working-directory: dart-sass + shell: bash + diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8085ea4fea..6121ea2ce4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,7 +4,7 @@ defaults: run: {shell: bash} env: - PROTOC_VERSION: 3.x + # TODO(jathak): Update this to Node 18 once unit tests are fixed. NODE_VERSION: 14 on: @@ -17,8 +17,8 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: {node-version: "${{ env.NODE_VERSION }}"} - uses: dart-lang/setup-dart@v1 with: {sdk: stable} @@ -30,8 +30,8 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: {node-version: "${{ env.NODE_VERSION }}"} - run: npm install - run: npm run lint @@ -41,8 +41,8 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: {node-version: "${{ env.NODE_VERSION }}"} - run: npm install - run: npm run lint-spec @@ -57,19 +57,15 @@ jobs: dart_channel: [stable, dev] steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: {node-version: "${{ env.NODE_VERSION }}"} - run: npm install - - uses: dart-lang/setup-dart@v1 - with: {sdk: "${{ matrix.dart_channel }}"} - - name: Dart Sass | Checkout - uses: sass/clone-linked-repo@v1 - with: {repo: sass/dart-sass, path: dart-sass} - - name: Dart Sass | dart pub get - run: dart pub get - working-directory: dart-sass + - uses: ./.github/util/dart-sass + with: + github-token: ${{ github.token }} + dart-sdk: ${{ matrix.dart_channel }} - name: Run specs run: npm run sass-spec -- --dart dart-sass @@ -80,8 +76,8 @@ jobs: if: "github.event_name != 'pull_request' || !contains(github.event.pull_request.body, 'skip libsass')" steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: {node-version: "${{ env.NODE_VERSION }}"} - run: npm install @@ -104,7 +100,7 @@ jobs: # They next need to be rotated October 2021. See # https://github.com/nodejs/Release. js_api_dart_sass: - name: "JS API | Dart Sass | Node ${{ matrix.node_version }} | ${{ matrix.os }}" + name: "JS API | Pure JS | Node ${{ matrix.node_version }} | ${{ matrix.os }}" runs-on: "${{ matrix.os }}" if: "github.event_name != 'pull_request' || !contains(github.event.pull_request.body, 'skip dart-sass')" @@ -112,47 +108,65 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] - node_version: [16] + node_version: [18] # Only test LTS versions on Ubuntu include: - - os: ubuntu-latest - node_version: 12 - os: ubuntu-latest node_version: 14 + - os: ubuntu-latest + node_version: 16 steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: {node-version: "${{ matrix.node_version }}"} - run: npm install - - uses: dart-lang/setup-dart@v1 - with: {sdk: stable} - - name: Dart Sass | Checkout - uses: sass/clone-linked-repo@v1 - with: {repo: sass/dart-sass, path: dart-sass} - - name: Dart Sass | Install - run: | - dart pub get - dart pub run grinder pkg-npm-dev - cd build/npm - npm install + - uses: ./.github/util/dart-sass + with: + github-token: ${{ github.token }} + + - name: Dart Sass | Build + run: dart run grinder pkg-npm-dev working-directory: dart-sass - - name: Check out Sass specification - uses: sass/clone-linked-repo@v1 + - name: Run specs + run: | + npm run js-api-spec -- \ + --sassPackage dart-sass/build/npm \ + --sassSassRepo dart-sass/build/language + + js_api_dart_sass_browser: + name: "JS API | Pure JS | Browser" + runs-on: ubuntu-latest + if: "github.event_name != 'pull_request' || !contains(github.event.pull_request.body, 'skip dart-sass')" + + steps: + - uses: actions/checkout@v3 + - uses: browser-actions/setup-chrome@v1 + - run: npm install + + - uses: ./.github/util/dart-sass with: - repo: sass/sass - path: language + github-token: ${{ github.token }} + + - name: Dart Sass | Build + run: dart run grinder pkg-npm-dev + working-directory: dart-sass - name: Run specs - run: npm run js-api-spec -- --sassPackage dart-sass/build/npm --sassSassRepo language + run: | + npm run js-api-spec -- \ + --browser \ + --sassPackage dart-sass/build/npm \ + --sassSassRepo dart-sass/build/language + env: {CHROME_EXECUTABLE: chrome} # The versions should be kept up-to-date with the latest LTS Node releases. # They next need to be rotated October 2021. See # https://github.com/nodejs/Release. js_api_sass_embedded: - name: "JS API | sass-embedded | Node ${{ matrix.node_version }} | ${{ matrix.os }}" + name: "JS API | Embedded | Node ${{ matrix.node_version }} | ${{ matrix.os }}" runs-on: "${{ matrix.os }}" if: github.event_name != 'pull_request' || !contains(github.event.pull_request.body, 'skip sass-embedded') @@ -160,52 +174,43 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, windows-latest, macos-latest] - node_version: [16] + node_version: [18] # Only test LTS versions on Ubuntu include: - - os: ubuntu-latest - node_version: 12 - os: ubuntu-latest node_version: 14 + - os: ubuntu-latest + node_version: 16 steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: {node-version: "${{ matrix.node_version }}"} - run: npm install - - uses: dart-lang/setup-dart@v1 - with: {sdk: stable} - - uses: arduino/setup-protoc@v1 - with: - version: ${{ env.PROTOC_VERSION }} - repo-token: '${{ github.token }}' - # Clone linked versions of Dart Sass Embedded and the Embedded Protocol so - # that they match the current feature branch. - - name: Dart Sass Embedded | Checkout - uses: sass/clone-linked-repo@v1 - with: {repo: sass/dart-sass-embedded, path: dart-sass-embedded} - - name: Embedded Protocol | Checkout - uses: sass/clone-linked-repo@v1 - with: {repo: sass/embedded-protocol, path: embedded-protocol} + - uses: ./.github/util/dart-sass + with: + github-token: ${{ github.token }} - name: Node.js Embedded Host | Checkout uses: sass/clone-linked-repo@v1 with: {repo: sass/embedded-host-node, path: embedded-host-node} + + # Work around actions/checkout#197. We need this outside the main checkout + # because otherwise its `node_modules` conflict with sass-spec's. + - run: mv embedded-host-node .. + - name: Node.js Embedded Host | Install run: | npm install npm run init -- \ - --compiler-path=../dart-sass-embedded \ - --protocol-path=../embedded-protocol + --compiler-path=../sass-spec/dart-sass \ + --language-path=../sass-spec/dart-sass/build/language npm run compile - working-directory: embedded-host-node - - - name: Check out Sass specification - uses: sass/clone-linked-repo@v1 - with: - repo: sass/sass - path: language + working-directory: ../embedded-host-node - name: Run specs - run: npm run js-api-spec -- --sassPackage embedded-host-node --sassSassRepo language + run: | + npm run js-api-spec -- \ + --sassPackage ../embedded-host-node \ + --sassSassRepo dart-sass/build/language diff --git a/README.md b/README.md index 4a8f4b79fa..9e004476a5 100644 --- a/README.md +++ b/README.md @@ -327,11 +327,9 @@ arguments: [Sass language specification repository]: https://github.com/sass/sass -The JS API specs are run using [Jest], so you can also pass any [Jest command -line arguments] to `npm run js-api-spec`. +The JS API specs are run using [Jasmine]. -[Jest]: https://jestjs.io/ -[Jest command line arguments]: https://jestjs.io/docs/cli +[Jasmine]: https://jasmine.github.io/ #### Dart Sass @@ -354,12 +352,21 @@ git clone https://github.com/sass/dart-sass ) export DART_SASS_PATH=`pwd`/dart-sass -npm run sass-spec -- --sassSass $SASS_SASS_PATH --sassPackage $DART_SASS_PATH/build/npm +npm run js-api-spec -- --sassSassRepo $SASS_SASS_PATH --sassPackage $DART_SASS_PATH/build/npm ``` Whenever you modify Dart Sass, make sure to re-run `dart run grinder pkg-npm-dev` to rebuild the JavaScript output. +##### Browser Build + +To run specs against [Dart Sass] compiled for a browser context, add the +`--browser` flag to the above command: + +```sh +npm run js-api-spec -- --sassSassRepo $SASS_SASS_PATH --sassPackage $DART_SASS_PATH/build/npm --browser +``` + #### Embedded Host To run specs against [the Node Embedded Host], which embeds Dart Sass as a @@ -385,7 +392,7 @@ git clone https://github.com/sass/embedded-host-node ) export SASS_EMBEDDED_PATH=`pwd`/embedded-host-node -npm run sass-spec -- --sassSass $SASS_SASS_PATH --sassPackage $SASS_EMBEDDED_PATH +npm run js-api-spec -- --sassSassRepo $SASS_SASS_PATH --sassPackage $SASS_EMBEDDED_PATH ``` Whenever you modify the Sass embedded host, make sure to re-run `npm run diff --git a/js-api-spec.ts b/js-api-spec.ts index 060ba715e2..3eb36453e6 100644 --- a/js-api-spec.ts +++ b/js-api-spec.ts @@ -1,17 +1,14 @@ /* eslint-disable no-process-exit */ +import * as p from 'path'; + import * as del from 'del'; import * as fs from 'fs-extra'; -import * as jest from 'jest'; -import * as p from 'path'; +import Jasmine from 'jasmine'; +import {config, Server} from 'karma'; import * as tmp from 'tmp'; import yargs from 'yargs/yargs'; - -import config from './jest.config'; - -declare module 'jest' { - function run(args: string[]): never; -} +import {SpecReporter} from 'jasmine-spec-reporter'; const args = yargs(process.argv.slice(2)) .parserConfiguration({'unknown-options-as-args': true}) @@ -28,6 +25,10 @@ const args = yargs(process.argv.slice(2)) description: 'The path to the npm package that exports the Sass API.', demand: true, }) + .option('browser', { + type: 'boolean', + description: 'Run the tests in a ChromeHeadless browser context.', + }) .option('help', { type: 'boolean', alias: 'h', @@ -39,11 +40,10 @@ const argv = args.parseSync(); if (argv.help) { args.showHelp(); console.error(''); - jest.run(['--help']); } -// Set up a temp directory that overrides the default Jest configuration and -// adds node_modules that depend on the given sassSassRepo and sassPackage. +// Set up a temp directory that adds node_modules that depend on the given +// sassSassRepo and sassPackage. const tmpObject = tmp.dirSync({ template: 'js-api-spec.XXXXXX', unsafeCleanup: true, @@ -54,29 +54,24 @@ del.sync(dir, {force: true}); const sassPackagePath = p.join(dir, 'node_modules', 'sass'); fs.mkdirSync(sassPackagePath, {recursive: true}); -const configPath = p.join(dir, 'jest.config.json'); -fs.writeFileSync( - configPath, - JSON.stringify({ - ...config, - rootDir: p.resolve('.'), - roots: ['/js-api-spec'], - }) -); - // We want to use the type information from --sassSassRepo even if --sassPackage // is written in TypeScript, because the specs may test behavior that's not yet // implemented in --sassPackage and we don't want that to cause a compile error. // We accomplish this by creating a JavaScript package named "sass" that // requires and re-exports --sassPackage, and using the type annotations from // --sassSassRepo as that package's annotations. -const packageRequire = JSON.stringify(p.resolve(argv.sassPackage)); +const packageRequire = argv.browser + ? p.resolve(argv.sassPackage, 'sass.default.js') + : p.resolve(argv.sassPackage); fs.writeFileSync( `${sassPackagePath}/index.js`, - `module.exports = require(${packageRequire});` + `module.exports = require(${JSON.stringify(packageRequire)});` ); -const specPath = p.join(argv.sassSassRepo, 'spec/js-api'); +// Load the APIs from the doc folder, since it uses plain .d.ts files instead of +// literate .d.ts.md files. The language repo's CI ensures the two remain in +// sync. +const specPath = p.join(argv.sassSassRepo, 'js-api-doc'); const specIndex = p.join(specPath, 'index.d.ts'); if (!fs.existsSync(specIndex)) { console.error(`${specIndex} doesn't exist!`); @@ -106,4 +101,42 @@ process.on('exit', () => { tmpObject.removeCallback(); }); -jest.run([`--config=${configPath}`, ...(argv._ as string[])]); +const specsToRun = + argv._.length > 0 + ? argv._.map(arg => arg.toString()).map(path => + path.endsWith('.test.ts') ? path : '$path/**/*.test.ts' + ) + : ['js-api-spec/**/*.test.ts']; + +if (argv.browser) { + const karmaConfig = config.parseConfig( + p.resolve(__dirname, 'karma.config.js'), + { + port: 9876, + files: [ + 'js-api-spec/setup.ts', + ...specsToRun.map(path => + path.replace('*.test.ts', '!(*.node).test.ts') + ), + ], + }, + {throwErrors: true} + ); + const server = new Server(karmaConfig, exitCode => { + console.log('Karma has exited with ' + exitCode); + process.exit(exitCode); + }); + server.start(); +} else { + const jasmine = new Jasmine({ + projectBaseDir: p.resolve('.'), + }); + jasmine.env.clearReporters(); + jasmine.env.addReporter(new SpecReporter()); + jasmine.loadConfig({ + spec_dir: 'js-api-spec', + spec_files: specsToRun.map(path => p.relative('js-api-spec', path)), + helpers: ['../node_modules/jasmine-expect/index.js', 'setup.ts'], + }); + jasmine.execute(); +} diff --git a/js-api-spec/compile.node.test.ts b/js-api-spec/compile.node.test.ts new file mode 100644 index 0000000000..4f174a2124 --- /dev/null +++ b/js-api-spec/compile.node.test.ts @@ -0,0 +1,382 @@ +// Copyright 2023 Google Inc. Use of this source code is governed by an +// MIT-style license that can be found in the LICENSE file or at +// https://opensource.org/licenses/MIT. + +import p from 'path'; +import {URL} from 'url'; + +import {compile, compileAsync, compileString} from 'sass'; + +import {sandbox} from './sandbox'; + +describe('compileString', () => { + describe('success', () => { + describe('input', () => { + it("doesn't take its syntax from the URL's extension", () => { + // Shouldn't parse the file as the indented syntax. + expect( + compileString('a {b: c}', {url: new URL('file:///foo.sass')}).css + ).toBe('a {\n b: c;\n}'); + }); + }); + + describe('loadedUrls', () => { + it('is empty with no URL', () => { + expect(compileString('a {b: c}').loadedUrls).toEqual([]); + }); + + it('contains the URL if one is passed', () => { + const url = new URL('file:///foo.scss'); + expect(compileString('a {b: c}', {url}).loadedUrls).toEqual([url]); + }); + + it('contains an immediate dependency', () => + sandbox(dir => { + const url = dir.url('input.scss'); + dir.write({'_other.scss': 'a {b: c}'}); + expect(compileString('@use "other"', {url}).loadedUrls).toEqual([ + url, + dir.url('_other.scss'), + ]); + })); + + it('contains a transitive dependency', () => + sandbox(dir => { + const url = dir.url('input.scss'); + dir.write({ + '_midstream.scss': '@use "upstream"', + '_upstream.scss': 'a {b: c}', + }); + expect(compileString('@use "midstream"', {url}).loadedUrls).toEqual([ + url, + dir.url('_midstream.scss'), + dir.url('_upstream.scss'), + ]); + })); + + describe('contains a dependency only once', () => { + it('for @use', () => + sandbox(dir => { + const url = dir.url('input.scss'); + dir.write({ + '_left.scss': '@use "upstream"', + '_right.scss': '@use "upstream"', + '_upstream.scss': 'a {b: c}', + }); + expect( + compileString('@use "left"; @use "right"', {url}).loadedUrls + ).toEqual([ + url, + dir.url('_left.scss'), + dir.url('_upstream.scss'), + dir.url('_right.scss'), + ]); + })); + + it('for @import', () => + sandbox(dir => { + const url = dir.url('input.scss'); + dir.write({ + '_left.scss': '@import "upstream"', + '_right.scss': '@import "upstream"', + '_upstream.scss': 'a {b: c}', + }); + expect( + compileString('@import "left"; @import "right"', {url}).loadedUrls + ).toEqual([ + url, + dir.url('_left.scss'), + dir.url('_upstream.scss'), + dir.url('_right.scss'), + ]); + })); + }); + }); + + it('file: url is used to resolve relative loads', () => + sandbox(dir => { + dir.write({'foo/bar/_other.scss': 'a {b: c}'}); + + expect( + compileString('@use "other";', { + url: dir.url('foo/bar/style.scss'), + }).css + ).toBe('a {\n b: c;\n}'); + })); + + describe('loadPaths', () => { + it('is used to resolve loads', () => + sandbox(dir => { + dir.write({'foo/bar/_other.scss': 'a {b: c}'}); + + expect( + compileString('@use "other";', { + loadPaths: [dir('foo/bar')], + }).css + ).toBe('a {\n b: c;\n}'); + })); + + it('resolves relative paths', () => + sandbox(dir => { + dir.write({'foo/bar/_other.scss': 'a {b: c}'}); + + expect( + compileString('@use "bar/other";', { + loadPaths: [dir('foo')], + }).css + ).toBe('a {\n b: c;\n}'); + })); + + it("resolves loads using later paths if earlier ones don't match", () => + sandbox(dir => { + dir.write({'baz/_other.scss': 'a {b: c}'}); + + expect( + compileString('@use "other";', { + loadPaths: [dir('foo'), dir('bar'), dir('baz')], + }).css + ).toBe('a {\n b: c;\n}'); + })); + + it("doesn't take precedence over loads relative to the url", () => + sandbox(dir => { + dir.write({ + 'url/_other.scss': 'a {b: url}', + 'load-path/_other.scss': 'a {b: load path}', + }); + + expect( + compileString('@use "other";', { + loadPaths: [dir('load-path')], + url: dir.url('url/input.scss'), + }).css + ).toBe('a {\n b: url;\n}'); + })); + + it('uses earlier paths in preference to later ones', () => + sandbox(dir => { + dir.write({ + 'earlier/_other.scss': 'a {b: earlier}', + 'later/_other.scss': 'a {b: later}', + }); + + expect( + compileString('@use "other";', { + loadPaths: [dir('earlier'), dir('later')], + }).css + ).toBe('a {\n b: earlier;\n}'); + })); + }); + }); + + describe('error', () => { + it('relative loads fail without a URL', () => + sandbox(dir => { + dir.write({'_other.scss': 'a {b: c}'}); + + expect(() => + compileString(`@use "${dir.relativeUrl('other')}";`) + ).toThrowSassException({ + line: 0, + noUrl: true, + }); + })); + + it('relative loads fail with a non-file: URL', () => + sandbox(dir => { + dir.write({'_other.scss': 'a {b: c}'}); + + expect(() => + compileString(`@use "${dir.relativeUrl('other')}";`, { + url: new URL('unknown:style.scss'), + }) + ).toThrowSassException({ + line: 0, + url: 'unknown:style.scss', + }); + })); + + describe('includes source span information', () => { + it('in syntax errors', () => + sandbox(dir => { + const url = dir.url('foo.scss'); + expect(() => compileString('a {b:', {url})).toThrowSassException({ + line: 0, + url, + }); + })); + + it('in runtime errors', () => + sandbox(dir => { + const url = dir.url('foo.scss'); + expect(() => + compileString('@error "oh no"', {url}) + ).toThrowSassException({line: 0, url}); + })); + + it('with multi-span errors', () => + sandbox(dir => { + const url = dir.url('foo.scss'); + expect(() => + compileString('@use "sass:math"; @use "sass:math"', {url}) + ).toThrowSassException({line: 0, url}); + })); + }); + }); +}); + +describe('compile', () => { + describe('success', () => { + it('compiles SCSS for a .scss file', () => + sandbox(dir => { + dir.write({'input.scss': '$a: b; c {d: $a}'}); + expect(compile(dir('input.scss')).css).toBe('c {\n d: b;\n}'); + })); + + it('compiles SCSS for a file with an unknown extension', () => + sandbox(dir => { + dir.write({'input.asdf': '$a: b; c {d: $a}'}); + expect(compile(dir('input.asdf')).css).toBe('c {\n d: b;\n}'); + })); + + it('compiles indented syntax for a .sass file', () => + sandbox(dir => { + dir.write({'input.sass': 'a\n b: c'}); + expect(compile(dir('input.sass')).css).toBe('a {\n b: c;\n}'); + })); + + it('compiles plain CSS for a .css file', () => + sandbox(dir => { + dir.write({'input.css': 'a {b: c}'}); + expect(compile(dir('input.css')).css).toBe('a {\n b: c;\n}'); + })); + + describe('loadedUrls', () => { + it("includes a relative path's URL", () => + sandbox(dir => { + dir.write({'input.scss': 'a {b: c}'}); + expect(compile(dir('input.scss')).loadedUrls).toEqual([ + dir.url('input.scss'), + ]); + })); + + it("includes an absolute path's URL", () => + sandbox(dir => { + const path = p.resolve(dir('input.scss')); + dir.write({'input.scss': 'a {b: c}'}); + expect(compile(path).loadedUrls).toEqual([dir.url('input.scss')]); + })); + + it('contains a dependency', () => + sandbox(dir => { + dir.write({ + 'input.scss': '@use "other"', + '_other.scss': 'a {b: c}', + }); + expect(compile(dir('input.scss')).loadedUrls).toEqual([ + dir.url('input.scss'), + dir.url('_other.scss'), + ]); + })); + }); + + it('the path is used to resolve relative loads', () => + sandbox(dir => { + dir.write({ + 'foo/bar/input.scss': '@use "other"', + 'foo/bar/_other.scss': 'a {b: c}', + }); + + expect(compile(dir('foo/bar/input.scss')).css).toBe('a {\n b: c;\n}'); + })); + + describe('loadPaths', () => { + it('is used to resolve loads', () => + sandbox(dir => { + dir.write({ + 'input.scss': '@use "other"', + 'foo/bar/_other.scss': 'a {b: c}', + }); + + expect( + compile(dir('input.scss'), {loadPaths: [dir('foo/bar')]}).css + ).toBe('a {\n b: c;\n}'); + })); + + it("doesn't take precedence over loads relative to the entrypoint", () => + sandbox(dir => { + dir.write({ + 'url/input.scss': '@use "other";', + 'url/_other.scss': 'a {b: url}', + 'load-path/_other.scss': 'a {b: load path}', + }); + + expect( + compile(dir('url/input.scss'), {loadPaths: [dir('load-path')]}).css + ).toBe('a {\n b: url;\n}'); + })); + }); + }); + + describe('error', () => { + it('requires plain CSS for a .css file', () => + sandbox(dir => { + dir.write({'input.css': '$a: b; c {d: $a}'}); + expect(() => compile(dir('input.css'))).toThrowSassException({ + line: 0, + url: dir.url('input.css'), + }); + })); + + describe("includes the path's URL", () => { + it('in syntax errors', () => + sandbox(dir => { + dir.write({'input.scss': 'a {b:'}); + expect(() => compile(dir('input.scss'))).toThrowSassException({ + line: 0, + url: dir.url('input.scss'), + }); + })); + + it('in runtime errors', () => + sandbox(dir => { + dir.write({'input.scss': '@error "oh no"'}); + expect(() => compile(dir('input.scss'))).toThrowSassException({ + line: 0, + url: dir.url('input.scss'), + }); + })); + }); + }); +}); + +describe('compileAsync returns a promise that', () => { + it('succeeds when compilation succeeds', () => + sandbox(async dir => { + dir.write({'input.scss': 'a {b: c}'}); + const result = await compileAsync(dir('input.scss')); + expect(result.css).toBe('a {\n b: c;\n}'); + })); + + describe('fails when compilation fails', () => { + it('with a syntax error', () => + sandbox(async dir => { + dir.write({'input.scss': 'a {b:'}); + await expectAsync(() => + compileAsync(dir('input.scss')) + ).toThrowSassException({ + line: 0, + }); + })); + + it('with a runtime error', () => + sandbox(async dir => { + dir.write({'input.scss': '@error "oh no";'}); + await expectAsync(() => + compileAsync(dir('input.scss')) + ).toThrowSassException({ + line: 0, + }); + })); + }); +}); diff --git a/js-api-spec/compile.test.ts b/js-api-spec/compile.test.ts index e93e1dfb78..ac46c14fb8 100644 --- a/js-api-spec/compile.test.ts +++ b/js-api-spec/compile.test.ts @@ -2,18 +2,8 @@ // MIT-style license that can be found in the LICENSE file or at // https://opensource.org/licenses/MIT. -import p from 'path'; -import {URL} from 'url'; - -import { - compile, - compileAsync, - compileString, - compileStringAsync, - OutputStyle, -} from 'sass'; - -import {sandbox} from './utils'; +import {compileString, compileStringAsync} from 'sass'; +import type {OutputStyle} from 'sass'; describe('compileString', () => { describe('success', () => { @@ -39,161 +29,6 @@ describe('compileString', () => { 'a {\n b: c;\n}' ); }); - - it("doesn't take its syntax from the URL's extension", () => { - // Shouldn't parse the file as the indented syntax. - expect( - compileString('a {b: c}', {url: new URL('file:///foo.sass')}).css - ).toBe('a {\n b: c;\n}'); - }); - }); - - describe('loadedUrls', () => { - it('is empty with no URL', () => { - expect(compileString('a {b: c}').loadedUrls).toEqual([]); - }); - - it('contains the URL if one is passed', () => { - const url = new URL('file:///foo.scss'); - expect(compileString('a {b: c}', {url}).loadedUrls).toEqual([url]); - }); - - it('contains an immediate dependency', () => - sandbox(dir => { - const url = dir.url('input.scss'); - dir.write({'_other.scss': 'a {b: c}'}); - expect(compileString('@use "other"', {url}).loadedUrls).toEqual([ - url, - dir.url('_other.scss'), - ]); - })); - - it('contains a transitive dependency', () => - sandbox(dir => { - const url = dir.url('input.scss'); - dir.write({ - '_midstream.scss': '@use "upstream"', - '_upstream.scss': 'a {b: c}', - }); - expect(compileString('@use "midstream"', {url}).loadedUrls).toEqual([ - url, - dir.url('_midstream.scss'), - dir.url('_upstream.scss'), - ]); - })); - - describe('contains a dependency only once', () => { - it('for @use', () => - sandbox(dir => { - const url = dir.url('input.scss'); - dir.write({ - '_left.scss': '@use "upstream"', - '_right.scss': '@use "upstream"', - '_upstream.scss': 'a {b: c}', - }); - expect( - compileString('@use "left"; @use "right"', {url}).loadedUrls - ).toEqual([ - url, - dir.url('_left.scss'), - dir.url('_upstream.scss'), - dir.url('_right.scss'), - ]); - })); - - it('for @import', () => - sandbox(dir => { - const url = dir.url('input.scss'); - dir.write({ - '_left.scss': '@import "upstream"', - '_right.scss': '@import "upstream"', - '_upstream.scss': 'a {b: c}', - }); - expect( - compileString('@import "left"; @import "right"', {url}).loadedUrls - ).toEqual([ - url, - dir.url('_left.scss'), - dir.url('_upstream.scss'), - dir.url('_right.scss'), - ]); - })); - }); - }); - - it('file: url is used to resolve relative loads', () => - sandbox(dir => { - dir.write({'foo/bar/_other.scss': 'a {b: c}'}); - - expect( - compileString('@use "other";', { - url: dir.url('foo/bar/style.scss'), - }).css - ).toBe('a {\n b: c;\n}'); - })); - - describe('loadPaths', () => { - it('is used to resolve loads', () => - sandbox(dir => { - dir.write({'foo/bar/_other.scss': 'a {b: c}'}); - - expect( - compileString('@use "other";', { - loadPaths: [dir('foo/bar')], - }).css - ).toBe('a {\n b: c;\n}'); - })); - - it('resolves relative paths', () => - sandbox(dir => { - dir.write({'foo/bar/_other.scss': 'a {b: c}'}); - - expect( - compileString('@use "bar/other";', { - loadPaths: [dir('foo')], - }).css - ).toBe('a {\n b: c;\n}'); - })); - - it("resolves loads using later paths if earlier ones don't match", () => - sandbox(dir => { - dir.write({'baz/_other.scss': 'a {b: c}'}); - - expect( - compileString('@use "other";', { - loadPaths: [dir('foo'), dir('bar'), dir('baz')], - }).css - ).toBe('a {\n b: c;\n}'); - })); - - it("doesn't take precedence over loads relative to the url", () => - sandbox(dir => { - dir.write({ - 'url/_other.scss': 'a {b: url}', - 'load-path/_other.scss': 'a {b: load path}', - }); - - expect( - compileString('@use "other";', { - loadPaths: [dir('load-path')], - url: dir.url('url/input.scss'), - }).css - ).toBe('a {\n b: url;\n}'); - })); - - it('uses earlier paths in preference to later ones', () => - sandbox(dir => { - dir.write({ - 'earlier/_other.scss': 'a {b: earlier}', - 'later/_other.scss': 'a {b: later}', - }); - - expect( - compileString('@use "other";', { - loadPaths: [dir('earlier'), dir('later')], - }).css - ).toBe('a {\n b: earlier;\n}'); - })); }); it('recognizes the expanded output style', () => { @@ -204,12 +39,12 @@ describe('compileString', () => { describe('sourceMap', () => { it("doesn't include one by default", () => { - expect(compileString('a {b: c}')).not.toHaveProperty('sourceMap'); + expect(compileString('a {b: c}')).not.toHaveMember('sourceMap'); }); it('includes one if sourceMap is true', () => { const result = compileString('a {b: c}', {sourceMap: true}); - expect(result).toHaveProperty('sourceMap'); + expect(result).toHaveMember('sourceMap'); // Explicitly don't test the details of the source map, because // individual implementations are allowed to generate a custom map. @@ -225,10 +60,10 @@ describe('compileString', () => { sourceMap: true, sourceMapIncludeSources: true, }); - expect(result).toHaveProperty('sourceMap'); + expect(result).toHaveMember('sourceMap'); const sourceMap = result.sourceMap!; - expect(sourceMap).toHaveProperty('sourcesContent'); + expect(sourceMap).toHaveMember('sourcesContent'); expect(sourceMap.sourcesContent!).toBeArray(); expect(sourceMap.sourcesContent!.length).toBeGreaterThanOrEqual(1); }); @@ -256,65 +91,12 @@ describe('compileString', () => { ).toThrowSassException({line: 0, noUrl: true}); }); - it('relative loads fail without a URL', () => - sandbox(dir => { - dir.write({'_other.scss': 'a {b: c}'}); - - expect(() => - compileString(`@use "${dir.relativeUrl('other')}";`) - ).toThrowSassException({ - line: 0, - noUrl: true, - }); - })); - - it('relative loads fail with a non-file: URL', () => - sandbox(dir => { - dir.write({'_other.scss': 'a {b: c}'}); - - expect(() => - compileString(`@use "${dir.relativeUrl('other')}";`, { - url: new URL('unknown:style.scss'), - }) - ).toThrowSassException({ - line: 0, - url: 'unknown:style.scss', - }); - })); - - describe('includes source span information', () => { - it('in syntax errors', () => - sandbox(dir => { - const url = dir.url('foo.scss'); - expect(() => compileString('a {b:', {url})).toThrowSassException({ - line: 0, - url, - }); - })); - - it('in runtime errors', () => - sandbox(dir => { - const url = dir.url('foo.scss'); - expect(() => - compileString('@error "oh no"', {url}) - ).toThrowSassException({line: 0, url}); - })); - - it('with multi-span errors', () => - sandbox(dir => { - const url = dir.url('foo.scss'); - expect(() => - compileString('@use "sass:math"; @use "sass:math"', {url}) - ).toThrowSassException({line: 0, url}); - })); - }); - it('throws an error for an unrecognized style', () => { expect(() => compileString('a {b: c}', { style: 'unrecognized style' as OutputStyle, }) - ).toThrow(); + ).toThrowError(); }); it("doesn't throw a Sass exception for an argument error", () => { @@ -326,188 +108,28 @@ describe('compileString', () => { }); it('is an instance of Error', () => { - expect(() => compileString('a {b:')).toThrow(Error); - }); - }); -}); - -describe('compile', () => { - describe('success', () => { - it('compiles SCSS for a .scss file', () => - sandbox(dir => { - dir.write({'input.scss': '$a: b; c {d: $a}'}); - expect(compile(dir('input.scss')).css).toBe('c {\n d: b;\n}'); - })); - - it('compiles SCSS for a file with an unknown extension', () => - sandbox(dir => { - dir.write({'input.asdf': '$a: b; c {d: $a}'}); - expect(compile(dir('input.asdf')).css).toBe('c {\n d: b;\n}'); - })); - - it('compiles indented syntax for a .sass file', () => - sandbox(dir => { - dir.write({'input.sass': 'a\n b: c'}); - expect(compile(dir('input.sass')).css).toBe('a {\n b: c;\n}'); - })); - - it('compiles plain CSS for a .css file', () => - sandbox(dir => { - dir.write({'input.css': 'a {b: c}'}); - expect(compile(dir('input.css')).css).toBe('a {\n b: c;\n}'); - })); - - describe('loadedUrls', () => { - it("includes a relative path's URL", () => - sandbox(dir => { - dir.write({'input.scss': 'a {b: c}'}); - expect(compile(dir('input.scss')).loadedUrls).toEqual([ - dir.url('input.scss'), - ]); - })); - - it("includes an absolute path's URL", () => - sandbox(dir => { - const path = p.resolve(dir('input.scss')); - dir.write({'input.scss': 'a {b: c}'}); - expect(compile(path).loadedUrls).toEqual([dir.url('input.scss')]); - })); - - it('contains a dependency', () => - sandbox(dir => { - dir.write({ - 'input.scss': '@use "other"', - '_other.scss': 'a {b: c}', - }); - expect(compile(dir('input.scss')).loadedUrls).toEqual([ - dir.url('input.scss'), - dir.url('_other.scss'), - ]); - })); - }); - - it('the path is used to resolve relative loads', () => - sandbox(dir => { - dir.write({ - 'foo/bar/input.scss': '@use "other"', - 'foo/bar/_other.scss': 'a {b: c}', - }); - - expect(compile(dir('foo/bar/input.scss')).css).toBe('a {\n b: c;\n}'); - })); - - describe('loadPaths', () => { - it('is used to resolve loads', () => - sandbox(dir => { - dir.write({ - 'input.scss': '@use "other"', - 'foo/bar/_other.scss': 'a {b: c}', - }); - - expect( - compile(dir('input.scss'), {loadPaths: [dir('foo/bar')]}).css - ).toBe('a {\n b: c;\n}'); - })); - - it("doesn't take precedence over loads relative to the entrypoint", () => - sandbox(dir => { - dir.write({ - 'url/input.scss': '@use "other";', - 'url/_other.scss': 'a {b: url}', - 'load-path/_other.scss': 'a {b: load path}', - }); - - expect( - compile(dir('url/input.scss'), {loadPaths: [dir('load-path')]}).css - ).toBe('a {\n b: url;\n}'); - })); - }); - }); - - describe('error', () => { - it('requires plain CSS for a .css file', () => - sandbox(dir => { - dir.write({'input.css': '$a: b; c {d: $a}'}); - expect(() => compile(dir('input.css'))).toThrowSassException({ - line: 0, - url: dir.url('input.css'), - }); - })); - - describe("includes the path's URL", () => { - it('in syntax errors', () => - sandbox(dir => { - dir.write({'input.scss': 'a {b:'}); - expect(() => compile(dir('input.scss'))).toThrowSassException({ - line: 0, - url: dir.url('input.scss'), - }); - })); - - it('in runtime errors', () => - sandbox(dir => { - dir.write({'input.scss': '@error "oh no"'}); - expect(() => compile(dir('input.scss'))).toThrowSassException({ - line: 0, - url: dir.url('input.scss'), - }); - })); + expect(() => compileString('a {b:')).toThrowError(Error); }); }); }); describe('compileStringAsync returns a promise that', () => { it('succeeds when compilation succeeds', async () => { - await expect(compileStringAsync('a {b: c}')).resolves.toMatchObject({ - css: 'a {\n b: c;\n}', - }); + const result = await compileStringAsync('a {b: c}'); + expect(result.css).toBe('a {\n b: c;\n}'); }); describe('fails when compilation fails', () => { it('with a syntax error', async () => { - await expect(() => compileStringAsync('a {b:')).toThrowSassException({ - line: 0, - }); + await expectAsync(() => compileStringAsync('a {b:')).toThrowSassException( + {line: 0} + ); }); it('with a runtime error', async () => { - await expect(() => + await expectAsync(() => compileStringAsync('@error "oh no";') - ).toThrowSassException({ - line: 0, - }); + ).toThrowSassException({line: 0}); }); }); }); - -describe('compileAsync returns a promise that', () => { - it('succeeds when compilation succeeds', () => - sandbox(async dir => { - dir.write({'input.scss': 'a {b: c}'}); - await expect(compileAsync(dir('input.scss'))).resolves.toMatchObject({ - css: 'a {\n b: c;\n}', - }); - })); - - describe('fails when compilation fails', () => { - it('with a syntax error', () => - sandbox(async dir => { - dir.write({'input.scss': 'a {b:'}); - await expect(() => - compileAsync(dir('input.scss')) - ).toThrowSassException({ - line: 0, - }); - })); - - it('with a runtime error', () => - sandbox(async dir => { - dir.write({'input.scss': '@error "oh no";'}); - await expect(() => - compileAsync(dir('input.scss')) - ).toThrowSassException({ - line: 0, - }); - })); - }); -}); diff --git a/js-api-spec/function.test.ts b/js-api-spec/function.test.ts index e215112d9c..c606e58848 100644 --- a/js-api-spec/function.test.ts +++ b/js-api-spec/function.test.ts @@ -8,13 +8,14 @@ import { compileString, compileStringAsync, sassNull, + SassCalculation, } from 'sass'; -import './utils'; +import {spy} from './utils'; it('passes an argument to a custom function and uses its return value', () => { - const fn = jest.fn(args => { - expect(args).toHaveLength(1); + const fn = spy(args => { + expect(args).toBeArrayOfSize(1); expect(args[0].assertString().text).toBe('bar'); return new SassString('result'); }); @@ -25,12 +26,12 @@ it('passes an argument to a custom function and uses its return value', () => { }).css ).toBe('a {\n b: "result";\n}'); - expect(fn).toBeCalled(); + expect(fn).toHaveBeenCalled(); }); it('passes no arguments to a custom function', () => { - const fn = jest.fn(args => { - expect(args).toHaveLength(0); + const fn = spy(args => { + expect(args).toBeArrayOfSize(0); return sassNull; }); @@ -40,12 +41,12 @@ it('passes no arguments to a custom function', () => { }).css ).toBe(''); - expect(fn).toBeCalled(); + expect(fn).toHaveBeenCalled(); }); it('passes multiple arguments to a custom function', () => { - const fn = jest.fn(args => { - expect(args).toHaveLength(3); + const fn = spy(args => { + expect(args).toBeArrayOfSize(3); expect(args[0].assertString().text).toBe('x'); expect(args[1].assertString().text).toBe('y'); expect(args[2].assertString().text).toBe('z'); @@ -58,12 +59,12 @@ it('passes multiple arguments to a custom function', () => { }).css ).toBe(''); - expect(fn).toBeCalled(); + expect(fn).toHaveBeenCalled(); }); it('passes a default argument value', () => { - const fn = jest.fn(args => { - expect(args).toHaveLength(1); + const fn = spy(args => { + expect(args).toBeArrayOfSize(1); expect(args[0].assertString().text).toBe('default'); return sassNull; }); @@ -74,7 +75,7 @@ it('passes a default argument value', () => { }).css ).toBe(''); - expect(fn).toBeCalled(); + expect(fn).toHaveBeenCalled(); }); describe('gracefully handles a custom function', () => { @@ -98,20 +99,33 @@ describe('gracefully handles a custom function', () => { ).toThrowSassException({line: 0}); }); - it('returning a non-Value', () => { - expect(() => - compileString('a {b: foo()}', { - functions: { - 'foo()': (() => 'wrong') as unknown as CustomFunction<'sync'>, - }, - }) - ).toThrowSassException({line: 0}); + describe('returning a non-Value', () => { + it('directly', () => { + expect(() => + compileString('a {b: foo()}', { + functions: { + 'foo()': (() => 'wrong') as unknown as CustomFunction<'sync'>, + }, + }) + ).toThrowSassException({line: 0}); + }); + + it('in a calculation', () => { + expect(() => + compileString('a {b: foo()}', { + functions: { + 'foo()': () => + SassCalculation.calc('wrong' as unknown as SassString), + }, + }) + ).toThrowSassException({line: 0}); + }); }); }); describe('dash-normalizes function calls', () => { it('when defined with dashes', () => { - const fn = jest.fn(() => sassNull); + const fn = spy(() => sassNull); expect( compileString('a {b: foo_bar()}', { @@ -119,11 +133,11 @@ describe('dash-normalizes function calls', () => { }).css ).toBe(''); - expect(fn).toBeCalled(); + expect(fn).toHaveBeenCalled(); }); it('when defined with underscores', () => { - const fn = jest.fn(() => sassNull); + const fn = spy(() => sassNull); expect( compileString('a {b: foo-bar()}', { @@ -131,33 +145,57 @@ describe('dash-normalizes function calls', () => { }).css ).toBe(''); - expect(fn).toBeCalled(); + expect(fn).toHaveBeenCalled(); }); }); describe('asynchronously', () => { it('passes an argument to a custom function and uses its return value', async () => { - const fn = jest.fn(args => { - expect(args).toHaveLength(1); + const fn = spy(args => { + expect(args).toBeArrayOfSize(1); expect(args[0].assertString().text).toBe('bar'); return Promise.resolve(new SassString('result')); }); - await expect( - compileStringAsync('a {b: foo(bar)}', { - functions: {'foo($arg)': fn}, - }) - ).resolves.toMatchObject({css: 'a {\n b: "result";\n}'}); + const result = await compileStringAsync('a {b: foo(bar)}', { + functions: {'foo($arg)': fn}, + }); - expect(fn).toBeCalled(); + expect(result.css).toBe('a {\n b: "result";\n}'); + expect(fn).toHaveBeenCalled(); }); - it('gracefully handles promise rejections', async () => { - await expect(() => - compileStringAsync('a {b: foo(bar)}', { - functions: {'foo($arg)': () => Promise.reject('heck')}, - }) - ).toThrowSassException({line: 0}); + describe('gracefully handles', () => { + it('promise rejections', async () => { + await expectAsync(() => + compileStringAsync('a {b: foo(bar)}', { + functions: {'foo($arg)': () => Promise.reject('heck')}, + }) + ).toThrowSassException({line: 0}); + }); + + describe('returning a non-Value', () => { + it('directly', async () => { + await expectAsync(() => + compileStringAsync('a {b: foo()}', { + functions: { + 'foo()': (() => 'wrong') as unknown as CustomFunction<'async'>, + }, + }) + ).toThrowSassException({line: 0}); + }); + + it('in a calculation', async () => { + await expectAsync(() => + compileStringAsync('a {b: foo()}', { + functions: { + 'foo()': () => + SassCalculation.calc('wrong' as unknown as SassString), + }, + }) + ).toThrowSassException({line: 0}); + }); + }); }); }); diff --git a/js-api-spec/global.d.ts b/js-api-spec/global.d.ts new file mode 100644 index 0000000000..6a3946480b --- /dev/null +++ b/js-api-spec/global.d.ts @@ -0,0 +1 @@ +import 'jasmine-expect'; diff --git a/js-api-spec/importer.node.test.ts b/js-api-spec/importer.node.test.ts new file mode 100644 index 0000000000..7fb41253f2 --- /dev/null +++ b/js-api-spec/importer.node.test.ts @@ -0,0 +1,330 @@ +// Copyright 2023 Google Inc. Use of this source code is governed by an +// MIT-style license that can be found in the LICENSE file or at +// https://opensource.org/licenses/MIT. + +import {URL} from 'url'; +import {compile, compileString, compileStringAsync, Importer} from 'sass'; + +import {sandbox} from './sandbox'; + +it('avoids importer when canonicalize() returns null', () => + sandbox(dir => { + dir.write({'dir/_other.scss': 'a {from: dir}'}); + + const result = compileString('@import "other";', { + importers: [ + { + canonicalize: () => null, + load() { + fail('load() should not be called'); + }, + } as unknown as Importer<'sync'>, + ], + loadPaths: [dir('dir')], + }); + expect(result.css).toBe('a {\n from: dir;\n}'); + })); + +it('fails to import when load() returns null', () => + sandbox(dir => { + dir.write({'dir/_other.scss': 'a {from: dir}'}); + + expect(() => { + compileString('@import "other";', { + importers: [ + { + canonicalize: (url: string) => new URL(`u:${url}`), + load: () => null, + }, + ], + loadPaths: [dir('dir')], + }); + }).toThrowSassException({line: 0}); + })); + +it('prefers a relative file load to an importer', () => + sandbox(dir => { + dir.write({ + 'input.scss': '@import "other"', + '_other.scss': 'a {from: relative}', + }); + + const result = compile(dir('input.scss'), { + importers: [ + { + canonicalize() { + fail('canonicalize() should not be called'); + }, + load() { + fail('load() should not be called'); + }, + } as unknown as Importer<'sync'>, + ], + }); + expect(result.css).toBe('a {\n from: relative;\n}'); + })); + +it('prefers an importer to a load path', () => + sandbox(dir => { + dir.write({ + 'input.scss': '@import "other"', + 'dir/_other.scss': 'a {from: load-path}', + }); + + const result = compile(dir('input.scss'), { + importers: [ + { + canonicalize: (url: string) => new URL(`u:${url}`), + load: () => ({contents: 'a {from: importer}', syntax: 'scss'}), + }, + ], + loadPaths: [dir('dir')], + }); + expect(result.css).toBe('a {\n from: importer;\n}'); + })); + +describe('FileImporter', () => { + it('loads a fully canonicalized URL', () => + sandbox(dir => { + dir.write({'_other.scss': 'a {b: c}'}); + + const result = compileString('@import "other";', { + importers: [{findFileUrl: () => dir.url('_other.scss')}], + }); + expect(result.css).toBe('a {\n b: c;\n}'); + })); + + it('resolves a non-canonicalized URL', () => + sandbox(dir => { + dir.write({'other/_index.scss': 'a {b: c}'}); + + const result = compileString('@import "other";', { + importers: [{findFileUrl: () => dir.url('other')}], + }); + expect(result.css).toBe('a {\n b: c;\n}'); + })); + + it('avoids importer when it returns null', () => + sandbox(dir => { + dir.write({'_other.scss': 'a {from: dir}'}); + + const result = compileString('@import "other";', { + importers: [{findFileUrl: () => null}], + loadPaths: [dir.root], + }); + expect(result.css).toBe('a {\n from: dir;\n}'); + })); + + it('avoids importer when it returns an unresolvable URL', () => + sandbox(dir => { + dir.write({'_other.scss': 'a {from: dir}'}); + + const result = compileString('@import "other";', { + importers: [{findFileUrl: () => dir.url('nonexistent/other')}], + loadPaths: [dir.root], + }); + expect(result.css).toBe('a {\n from: dir;\n}'); + })); + + it('passes an absolute non-file: URL to the importer', () => + sandbox(dir => { + dir.write({'dir/_other.scss': 'a {b: c}'}); + + const result = compileString('@import "u:other";', { + importers: [ + { + findFileUrl(url: string) { + expect(url).toEqual('u:other'); + return dir.url('dir/other'); + }, + }, + ], + }); + expect(result.css).toBe('a {\n b: c;\n}'); + })); + + it("doesn't pass an absolute file: URL to the importer", () => + sandbox(dir => { + dir.write({'_other.scss': 'a {b: c}'}); + + const result = compileString(`@import "${dir.url('other')}";`, { + importers: [ + { + findFileUrl() { + fail('findFileUrl() should not be called'); + }, + }, + ], + }); + expect(result.css).toBe('a {\n b: c;\n}'); + })); + + it("doesn't pass relative loads to the importer", () => + sandbox(dir => { + dir.write({'_midstream.scss': '@import "upstream"'}); + dir.write({'_upstream.scss': 'a {b: c}'}); + + let count = 0; + const result = compileString('@import "midstream";', { + importers: [ + { + findFileUrl() { + if (count === 0) { + count++; + return dir.url('upstream'); + } else { + fail('findFileUrl() should only be called once'); + } + }, + }, + ], + }); + expect(result.css).toBe('a {\n b: c;\n}'); + })); + + it('wraps an error', () => { + expect(() => { + compileString('@import "other";', { + importers: [ + { + findFileUrl() { + throw 'this import is bad actually'; + }, + }, + ], + }); + }).toThrowSassException({line: 0}); + }); + + it('rejects a non-file URL', () => { + expect(() => { + compileString('@import "other";', { + importers: [{findFileUrl: () => new URL('u:other.scss')}], + }); + }).toThrowSassException({line: 0}); + }); + + describe('when the resolved file has extension', () => { + it('.scss, parses it as SCSS', () => + sandbox(dir => { + dir.write({'_other.scss': '$a: value; b {c: $a}'}); + const result = compileString('@import "other";', { + importers: [{findFileUrl: () => dir.url('other')}], + }); + expect(result.css).toBe('b {\n c: value;\n}'); + })); + + it('.sass, parses it as the indented syntax', () => + sandbox(dir => { + dir.write({'_other.sass': '$a: value\nb\n c: $a'}); + const result = compileString('@import "other";', { + importers: [{findFileUrl: () => dir.url('other')}], + }); + expect(result.css).toBe('b {\n c: value;\n}'); + })); + + it('.css, allows plain CSS', () => + sandbox(dir => { + dir.write({'_other.css': 'a {b: c}'}); + const result = compileString('@import "other";', { + importers: [{findFileUrl: () => dir.url('other')}], + }); + expect(result.css).toBe('a {\n b: c;\n}'); + })); + + it('.css, rejects SCSS', () => + sandbox(dir => { + dir.write({'_other.css': '$a: value; b {c: $a}'}); + expect(() => { + compileString('@import "other";', { + importers: [{findFileUrl: () => dir.url('other')}], + }); + }).toThrowSassException({ + line: 0, + url: dir.url('_other.css'), + }); + })); + }); + + describe('fromImport is', () => { + it('true from an @import', () => + sandbox(dir => { + dir.write({'_other.scss': 'a {b: c}'}); + compileString('@import "other"', { + importers: [ + { + findFileUrl(url: string, options: {fromImport: boolean}) { + expect(options.fromImport).toBeTrue(); + return dir.url('other'); + }, + }, + ], + }); + })); + + it('false from a @use', () => + sandbox(dir => { + dir.write({'_other.scss': 'a {b: c}'}); + compileString('@use "other"', { + importers: [ + { + findFileUrl(url: string, {fromImport}: {fromImport: boolean}) { + expect(fromImport).toBeFalse(); + return dir.url('other'); + }, + }, + ], + }); + })); + }); + + describe('async', () => { + it('resolves an @import', async () => + sandbox(async dir => { + dir.write({'_other.scss': 'a {b: c}'}); + const result = await compileStringAsync('@use "other"', { + importers: [ + { + findFileUrl: () => Promise.resolve(dir.url('other')), + }, + ], + }); + expect(result.css).toBe('a {\n b: c;\n}'); + })); + + it('wraps an error', async () => { + await expectAsync(() => + compileStringAsync('@import "other";', { + importers: [ + { + findFileUrl: () => Promise.reject('this import is bad actually'), + }, + ], + }) + ).toThrowSassException({line: 0}); + }); + }); +}); + +it( + "throws an error for an importer that's ambiguous between FileImporter " + + 'and Importer', + () => + sandbox(dir => { + dir.write({'_other.scss': 'a {b: c}'}); + const callback = () => { + compileString('', { + importers: [ + { + findFileUrl: () => dir.url('other'), + canonicalize: () => new URL('u:other'), + load: () => ({contents: 'a {b: c}', syntax: 'scss'}), + } as unknown as Importer<'sync'>, + ], + }); + }; + + expect(callback).toThrow(); + expect(callback).not.toThrowSassException(); + }) +); diff --git a/js-api-spec/importer.test.ts b/js-api-spec/importer.test.ts index 2880d44044..1aa41460a2 100644 --- a/js-api-spec/importer.test.ts +++ b/js-api-spec/importer.test.ts @@ -2,17 +2,16 @@ // MIT-style license that can be found in the LICENSE file or at // https://opensource.org/licenses/MIT. -import {URL} from 'url'; -import {compile, compileString, compileStringAsync, Importer} from 'sass'; +import {compileString, compileStringAsync, Importer} from 'sass'; -import {sandbox} from './utils'; +import {sassImpl, URL} from './utils'; it('uses an importer to resolve an @import', () => { const result = compileString('@import "orange";', { importers: [ { - canonicalize: url => new URL(`u:${url}`), - load(url) { + canonicalize: (url: string) => new URL(`u:${url}`), + load(url: typeof URL) { const color = url.pathname; return {contents: `.${color} {color: ${color}}`, syntax: 'scss'}; }, @@ -28,7 +27,7 @@ it('passes the canonicalized URL to the importer', () => { importers: [ { canonicalize: () => new URL('u:blue'), - load(url) { + load(url: typeof URL) { const color = url.pathname; return {contents: `.${color} {color: ${color}}`, syntax: 'scss'}; }, @@ -49,7 +48,7 @@ it('only invokes the importer once for a given canonicalization', () => { importers: [ { canonicalize: () => new URL('u:blue'), - load(url) { + load(url: typeof URL) { const color = url.pathname; return {contents: `.${color} {color: ${color}}`, syntax: 'scss'}; }, @@ -73,7 +72,7 @@ describe('the imported URL', () => { const result = compileString('@import "/orange";', { importers: [ { - canonicalize(url) { + canonicalize(url: string) { expect(url).toEqual('/orange'); return new URL(`u:${url}`); }, @@ -89,7 +88,7 @@ describe('the imported URL', () => { const result = compileString('@import "C:/orange";', { importers: [ { - canonicalize(url) { + canonicalize(url: string) { expect(url).toEqual('file:///C:/orange'); return new URL(`u:${url}`); }, @@ -106,8 +105,8 @@ it("uses an importer's source map URL", () => { const result = compileString('@import "orange";', { importers: [ { - canonicalize: url => new URL(`u:${url}`), - load(url) { + canonicalize: (url: string) => new URL(`u:${url}`), + load(url: typeof URL) { const color = url.pathname; return { contents: `.${color} {color: ${color}}`, @@ -120,7 +119,7 @@ it("uses an importer's source map URL", () => { sourceMap: true, }); - expect(result.sourceMap!.sources).toInclude('u:blue'); + expect(result.sourceMap!.sources).toContain('u:blue'); }); it('wraps an error in canonicalize()', () => { @@ -134,7 +133,7 @@ it('wraps an error in canonicalize()', () => { load() { fail('load() should not be called'); }, - }, + } as unknown as Importer<'sync'>, ], }); }).toThrowSassException({line: 0}); @@ -145,7 +144,7 @@ it('wraps an error in load()', () => { compileString('@import "orange";', { importers: [ { - canonicalize: url => new URL(`u:${url}`), + canonicalize: (url: string) => new URL(`u:${url}`), load() { throw 'this import is bad actually'; }, @@ -155,62 +154,17 @@ it('wraps an error in load()', () => { }).toThrowSassException({line: 0}); }); -it('avoids importer when canonicalize() returns null', () => - sandbox(dir => { - dir.write({'dir/_other.scss': 'a {from: dir}'}); - - const result = compileString('@import "other";', { - importers: [ - { - canonicalize: () => null, - load() { - fail('load() should not be called'); - }, - }, - ], - loadPaths: [dir('dir')], - }); - expect(result.css).toBe('a {\n from: dir;\n}'); - })); - it('fails to import when load() returns null', () => - sandbox(dir => { - dir.write({'dir/_other.scss': 'a {from: dir}'}); - - expect(() => { - compileString('@import "other";', { - importers: [ - { - canonicalize: url => new URL(`u:${url}`), - load: () => null, - }, - ], - loadPaths: [dir('dir')], - }); - }).toThrowSassException({line: 0}); - })); - -it('prefers a relative file load to an importer', () => - sandbox(dir => { - dir.write({ - 'input.scss': '@import "other"', - '_other.scss': 'a {from: relative}', - }); - - const result = compile(dir('input.scss'), { + expect(() => { + compileString('@import "other";', { importers: [ { - canonicalize() { - fail('canonicalize() should not be called'); - }, - load() { - fail('load() should not be called'); - }, + canonicalize: (url: string) => new URL(`u:${url}`), + load: () => null, }, ], }); - expect(result.css).toBe('a {\n from: relative;\n}'); - })); + }).toThrowSassException({line: 0})); it('prefers a relative importer load to an importer', () => { const result = compileString('@import "other";', { @@ -226,32 +180,13 @@ it('prefers a relative importer load to an importer', () => { ], url: new URL('o:style.scss'), importer: { - canonicalize: url => new URL(url), + canonicalize: (url: string) => new URL(url), load: () => ({contents: 'a {from: relative}', syntax: 'scss'}), }, }); expect(result.css).toBe('a {\n from: relative;\n}'); }); -it('prefers an importer to a load path', () => - sandbox(dir => { - dir.write({ - 'input.scss': '@import "other"', - 'dir/_other.scss': 'a {from: load-path}', - }); - - const result = compile(dir('input.scss'), { - importers: [ - { - canonicalize: url => new URL(`u:${url}`), - load: () => ({contents: 'a {from: importer}', syntax: 'scss'}), - }, - ], - loadPaths: [dir('dir')], - }); - expect(result.css).toBe('a {\n from: importer;\n}'); - })); - describe('with syntax', () => { it('scss, parses it as SCSS', () => { const result = compileString('@import "other";', { @@ -317,8 +252,8 @@ describe('async', () => { const result = await compileStringAsync('@import "orange";', { importers: [ { - canonicalize: url => Promise.resolve(new URL(`u:${url}`)), - load(url) { + canonicalize: (url: string) => Promise.resolve(new URL(`u:${url}`)), + load(url: typeof URL) { const color = url.pathname; return Promise.resolve({ contents: `.${color} {color: ${color}}`, @@ -333,7 +268,7 @@ describe('async', () => { }); it('wraps an asynchronous error in canonicalize', async () => { - await expect(() => + await expectAsync(() => compileStringAsync('@import "orange";', { importers: [ { @@ -341,14 +276,14 @@ describe('async', () => { load() { fail('load() should not be called'); }, - }, + } as unknown as Importer<'async'>, ], }) ).toThrowSassException({line: 0}); }); it('wraps a synchronous error in canonicalize', async () => { - await expect(() => + await expectAsync(() => compileStringAsync('@import "orange";', { importers: [ { @@ -358,18 +293,18 @@ describe('async', () => { load() { fail('load() should not be called'); }, - }, + } as unknown as Importer<'async'>, ], }) ).toThrowSassException({line: 0}); }); it('wraps an asynchronous error in load', async () => { - await expect(() => + await expectAsync(() => compileStringAsync('@import "orange";', { importers: [ { - canonicalize: url => new URL(`u:${url}`), + canonicalize: (url: string) => new URL(`u:${url}`), load: () => Promise.reject('this import is bad actually'), }, ], @@ -378,11 +313,11 @@ describe('async', () => { }); it('wraps a synchronous error in load', async () => { - await expect(() => + await expectAsync(() => compileStringAsync('@import "orange";', { importers: [ { - canonicalize: url => new URL(`u:${url}`), + canonicalize: (url: string) => new URL(`u:${url}`), load() { throw 'this import is bad actually'; }, @@ -413,264 +348,18 @@ describe('fromImport is', () => { }); }); -describe('FileImporter', () => { - it('loads a fully canonicalized URL', () => - sandbox(dir => { - dir.write({'_other.scss': 'a {b: c}'}); - - const result = compileString('@import "other";', { - importers: [{findFileUrl: () => dir.url('_other.scss')}], - }); - expect(result.css).toBe('a {\n b: c;\n}'); - })); - - it('resolves a non-canonicalized URL', () => - sandbox(dir => { - dir.write({'other/_index.scss': 'a {b: c}'}); - - const result = compileString('@import "other";', { - importers: [{findFileUrl: () => dir.url('other')}], - }); - expect(result.css).toBe('a {\n b: c;\n}'); - })); - - it('avoids importer when it returns null', () => - sandbox(dir => { - dir.write({'_other.scss': 'a {from: dir}'}); - - const result = compileString('@import "other";', { - importers: [{findFileUrl: () => null}], - loadPaths: [dir.root], - }); - expect(result.css).toBe('a {\n from: dir;\n}'); - })); - - it('avoids importer when it returns an unresolvable URL', () => - sandbox(dir => { - dir.write({'_other.scss': 'a {from: dir}'}); - - const result = compileString('@import "other";', { - importers: [{findFileUrl: () => dir.url('nonexistent/other')}], - loadPaths: [dir.root], - }); - expect(result.css).toBe('a {\n from: dir;\n}'); - })); - - it('passes an absolute non-file: URL to the importer', () => - sandbox(dir => { - dir.write({'dir/_other.scss': 'a {b: c}'}); - - const result = compileString('@import "u:other";', { - importers: [ - { - findFileUrl(url) { - expect(url).toEqual('u:other'); - return dir.url('dir/other'); - }, - }, - ], - }); - expect(result.css).toBe('a {\n b: c;\n}'); - })); - - it("doesn't pass an absolute file: URL to the importer", () => - sandbox(dir => { - dir.write({'_other.scss': 'a {b: c}'}); - - const result = compileString(`@import "${dir.url('other')}";`, { - importers: [ - { - findFileUrl() { - fail('findFileUrl() should not be called'); - }, - }, - ], - }); - expect(result.css).toBe('a {\n b: c;\n}'); - })); - - it("doesn't pass relative loads to the importer", () => - sandbox(dir => { - dir.write({'_midstream.scss': '@import "upstream"'}); - dir.write({'_upstream.scss': 'a {b: c}'}); - - let count = 0; - const result = compileString('@import "midstream";', { - importers: [ - { - findFileUrl() { - if (count === 0) { - count++; - return dir.url('upstream'); - } else { - fail('findFileUrl() should only be called once'); - } - }, - }, - ], - }); - expect(result.css).toBe('a {\n b: c;\n}'); - })); - - it('wraps an error', () => { - expect(() => { - compileString('@import "other";', { - importers: [ - { - findFileUrl() { - throw 'this import is bad actually'; - }, - }, - ], - }); - }).toThrowSassException({line: 0}); - }); - - it('rejects a non-file URL', () => { - expect(() => { - compileString('@import "other";', { - importers: [{findFileUrl: () => new URL('u:other.scss')}], - }); - }).toThrowSassException({line: 0}); - }); - - describe('when the resolved file has extension', () => { - it('.scss, parses it as SCSS', () => - sandbox(dir => { - dir.write({'_other.scss': '$a: value; b {c: $a}'}); - const result = compileString('@import "other";', { - importers: [{findFileUrl: () => dir.url('other')}], - }); - expect(result.css).toBe('b {\n c: value;\n}'); - })); - - it('.sass, parses it as the indented syntax', () => - sandbox(dir => { - dir.write({'_other.sass': '$a: value\nb\n c: $a'}); - const result = compileString('@import "other";', { - importers: [{findFileUrl: () => dir.url('other')}], - }); - expect(result.css).toBe('b {\n c: value;\n}'); - })); - - it('.css, allows plain CSS', () => - sandbox(dir => { - dir.write({'_other.css': 'a {b: c}'}); - const result = compileString('@import "other";', { - importers: [{findFileUrl: () => dir.url('other')}], - }); - expect(result.css).toBe('a {\n b: c;\n}'); - })); - - it('.css, rejects SCSS', () => - sandbox(dir => { - dir.write({'_other.css': '$a: value; b {c: $a}'}); - expect(() => { - compileString('@import "other";', { - importers: [{findFileUrl: () => dir.url('other')}], - }); - }).toThrowSassException({ - line: 0, - url: dir.url('_other.css'), - }); - })); - }); - - describe('fromImport is', () => { - it('true from an @import', () => - sandbox(dir => { - dir.write({'_other.scss': 'a {b: c}'}); - compileString('@import "other"', { - importers: [ - { - findFileUrl(url, options) { - expect(options.fromImport).toBeTrue(); - return dir.url('other'); - }, - }, - ], - }); - })); - - it('false from a @use', () => - sandbox(dir => { - dir.write({'_other.scss': 'a {b: c}'}); - compileString('@use "other"', { - importers: [ - { - findFileUrl(url, {fromImport}) { - expect(fromImport).toBeFalse(); - return dir.url('other'); - }, - }, - ], - }); - })); - }); - - describe('async', () => { - it('resolves an @import', async () => - sandbox(async dir => { - dir.write({'_other.scss': 'a {b: c}'}); - const result = await compileStringAsync('@use "other"', { - importers: [ - { - findFileUrl: () => Promise.resolve(dir.url('other')), - }, - ], - }); - expect(result.css).toBe('a {\n b: c;\n}'); - })); - - it('wraps an error', async () => { - await expect(() => - compileStringAsync('@import "other";', { - importers: [ - { - findFileUrl: () => Promise.reject('this import is bad actually'), - }, - ], - }) - ).toThrowSassException({line: 0}); - }); - }); -}); - -it( - "throws an error for an importer that's ambiguous between FileImporter " + - 'and Importer', - () => - sandbox(dir => { - dir.write({'_other.scss': 'a {b: c}'}); - const callback = () => { - compileString('', { - importers: [ - { - findFileUrl: () => dir.url('other'), - canonicalize: () => new URL('u:other'), - load: () => ({contents: 'a {b: c}', syntax: 'scss'}), - } as unknown as Importer<'sync'>, - ], - }); - }; - - expect(callback).toThrow(); - expect(callback).not.toThrowSassException(); - }) -); - describe('when importer does not return string contents', () => { it('throws an error in sync mode', () => { expect(() => { compileString('@import "other";', { importers: [ { - canonicalize: url => new URL(`u:${url}`), + canonicalize: (url: string) => new URL(`u:${url}`), load() { return { // Need to force an invalid type to test bad-type handling. // eslint-disable-next-line @typescript-eslint/no-explicit-any - contents: Buffer.from('not a string') as any, + contents: 123 as any, syntax: 'scss', }; }, @@ -679,21 +368,23 @@ describe('when importer does not return string contents', () => { }); }).toThrowSassException({ line: 0, - includes: 'Invalid argument (contents): must be a string but was: Buffer', + includes: `Invalid argument (contents): must be a string but was: ${ + sassImpl === 'sass-embedded' ? 'Number' : 'number' + }`, }); }); it('throws an error in async mode', async () => { - await expect(async () => { + await expectAsync(async () => { await compileStringAsync('@import "other";', { importers: [ { - canonicalize: url => new URL(`u:${url}`), + canonicalize: (url: string) => new URL(`u:${url}`), load() { return { // Need to force an invalid type to test bad-type handling. // eslint-disable-next-line @typescript-eslint/no-explicit-any - contents: Buffer.from('not a string') as any, + contents: 123 as any, syntax: 'scss', }; }, @@ -702,7 +393,9 @@ describe('when importer does not return string contents', () => { }); }).toThrowSassException({ line: 0, - includes: 'Invalid argument (contents): must be a string but was: Buffer', + includes: `Invalid argument (contents): must be a string but was: ${ + sassImpl === 'sass-embedded' ? 'Number' : 'number' + }`, }); }); }); @@ -712,12 +405,12 @@ it('throws an ArgumentError when the result sourceMapUrl is missing a scheme', ( compileString('@import "other";', { importers: [ { - canonicalize: url => new URL(`u:${url}`), + canonicalize: (url: string) => new URL(`u:${url}`), load() { return { contents: '', syntax: 'scss', - sourceMapUrl: {} as URL, + sourceMapUrl: {} as typeof URL, }; }, }, @@ -735,7 +428,7 @@ it('throws an ArgumentError when the result sourceMapUrl is missing a scheme', ( */ function expectFromImport(expected: boolean): Importer<'sync'> { return { - canonicalize(url, {fromImport}) { + canonicalize(url: string, {fromImport}: {fromImport: boolean}) { expect(fromImport).toBe(expected); return new URL(`u:${url}`); }, diff --git a/js-api-spec/legacy/function.test.ts b/js-api-spec/legacy/function.node.test.ts similarity index 87% rename from js-api-spec/legacy/function.test.ts rename to js-api-spec/legacy/function.node.test.ts index b45c342dd9..af5a95316b 100644 --- a/js-api-spec/legacy/function.test.ts +++ b/js-api-spec/legacy/function.node.test.ts @@ -6,7 +6,7 @@ import * as p from 'path'; import * as sass from 'sass'; import {sandbox} from '../sandbox'; -import {skipForImpl} from '../utils'; +import {skipForImpl, spy} from '../utils'; describe('rejects a signature', () => { it('with an invalid argument list', () => { @@ -164,7 +164,8 @@ describe('passes arguments', () => { .renderSync({ data: 'a {b: last(1px, 2em)}', functions: { - 'last($value1, $value2)': (value1, value2) => value2, + 'last($value1, $value2)': (value1: unknown, value2: unknown) => + value2 as sass.LegacySyncFunction, }, }) .css.toString() @@ -177,7 +178,8 @@ describe('passes arguments', () => { .renderSync({ data: 'a {b: last($value2: 1px, $value1: 2em)}', functions: { - 'last($value1, $value2)': (value1, value2) => value2, + 'last($value1, $value2)': (value1: unknown, value2: unknown) => + value2 as sass.LegacySyncFunction, }, }) .css.toString() @@ -190,7 +192,8 @@ describe('passes arguments', () => { .renderSync({ data: 'a {b: last((1px 2em)...)}', functions: { - 'last($value1, $value2)': (value1, value2) => value2, + 'last($value1, $value2)': (value1: unknown, value2: unknown) => + value2 as sass.LegacySyncFunction, }, }) .css.toString() @@ -203,10 +206,9 @@ describe('passes arguments', () => { .renderSync({ data: 'a {b: last(1px, 2em)}', functions: { - 'last($args...)': args => { - const argList = args as sass.types.List; + 'last($args...)': ((argList: sass.types.List) => { return argList.getValue(argList.getLength() - 1)!; - }, + }) as sass.LegacySyncFunction, }, }) .css.toString() @@ -236,7 +238,7 @@ describe('rejects a return value that', () => { describe('this', () => { it('includes default option values', () => { - const fn = jest.fn(function (this: sass.LegacyPluginThis) { + const fn = spy(function (this: sass.LegacyPluginThis) { const options = this.options; expect(options.includePaths).toEqual(process.cwd()); expect(options.precision).toEqual(10); @@ -252,7 +254,7 @@ describe('this', () => { }); it('includes the data when rendering via data', () => { - const fn = jest.fn(function (this: sass.LegacyPluginThis) { + const fn = spy(function (this: sass.LegacyPluginThis) { const options = this.options; expect(options.data).toEqual('a {b: foo()}'); expect(options.file).toBeUndefined(); @@ -267,7 +269,7 @@ describe('this', () => { sandbox(dir => { dir.write({'test.scss': 'a {b: foo()}'}); - const fn = jest.fn(function (this: sass.LegacyPluginThis) { + const fn = spy(function (this: sass.LegacyPluginThis) { const options = this.options; expect(options.data).toBeUndefined(); expect(options.file).toEqual(dir('test.scss')); @@ -281,7 +283,7 @@ describe('this', () => { it('includes other include paths', () => { sandbox(dir => { - const fn = jest.fn(function (this: sass.LegacyPluginThis) { + const fn = spy(function (this: sass.LegacyPluginThis) { expect(this.options.includePaths).toBe( `${process.cwd()}${p.delimiter}${dir.root}` ); @@ -301,7 +303,7 @@ describe('this', () => { skipForImpl('sass-embedded', () => { describe('can override', () => { it('indentWidth', () => { - const fn = jest.fn(function (this: sass.LegacyPluginThis) { + const fn = spy(function (this: sass.LegacyPluginThis) { expect(this.options.indentWidth).toBe(5); return sass.types.Null.NULL; }); @@ -316,7 +318,7 @@ describe('this', () => { }); it('indentType', () => { - const fn = jest.fn(function (this: sass.LegacyPluginThis) { + const fn = spy(function (this: sass.LegacyPluginThis) { expect(this.options.indentType).toBe(1); return sass.types.Null.NULL; }); @@ -331,7 +333,7 @@ describe('this', () => { }); it('linefeed', () => { - const fn = jest.fn(function (this: sass.LegacyPluginThis) { + const fn = spy(function (this: sass.LegacyPluginThis) { expect(this.options.linefeed).toBe('\r'); return sass.types.Null.NULL; }); @@ -348,7 +350,7 @@ describe('this', () => { }); it('has a circular reference', () => { - const fn = jest.fn(function (this: sass.LegacyPluginThis) { + const fn = spy(function (this: sass.LegacyPluginThis) { expect(this.options.context).toBe(this); return sass.types.Null.NULL; }); @@ -361,7 +363,7 @@ describe('this', () => { it('a start time', () => { const start = new Date(); - const fn = jest.fn(function (this: sass.LegacyPluginThis) { + const fn = spy(function (this: sass.LegacyPluginThis) { expect(this.options.result.stats.start).toBeGreaterThanOrEqual( start.getTime() ); @@ -373,7 +375,7 @@ describe('this', () => { }); it('a data entry', () => { - const fn = jest.fn(function (this: sass.LegacyPluginThis) { + const fn = spy(function (this: sass.LegacyPluginThis) { expect(this.options.result.stats.entry).toBe('data'); return sass.types.Null.NULL; }); @@ -386,7 +388,7 @@ describe('this', () => { sandbox(dir => { dir.write({'test.scss': 'a {b: foo()}'}); - const fn = jest.fn(function (this: sass.LegacyPluginThis) { + const fn = spy(function (this: sass.LegacyPluginThis) { expect(this.options.result.stats.entry).toBe(dir('test.scss')); return sass.types.Null.NULL; }); @@ -420,7 +422,7 @@ describe('render()', () => { foo: () => new sass.types.Number(1), }, }, - (err, result) => { + (err?: sass.LegacyException, result?: sass.LegacyResult) => { expect(err).toBeNil(); expect(result!.css.toString()).toEqualIgnoringWhitespace('a { b: 1; }'); done(); @@ -438,7 +440,7 @@ describe('render()', () => { }, }, }, - (err, result) => { + (err?: sass.LegacyException, result?: sass.LegacyResult) => { expect(err).toBeNil(); expect(result!.css.toString()).toEqualIgnoringWhitespace('a { b: 1; }'); done(); @@ -456,7 +458,7 @@ describe('render()', () => { }, }, }, - err => { + (err?: sass.LegacyException) => { expect(`${err}`).toContain('aw beans'); done(); } @@ -473,7 +475,7 @@ describe('render()', () => { }, }, }, - err => { + (err?: sass.LegacyException) => { expect(`${err}`).toContain('aw beans'); done(); } @@ -490,7 +492,7 @@ describe('render()', () => { }, }, }, - err => { + (err?: sass.LegacyException) => { expect(`${err}`).toContain('aw beans'); done(); } @@ -507,8 +509,8 @@ describe('render()', () => { }, }, }, - err => { - expect(err).toBeObject(); + (err?: sass.LegacyException) => { + expect(typeof err).toBe('object'); done(); } ); @@ -524,8 +526,8 @@ describe('render()', () => { }, }, }, - err => { - expect(err).toBeObject(); + (err?: sass.LegacyException) => { + expect(typeof err).toBe('object'); done(); } ); @@ -539,7 +541,9 @@ it('a function is passed through as-is', () => { sass .renderSync({ data: "a {b: call(id(get-function('str-length')), 'foo')}", - functions: {'id($value)': value => value}, + functions: { + 'id($value)': (value: unknown) => value as sass.LegacySyncFunction, + }, }) .css.toString() ).toEqualIgnoringWhitespace('a { b: 3; }'); diff --git a/js-api-spec/legacy/importer.test.ts b/js-api-spec/legacy/importer.node.test.ts similarity index 85% rename from js-api-spec/legacy/importer.test.ts rename to js-api-spec/legacy/importer.node.test.ts index 33cc568005..081d36f536 100644 --- a/js-api-spec/legacy/importer.test.ts +++ b/js-api-spec/legacy/importer.node.test.ts @@ -2,11 +2,12 @@ // MIT-style license that can be found in the LICENSE file or at // https://opensource.org/licenses/MIT. +import * as fs from 'fs'; import * as p from 'path'; import * as sass from 'sass'; import {sandbox} from '../sandbox'; -import {sassImpl, skipForImpl} from '../utils'; +import {sassImpl, skipForImpl, spy} from '../utils'; it('imports cascade through importers', () => expect( @@ -14,9 +15,9 @@ it('imports cascade through importers', () => .renderSync({ data: "@import 'foo'", importer: [ - url => (url === 'foo' ? {contents: '@import "bar"'} : null), - url => (url === 'bar' ? {contents: '@import "baz"'} : null), - url => (url === 'baz' ? {contents: 'a {b: c}'} : null), + (url: string) => (url === 'foo' ? {contents: '@import "bar"'} : null), + (url: string) => (url === 'bar' ? {contents: '@import "baz"'} : null), + (url: string) => (url === 'baz' ? {contents: 'a {b: c}'} : null), ], }) .css.toString() @@ -88,6 +89,25 @@ describe('import precedence:', () => { ); })); + // Regression test for embedded host. + it('CWD works when neither importer nor includePaths are specified', () => + sandbox(dir => { + dir.write({ + 'sub/test.scss': 'a {from: cwd}', + 'sub/base.scss': '@import "sub/test"', + }); + + dir.chdir(() => + expect( + sass + .renderSync({ + file: dir('sub/base.scss'), + }) + .css.toString() + ).toEqualIgnoringWhitespace('a { from: cwd; }') + ); + })); + // Regression test for embedded host. it('falls back to load path if imports list is empty', () => sandbox(dir => { @@ -397,7 +417,7 @@ describe('with a file redirect', () => { describe('the imported URL', () => { it('is the exact imported text', () => { - const importer = jest.fn(url => { + const importer = spy((url: string) => { expect(url).toBe('foo'); return {contents: ''}; }); @@ -409,7 +429,7 @@ describe('the imported URL', () => { // Regression test for sass/dart-sass#246. skipForImpl('sass-embedded', () => { it("doesn't remove ./", () => { - const importer = jest.fn(url => { + const importer = spy((url: string) => { expect(url).toBe('./foo'); return {contents: ''}; }); @@ -420,7 +440,7 @@ describe('the imported URL', () => { }); it("isn't resolved relative to the current file", () => { - const importer = jest.fn(url => { + const importer = spy((url: string) => { if (url === 'foo/bar') return {contents: '@import "baz"'}; expect(url).toBe('baz'); return {contents: ''}; @@ -440,7 +460,7 @@ describe('the imported URL', () => { // Regression test for sass/dart-sass#1137. it("isn't changed if it's root-relative with no nesting", () => { - const importer = jest.fn(url => { + const importer = spy((url: string) => { expect(url).toBe('/foo'); return {contents: ''}; }); @@ -451,7 +471,7 @@ describe('the imported URL', () => { // Regression test for sass/embedded-host-node#1137. it("isn't changed if it's root-relative with nesting", () => { - const importer = jest.fn(url => { + const importer = spy((url: string) => { expect(url).toBe('/foo/bar/baz'); return {contents: ''}; }); @@ -461,7 +481,7 @@ describe('the imported URL', () => { }); it("is converted to a file: URL if it's an absolute Windows path", () => { - const importer = jest.fn(url => { + const importer = spy((url: string) => { expect(url).toBe('file:///C:/foo'); return {contents: ''}; }); @@ -476,7 +496,7 @@ describe('the previous URL', () => { sandbox(dir => { dir.write({'test.scss': '@import "foo"'}); - const importer = jest.fn((url, prev) => { + const importer = spy((url, prev) => { expect(prev).toBe(p.resolve(dir('test.scss'))); return {contents: ''}; }); @@ -492,7 +512,7 @@ describe('the previous URL', () => { '_other.scss': '@import "baz"', }); - const importer = jest.fn((url, prev) => { + const importer = spy((url, prev) => { if (url === 'foo') return {file: '_other.scss'}; expect(url).toBe('baz'); expect(prev).toBe(dir('_other.scss')); @@ -504,7 +524,7 @@ describe('the previous URL', () => { })); it('is "stdin" for string stylesheets', () => { - const importer = jest.fn((url, prev) => { + const importer = spy((url, prev) => { expect(prev).toBe('stdin'); return {contents: ''}; }); @@ -514,11 +534,11 @@ describe('the previous URL', () => { }); it('is the imported string for imports from importers', () => { - const importer1 = jest.fn(url => + const importer1 = spy((url: string) => url === 'foo' ? {contents: '@import "bar"'} : null ); - const importer2 = jest.fn((url, prev) => { + const importer2 = spy((url, prev) => { expect(url).toBe('bar'); expect(prev).toBe('foo'); return {contents: ''}; @@ -543,7 +563,7 @@ describe('the previous URL', () => { '_relative.scss': 'a {b: relative}', }); - const importer = jest.fn((url, prev) => { + const importer = spy((url, prev) => { expect(url).toBe('importer'); expect(prev).toBe(dir('test.scss')); return {contents: 'a {b: importer}'}; @@ -558,7 +578,7 @@ describe('the previous URL', () => { describe('this', () => { it('includes default option values', () => { - const importer = jest.fn(function (this: sass.LegacyImporterThis) { + const importer = spy(function (this: sass.LegacyImporterThis) { const options = this.options; expect(options.includePaths).toBe(process.cwd()); expect(options.precision).toEqual(10); @@ -574,7 +594,7 @@ describe('this', () => { }); it('includes the data when rendering via data', () => { - const importer = jest.fn(function (this: sass.LegacyImporterThis) { + const importer = spy(function (this: sass.LegacyImporterThis) { const options = this.options; expect(options.data).toBe('@import "foo"'); expect(options.file).toBeUndefined(); @@ -589,7 +609,7 @@ describe('this', () => { sandbox(dir => { dir.write({'test.scss': '@import "foo"'}); - const importer = jest.fn(function (this: sass.LegacyImporterThis) { + const importer = spy(function (this: sass.LegacyImporterThis) { const options = this.options; // Because of the way it wraps legacy importers, the embedded host @@ -608,7 +628,7 @@ describe('this', () => { it('includes other include paths', () => sandbox(dir => { - const importer = jest.fn(function (this: sass.LegacyImporterThis) { + const importer = spy(function (this: sass.LegacyImporterThis) { expect(this.options.includePaths).toContain( `${process.cwd()}${p.delimiter}${dir.root}` ); @@ -626,7 +646,7 @@ describe('this', () => { skipForImpl('sass-embedded', () => { describe('can override', () => { it('indentWidth', () => { - const importer = jest.fn(function (this: sass.LegacyImporterThis) { + const importer = spy(function (this: sass.LegacyImporterThis) { expect(this.options.indentWidth).toBe(5); return {contents: ''}; }); @@ -636,7 +656,7 @@ describe('this', () => { }); it('indentType', () => { - const importer = jest.fn(function (this: sass.LegacyImporterThis) { + const importer = spy(function (this: sass.LegacyImporterThis) { expect(this.options.indentType).toBe(1); return {contents: ''}; }); @@ -646,7 +666,7 @@ describe('this', () => { }); it('linefeed', () => { - const importer = jest.fn(function (this: sass.LegacyImporterThis) { + const importer = spy(function (this: sass.LegacyImporterThis) { expect(this.options.linefeed).toBe('\r'); return {contents: ''}; }); @@ -658,7 +678,7 @@ describe('this', () => { }); it('has a circular reference', () => { - const importer = jest.fn(function (this: sass.LegacyImporterThis) { + const importer = spy(function (this: sass.LegacyImporterThis) { expect(this.options.context).toBe(this); return {contents: ''}; }); @@ -670,7 +690,7 @@ describe('this', () => { describe('includes render stats with', () => { it('a start time', () => { const start = new Date(); - const importer = jest.fn(function (this: sass.LegacyImporterThis) { + const importer = spy(function (this: sass.LegacyImporterThis) { expect(this.options.result.stats.start).toBeGreaterThanOrEqual( start.getTime() ); @@ -682,7 +702,7 @@ describe('this', () => { }); it('a data entry', () => { - const importer = jest.fn(function (this: sass.LegacyImporterThis) { + const importer = spy(function (this: sass.LegacyImporterThis) { expect(this.options.result.stats.entry).toBe('data'); return {contents: ''}; }); @@ -695,7 +715,7 @@ describe('this', () => { sandbox(dir => { dir.write({'test.scss': '@import "foo"'}); - const importer = jest.fn(function (this: sass.LegacyImporterThis) { + const importer = spy(function (this: sass.LegacyImporterThis) { expect(this.options.result.stats.entry).toBe(dir('test.scss')); return {contents: ''}; }); @@ -707,7 +727,7 @@ describe('this', () => { describe("includes a fromImport field that's", () => { it('true for an @import', () => { - const importer = jest.fn(function (this: sass.LegacyImporterThis) { + const importer = spy(function (this: sass.LegacyImporterThis) { expect(this.fromImport).toBeTrue(); return {contents: ''}; }); @@ -717,7 +737,7 @@ describe('this', () => { }); it('false for a @use', () => { - const importer = jest.fn(function (this: sass.LegacyImporterThis) { + const importer = spy(function (this: sass.LegacyImporterThis) { expect(this.fromImport).toBeFalse(); return {contents: ''}; }); @@ -727,7 +747,7 @@ describe('this', () => { }); it('false for a @forward', () => { - const importer = jest.fn(function (this: sass.LegacyImporterThis) { + const importer = spy(function (this: sass.LegacyImporterThis) { expect(this.fromImport).toBeFalse(); return {contents: ''}; }); @@ -737,7 +757,7 @@ describe('this', () => { }); it('false for meta.load-css()', () => { - const importer = jest.fn(function (this: sass.LegacyImporterThis) { + const importer = spy(function (this: sass.LegacyImporterThis) { expect(this.fromImport).toBeFalse(); return {contents: ''}; }); @@ -817,11 +837,15 @@ describe('render()', () => { sass.render( { data: '@import "foo"', - importer: (_, __, done) => { + importer: (( + _: string, + __: string, + done: (...args: unknown[]) => void + ) => { setTimeout(() => done({contents: 'a {b: c}'})); - }, + }) as sass.LegacySyncImporter, }, - (err, result) => { + (err?: sass.LegacyException, result?: sass.LegacyResult) => { expect(result!.css.toString()).toEqualIgnoringWhitespace('a { b: c; }'); done(); } @@ -831,12 +855,16 @@ describe('render()', () => { sass.render( { data: '@import "foo"', - importer: (_, __, done) => { + importer: (( + _: string, + __: string, + done: (...args: unknown[]) => void + ) => { setTimeout(() => done(new Error('oh no'))); - }, + }) as sass.LegacySyncImporter, }, - err => { - expect(err).toBeObject(); + (err?: sass.LegacyException) => { + expect(typeof err).toBe('object'); done(); } )); @@ -847,17 +875,20 @@ describe('render()', () => { data: '@import "foo"', importer: () => ({contents: 'a {b: c}'}), }, - (err, result) => { + (err?: sass.LegacyException, result?: sass.LegacyResult) => { expect(result!.css.toString()).toEqualIgnoringWhitespace('a { b: c; }'); done(); } )); it('supports synchronous null returns', done => - sass.render({data: '@import "foo"', importer: () => null}, err => { - expect(err).toBeObject(); - done(); - })); + sass.render( + {data: '@import "foo"', importer: () => null}, + (err?: sass.LegacyException) => { + expect(typeof err).toBe('object'); + done(); + } + )); }); describe('when importer returns non-string contents', () => { @@ -893,7 +924,7 @@ describe('when importer returns non-string contents', () => { }; }, }, - err => { + (err?: sass.LegacyException) => { expect(() => { throw err; }).toThrowLegacyException({ @@ -905,3 +936,35 @@ describe('when importer returns non-string contents', () => { ); }); }); + +// Regression test for sass/dart-sass#1962 +it('compiles multiple nested relative imports loaded multiple times across different files', async () => { + await sandbox(dir => { + dir.write({ + 'src/index.scss': ` + @import "./_a.scss"; + @import "./_includes.scss"; + `, + 'include/_a.scss': '/* A */', + 'include/_b.scss': '/* B */', + 'src/_includes.scss': ` + @import "./_a.scss"; + @import "./_b.scss"; + `, + }); + + const result = sass.renderSync({ + file: dir('src/index.scss'), + importer: function (url) { + const path = dir('./include', url); + if (fs.existsSync(path)) { + return { + contents: fs.readFileSync(path, 'utf8'), + }; + } + return null; + }, + }); + expect(result.css.toString()).toBe('/* A */\n/* A */\n/* B */'); + }); +}); diff --git a/js-api-spec/legacy/render.test.ts b/js-api-spec/legacy/render.node.test.ts similarity index 89% rename from js-api-spec/legacy/render.test.ts rename to js-api-spec/legacy/render.node.test.ts index 145250593c..e0bf1dcadd 100644 --- a/js-api-spec/legacy/render.test.ts +++ b/js-api-spec/legacy/render.node.test.ts @@ -6,7 +6,8 @@ import * as p from 'path'; import * as sass from 'sass'; import {sandbox} from '../sandbox'; -import {skipForImpl, captureStdio, captureStdioAsync} from '../utils'; +import {skipForImpl} from '../utils'; +import {captureStdio, captureStdioAsync} from '../utils'; describe('renderSync()', () => { it('one of data and file must be set', () => { @@ -196,13 +197,13 @@ describe('renderSync()', () => { })); it("doesn't require the file path to exist", () => - sandbox(dir => + sandbox(dir => { expect( sass .renderSync({file: dir('non-existent.scss'), data: 'a {b: c}'}) .css.toString() - ).toEqualIgnoringWhitespace('a { b: c; }') - )); + ).toEqualIgnoringWhitespace('a { b: c; }'); + })); it('resolves loads relative to the file path to exist', () => sandbox(dir => { @@ -241,38 +242,44 @@ describe('renderSync()', () => { describe('render()', () => { it('renders a string', done => { - sass.render({data: 'a {b: c}'}, (err, result) => { - expect(err).toBeFalsy(); - expect(result!.css.toString()).toBe('a {\n b: c;\n}'); - done(); - }); + sass.render( + {data: 'a {b: c}'}, + (err?: sass.LegacyException, result?: sass.LegacyResult) => { + expect(err).toBeFalsy(); + expect(result!.css.toString()).toBe('a {\n b: c;\n}'); + done(); + } + ); }); it('throws a LegacyException', done => { - sass.render({data: 'a {b: }'}, (err, result) => { - expect(result).toBeFalsy(); - const error = err as sass.LegacyException; - expect(error.formatted).toBeString(); - expect(error.line).toBe(1); - expect(error.column).toBeNumber(); - expect(error.status).toBeNumber(); - expect(error.file).toBe('stdin'); - done(); - }); + sass.render( + {data: 'a {b: }'}, + (err?: sass.LegacyException, result?: sass.LegacyResult) => { + expect(result).toBeFalsy(); + const error = err as sass.LegacyException; + expect(error.formatted).toBeString(); + expect(error.line).toBe(1); + expect(error.column).toBeNumber(); + expect(error.status).toBeNumber(); + expect(error.file).toBe('stdin'); + done(); + } + ); }); }); describe('messages', () => { it('emits warnings on stderr by default', () => { const stdio = captureStdio(() => sass.renderSync({data: '@warn heck'})); - expect(stdio.out).toBeEmpty(); - expect(stdio.err).not.toBeEmpty(); + expect(stdio.out).toBeEmptyString(); + expect(stdio.err).not.toBeEmptyString(); }); it('emits debug messages on stderr by default', () => { const stdio = captureStdio(() => sass.renderSync({data: '@debug heck'})); - expect(stdio.out).toBeEmpty(); - expect(stdio.err).not.toBeEmpty(); + expect(stdio.out).toBeEmptyString(); + expect(stdio.err).not.toBeEmptyString(); }); }); @@ -402,7 +409,7 @@ describe('options', () => { const stdio = captureStdio(() => sass.renderSync({file: dir('test.scss'), quietDeps: true}) ); - expect(stdio.out).toBeEmpty(); + expect(stdio.out).toBeEmptyString(); expect(stdio.err).toContain('heck'); })); @@ -416,7 +423,7 @@ describe('options', () => { const stdio = captureStdio(() => sass.renderSync({file: dir('test.scss'), quietDeps: true}) ); - expect(stdio.out).toBeEmpty(); + expect(stdio.out).toBeEmptyString(); expect(stdio.err).toContain('heck'); })); @@ -430,7 +437,7 @@ describe('options', () => { const stdio = captureStdio(() => sass.renderSync({file: dir('test.scss'), quietDeps: true}) ); - expect(stdio.out).toBeEmpty(); + expect(stdio.out).toBeEmptyString(); expect(stdio.err).toContain('&&'); })); @@ -444,7 +451,7 @@ describe('options', () => { const stdio = captureStdio(() => sass.renderSync({file: dir('test.scss'), quietDeps: true}) ); - expect(stdio.out).toBeEmpty(); + expect(stdio.out).toBeEmptyString(); expect(stdio.err).toContain('blue'); })); }); @@ -464,7 +471,7 @@ describe('options', () => { includePaths: [dir('dir')], }) ); - expect(stdio.out).toBeEmpty(); + expect(stdio.out).toBeEmptyString(); expect(stdio.err).toContain('heck'); })); @@ -482,7 +489,7 @@ describe('options', () => { includePaths: [dir('dir')], }) ); - expect(stdio.out).toBeEmpty(); + expect(stdio.out).toBeEmptyString(); expect(stdio.err).toContain('heck'); })); @@ -500,8 +507,8 @@ describe('options', () => { includePaths: [dir('dir')], }) ); - expect(stdio.out).toBeEmpty(); - expect(stdio.err).toBeEmpty(); + expect(stdio.out).toBeEmptyString(); + expect(stdio.err).toBeEmptyString(); })); it("doesn't emit evaluation warnings", () => @@ -518,8 +525,8 @@ describe('options', () => { includePaths: [dir('dir')], }) ); - expect(stdio.out).toBeEmpty(); - expect(stdio.err).toBeEmpty(); + expect(stdio.out).toBeEmptyString(); + expect(stdio.err).toBeEmptyString(); })); }); }); @@ -547,7 +554,7 @@ describe('options', () => { verbose: true, }) ); - expect(stdio.out).toBeEmpty(); + expect(stdio.out).toBeEmptyString(); expect(stdio.err.match(/call\(\)/g)).toBeArrayOfSize(6); expect(stdio.err.match(/math\.div/g)).toBeArrayOfSize(6); }); @@ -558,7 +565,7 @@ describe('options', () => { data, }) ); - expect(stdio.out).toBeEmpty(); + expect(stdio.out).toBeEmptyString(); expect(stdio.err.match(/call\(\)/g)).toBeArrayOfSize(5); expect(stdio.err.match(/math\.div/g)).toBeArrayOfSize(5); }); @@ -569,18 +576,21 @@ describe('options', () => { it('emits to stderr by default', async () => { const stdio = await captureStdioAsync(async () => { await new Promise((resolve, reject) => { - sass.render({data: '@warn heck; @debug heck'}, (err, result) => { - if (err) { - reject(err); - } else { - resolve(result); + sass.render( + {data: '@warn heck; @debug heck'}, + (err?: sass.LegacyException, result?: sass.LegacyResult) => { + if (err) { + reject(err); + } else { + resolve(result); + } } - }); + ); }); }); - expect(stdio.out).toBeEmpty(); - expect(stdio.err).not.toBeEmpty(); + expect(stdio.out).toBeEmptyString(); + expect(stdio.err).not.toBeEmptyString(); }); it("doesn't emit to stderr with callbacks", async () => { @@ -590,15 +600,15 @@ describe('options', () => { { data: '@warn heck warn; @debug heck debug', logger: { - warn(message) { + warn(message: string) { expect(message).toBe('heck warn'); }, - debug(message) { + debug(message: string) { expect(message).toBe('heck debug'); }, }, }, - (err, result) => { + (err?: sass.LegacyException, result?: sass.LegacyResult) => { if (err) { reject(err); } else { @@ -609,8 +619,8 @@ describe('options', () => { }); }); - expect(stdio.out).toBeEmpty(); - expect(stdio.err).toBeEmpty(); + expect(stdio.out).toBeEmptyString(); + expect(stdio.err).toBeEmptyString(); }); }); }); @@ -648,7 +658,7 @@ describe('the result object', () => { it("doesn't contain the root path with a data: parameter", () => expect( sass.renderSync({data: 'a {b: c}'}).stats.includedFiles - ).toBeEmpty()); + ).toBeEmptyArray()); it('contains imported paths', () => sandbox(dir => { @@ -671,7 +681,7 @@ describe('the result object', () => { sass .renderSync({file: dir('test.scss')}) .stats.includedFiles.filter( - path => path === p.resolve(dir('_other.scss')) + (path: string) => path === p.resolve(dir('_other.scss')) ) ).toBeArrayOfSize(1); })); diff --git a/js-api-spec/legacy/source-map.test.ts b/js-api-spec/legacy/source-map.node.test.ts similarity index 85% rename from js-api-spec/legacy/source-map.test.ts rename to js-api-spec/legacy/source-map.node.test.ts index b6f56c59a5..b8429a725e 100644 --- a/js-api-spec/legacy/source-map.test.ts +++ b/js-api-spec/legacy/source-map.node.test.ts @@ -8,7 +8,6 @@ import * as p from 'path'; import * as sass from 'sass'; import {sandbox} from '../sandbox'; -import '../utils'; describe('a basic invocation', () => { let css: string; @@ -24,15 +23,15 @@ describe('a basic invocation', () => { }); it('includes reasonable-looking mappings', () => { - expect(map).toContainKey('mappings'); + expect(map).toHaveMember('mappings'); expect(map['mappings']).toMatch(/^([A-Za-z\d+/=]*[,;]?)*$/); }); it('includes the name of the output file', () => - expect(map).toContainEntry(['file', 'out.css'])); + expect(map.file).toEqual('out.css')); it('includes stdin as a source', () => - expect(map).toContainEntry(['sources', ['stdin']])); + expect(map.sources).toEqual(['stdin'])); it('includes a source map comment', () => expect(css).toEndWith('\n\n/*# sourceMappingURL=out.css.map */')); @@ -48,7 +47,7 @@ describe('the sources list', () => { sourceMap: true, outFile: dir('out.css'), }); - expect(map).toContainEntry(['sources', ['test.scss']]); + expect(map.sources).toEqual(['test.scss']); })); it('makes the path relative to outFile', () => @@ -60,9 +59,8 @@ describe('the sources list', () => { sourceMap: true, outFile: dir('dir/out.css'), }); - expect(map).toContainEntry([ - 'sources', - [p.relative(dir('dir'), dir('test.scss')).replace(/\\/g, '/')], + expect(map.sources).toEqual([ + p.relative(dir('dir'), dir('test.scss')).replace(/\\/g, '/'), ]); })); @@ -81,7 +79,7 @@ describe('the sources list', () => { sourceMap: true, outFile: dir('out.css'), }); - expect(map).toContainEntry(['sources', ['_other.scss', 'test.scss']]); + expect(map.sources).toEqual(['_other.scss', 'test.scss']); })); it('contains the resolved path of a file imported via includePaths', () => @@ -100,10 +98,7 @@ describe('the sources list', () => { includePaths: [dir('subdir')], outFile: dir('out.css'), }); - expect(map).toContainEntry([ - 'sources', - ['subdir/_other.scss', 'test.scss'], - ]); + expect(map.sources).toEqual(['subdir/_other.scss', 'test.scss']); })); it('contains a URL handled by an importer', () => { @@ -116,7 +111,7 @@ describe('the sources list', () => { importer: () => ({contents: 'x {y: z}'}), outFile: 'out.css', }); - expect(map).toContainEntry(['sources', ['other', 'stdin']]); + expect(map.sources).toEqual(['other', 'stdin']); }); // Regression test for the embedded host. @@ -137,10 +132,7 @@ describe('the sources list', () => { outFile: dir('out.css'), importer: () => null, }); - expect(map).toContainEntry([ - 'sources', - ['subdir/_other.scss', 'test.scss'], - ]); + expect(map.sources).toEqual(['subdir/_other.scss', 'test.scss']); })); }); @@ -171,8 +163,8 @@ describe("doesn't emit the source map", () => { describe('with a string sourceMap and no outFile', () => { it('emits a source map', () => expect( - renderSourceMap({data: 'a {b: c}', sourceMap: 'out.css.map'}) - ).toContainEntry(['sources', ['stdin']])); + renderSourceMap({data: 'a {b: c}', sourceMap: 'out.css.map'}).sources + ).toEqual(['stdin'])); it('derives the target URL from the input file', () => sandbox(dir => { @@ -182,8 +174,8 @@ describe('with a string sourceMap and no outFile', () => { renderSourceMap({ file: dir('test.scss'), sourceMap: 'out.css.map', - }) - ).toContainEntry(['file', pathToFileURL(dir('test.css')).toString()]); + }).file + ).toEqual(pathToFileURL(dir('test.css')).toString()); })); it('derives the target URL from the input file without an extension', () => @@ -194,14 +186,14 @@ describe('with a string sourceMap and no outFile', () => { renderSourceMap({ file: dir('test'), sourceMap: 'out.css.map', - }) - ).toContainEntry(['file', pathToFileURL(dir('test.css')).toString()]); + }).file + ).toEqual(pathToFileURL(dir('test.css')).toString()); })); it('derives the target URL from stdin', () => expect( - renderSourceMap({data: 'a {b: c}', sourceMap: 'out.css.map'}) - ).toContainEntry(['file', 'stdin.css'])); + renderSourceMap({data: 'a {b: c}', sourceMap: 'out.css.map'}).file + ).toEqual('stdin.css')); // Regression test for sass/dart-sass#922 it('contains a URL handled by an importer when sourceMap is absolute', () => @@ -214,8 +206,8 @@ describe('with a string sourceMap and no outFile', () => { importer: () => ({contents: 'x {y: z}'}), sourceMap: p.resolve('out.css.map'), outFile: 'out.css', - }) - ).toContainEntry(['sources', ['other', 'stdin']])); + }).sources + ).toEqual(['other', 'stdin'])); }); it("with omitSourceMapUrl, doesn't include a source map comment", () => { @@ -258,8 +250,8 @@ describe('with a string sourceMap', () => { data: 'a {b: c}', sourceMap: 'dir/map', outFile: 'out.css', - }) - ).toContainEntry(['file', '../out.css'])); + }).file + ).toEqual('../out.css')); it('makes the source map comment relative even if the path is absolute', () => { const result = sass.renderSync({ @@ -280,8 +272,8 @@ describe('with a string sourceMap', () => { file: dir('test.scss'), sourceMap: dir('map'), outFile: 'out.css', - }) - ).toContainEntry(['sources', ['test.scss']]); + }).sources + ).toEqual(['test.scss']); })); }); @@ -293,8 +285,8 @@ describe('with sourceMapContents', () => { sourceMap: true, outFile: 'out.css', sourceMapContents: true, - }) - ).toContainEntry(['sourcesContent', ['a {b: c}']])); + }).sourcesContent + ).toEqual(['a {b: c}'])); it("includes an imported file's contents in the source map", () => sandbox(dir => { @@ -310,8 +302,8 @@ describe('with sourceMapContents', () => { sourceMap: true, outFile: 'out.css', sourceMapContents: true, - }) - ).toContainEntry(['sourcesContent', ['x {y: z}', scss]]); + }).sourcesContent + ).toEqual(['x {y: z}', scss]); })); }); @@ -335,8 +327,8 @@ describe('with sourceMapRoot', () => { sourceMap: true, outFile: 'out.css', sourceMapRoot: 'some random string', - }) - ).toContainEntry(['sourceRoot', 'some random string'])); + }).sourceRoot + ).toEqual('some random string')); it("doesn't modify the source URLs", () => sandbox(dir => { @@ -349,8 +341,8 @@ describe('with sourceMapRoot', () => { outFile: dir('out.css'), sourceMapRoot: root, }); - expect(map).toContainEntry(['sourceRoot', root]); - expect(map).toContainEntry(['sources', ['test.scss']]); + expect(map.sourceRoot).toEqual(root); + expect(map.sources).toEqual(['test.scss']); })); }); diff --git a/js-api-spec/legacy/value/boolean.test.ts b/js-api-spec/legacy/value/boolean.node.test.ts similarity index 100% rename from js-api-spec/legacy/value/boolean.test.ts rename to js-api-spec/legacy/value/boolean.node.test.ts diff --git a/js-api-spec/legacy/value/color.test.ts b/js-api-spec/legacy/value/color.node.test.ts similarity index 96% rename from js-api-spec/legacy/value/color.test.ts rename to js-api-spec/legacy/value/color.node.test.ts index f25ac03bcd..5c82e98433 100644 --- a/js-api-spec/legacy/value/color.test.ts +++ b/js-api-spec/legacy/value/color.node.test.ts @@ -4,7 +4,6 @@ import * as sass from 'sass'; -import '../../utils'; import {parseValue} from './utils'; describe('from a parameter', () => { @@ -32,8 +31,7 @@ describe('from a parameter', () => { } `, functions: { - 'foo($color)': arg => { - const color = arg as sass.types.Color; + 'foo($color)': ((color: sass.types.Color) => { color.setR(11); expect(color.getR()).toBe(11); color.setG(22); @@ -43,7 +41,7 @@ describe('from a parameter', () => { color.setA(0.5); expect(color.getA()).toBe(0.5); return color; - }, + }) as sass.LegacySyncFunction, }, }) .css.toString() diff --git a/js-api-spec/legacy/value/list.test.ts b/js-api-spec/legacy/value/list.node.test.ts similarity index 93% rename from js-api-spec/legacy/value/list.test.ts rename to js-api-spec/legacy/value/list.node.test.ts index e1c020791d..3987f066ac 100644 --- a/js-api-spec/legacy/value/list.test.ts +++ b/js-api-spec/legacy/value/list.node.test.ts @@ -4,7 +4,6 @@ import * as sass from 'sass'; -import '../../utils'; import {parseValue} from './utils'; describe('an argument list', () => { @@ -13,10 +12,10 @@ describe('an argument list', () => { sass.renderSync({ data: "a {b: foo(1, 'a', blue)}", functions: { - 'foo($args...)': args_ => { - args = args_ as sass.types.List; + 'foo($args...)': ((args_: sass.types.List) => { + args = args_; return sass.types.Null.NULL; - }, + }) as sass.LegacySyncFunction, }, }) ); @@ -70,12 +69,11 @@ describe('a list', () => { } `, functions: { - 'foo($list)': arg => { - const list = arg as sass.types.List; + 'foo($list)': ((list: sass.types.List) => { list.setValue(1, sass.types.Null.NULL); expect(list.getValue(1)).toBe(sass.types.Null.NULL); return list; - }, + }) as sass.LegacySyncFunction, }, }) .css.toString() @@ -93,12 +91,11 @@ describe('a list', () => { } `, functions: { - 'foo($list)': arg => { - const list = arg as sass.types.List; + 'foo($list)': ((list: sass.types.List) => { list.setSeparator(true); expect(list.getSeparator()).toBeTrue(); return list; - }, + }) as sass.LegacySyncFunction, }, }) .css.toString() diff --git a/js-api-spec/legacy/value/map.test.ts b/js-api-spec/legacy/value/map.node.test.ts similarity index 94% rename from js-api-spec/legacy/value/map.test.ts rename to js-api-spec/legacy/value/map.node.test.ts index af104aceea..769bbdd80c 100644 --- a/js-api-spec/legacy/value/map.test.ts +++ b/js-api-spec/legacy/value/map.node.test.ts @@ -4,7 +4,6 @@ import * as sass from 'sass'; -import '../../utils'; import {parseValue} from './utils'; describe('from a parameter', () => { @@ -49,12 +48,11 @@ describe('from a parameter', () => { } `, functions: { - 'foo($map)': arg => { - const map = arg as sass.types.Map; + 'foo($map)': ((map: sass.types.Map) => { map.setValue(1, new sass.types.Number(1)); expect((map.getValue(1) as sass.types.Number).getValue()).toBe(1); return map; - }, + }) as sass.LegacySyncFunction, }, }) .css.toString() @@ -72,12 +70,11 @@ describe('from a parameter', () => { } `, functions: { - 'foo($map)': arg => { - const map = arg as sass.types.Map; + 'foo($map)': ((map: sass.types.Map) => { map.setKey(1, new sass.types.Number(1)); expect((map.getKey(1) as sass.types.Number).getValue()).toBe(1); return map; - }, + }) as sass.LegacySyncFunction, }, }) .css.toString() diff --git a/js-api-spec/legacy/value/null.test.ts b/js-api-spec/legacy/value/null.node.test.ts similarity index 100% rename from js-api-spec/legacy/value/null.test.ts rename to js-api-spec/legacy/value/null.node.test.ts diff --git a/js-api-spec/legacy/value/number.test.ts b/js-api-spec/legacy/value/number.node.test.ts similarity index 86% rename from js-api-spec/legacy/value/number.test.ts rename to js-api-spec/legacy/value/number.node.test.ts index ce99c6a272..5afc60eeed 100644 --- a/js-api-spec/legacy/value/number.test.ts +++ b/js-api-spec/legacy/value/number.node.test.ts @@ -4,7 +4,6 @@ import * as sass from 'sass'; -import '../../utils'; import {parseValue} from './utils'; describe('from a parameter', () => { @@ -19,7 +18,7 @@ describe('from a parameter', () => { }); it('a unitless number returns the empty string', () => - expect(parseValue('1', sass.types.Number).getUnit()).toBeEmpty()); + expect(parseValue('1', sass.types.Number).getUnit()).toBeEmptyString()); it('a complex unit number returns its full units', () => expect( @@ -41,13 +40,12 @@ describe('from a parameter', () => { } `, functions: { - 'foo($number)': arg => { - const number = arg as sass.types.Number; + 'foo($number)': (number: sass.types.Number) => { number.setValue(42); expect(number.getValue()).toBe(42); return number; }, - }, + } as Record, }) .css.toString() ).toEqualIgnoringWhitespace('a { b: 42px; c: 1px; }')); @@ -64,13 +62,12 @@ describe('from a parameter', () => { } `, functions: { - 'foo($number)': arg => { - const number = arg as sass.types.Number; + 'foo($number)': (number: sass.types.Number) => { number.setUnit('em'); expect(number.getUnit()).toBe('em'); return number; }, - }, + } as Record, }) .css.toString() ).toEqualIgnoringWhitespace('a { b: 1em; c: 1px; }')); @@ -81,13 +78,12 @@ describe('from a parameter', () => { .renderSync({ data: 'a {b: calc(foo(1)*1ms*1dpi/1rad)}', functions: { - 'foo($number)': arg => { - const number = arg as sass.types.Number; + 'foo($number)': (number: sass.types.Number) => { number.setUnit('px*rad/ms*dpi'); expect(number.getUnit()).toBe('px*rad/ms*dpi'); return number; }, - }, + } as Record, }) .css.toString() ).toEqualIgnoringWhitespace('a { b: 1px; }')); @@ -98,13 +94,12 @@ describe('from a parameter', () => { .renderSync({ data: 'a {b: foo(1)*1em}', functions: { - 'foo($number)': arg => { - const number = arg as sass.types.Number; + 'foo($number)': (number: sass.types.Number) => { number.setUnit('/em'); expect(number.getUnit()).toBe('/em'); return number; }, - }, + } as Record, }) .css.toString() ).toEqualIgnoringWhitespace('a { b: 1; }')); @@ -115,13 +110,12 @@ describe('from a parameter', () => { .renderSync({ data: 'a {b: unitless(foo(1px))}', functions: { - 'foo($number)': arg => { - const number = arg as sass.types.Number; + 'foo($number)': (number: sass.types.Number) => { number.setUnit(''); - expect(number.getUnit()).toBeEmpty(); + expect(number.getUnit()).toBeEmptyString(); return number; }, - }, + } as Record, }) .css.toString() ).toEqualIgnoringWhitespace('a { b: true; }')); @@ -148,7 +142,7 @@ describe('from a constructor', () => { }); it('defaults to no unit', () => - expect(new sass.types.Number(123).getUnit()).toBeEmpty()); + expect(new sass.types.Number(123).getUnit()).toBeEmptyString()); it('allows complex units', () => expect( diff --git a/js-api-spec/legacy/value/string.test.ts b/js-api-spec/legacy/value/string.node.test.ts similarity index 90% rename from js-api-spec/legacy/value/string.test.ts rename to js-api-spec/legacy/value/string.node.test.ts index 6b31a0cccd..209ca9e47d 100644 --- a/js-api-spec/legacy/value/string.test.ts +++ b/js-api-spec/legacy/value/string.node.test.ts @@ -29,13 +29,12 @@ describe('from a parameter', () => { } `, functions: { - 'foo($string)': arg => { - const string = arg as sass.types.String; + 'foo($string)': (string: sass.types.String) => { string.setValue('bar'); expect(string.getValue()).toBe('bar'); return string; }, - }, + } as Record, }) .css.toString() ).toEqualIgnoringWhitespace('a { b: bar; c: foo; }')); @@ -46,13 +45,12 @@ describe('from a parameter', () => { .renderSync({ data: 'a {b: foo("foo")}', functions: { - 'foo($string)': arg => { - const string = arg as sass.types.String; + 'foo($string)': (string: sass.types.String) => { string.setValue('bar'); expect(string.getValue()).toBe('bar'); return string; }, - }, + } as Record, }) .css.toString() ).toEqualIgnoringWhitespace('a { b: bar; }')); diff --git a/js-api-spec/legacy/value/utils.ts b/js-api-spec/legacy/value/utils.ts index 60dd2d34f2..95ca96f61a 100644 --- a/js-api-spec/legacy/value/utils.ts +++ b/js-api-spec/legacy/value/utils.ts @@ -4,6 +4,8 @@ import * as sass from 'sass'; +import {spy} from '../../utils'; + /** * Parses `source` as a Sass expression, asserts that it's an instance of * `constructor`, and returns it. @@ -15,8 +17,8 @@ export function parseValue any>( ): InstanceType { let value: InstanceType | undefined; - const fn = jest.fn(value_ => { - value = value_ as InstanceType; + const fn = spy((value_: InstanceType) => { + value = value_; return sass.types.Null.NULL; }); diff --git a/js-api-spec/logger.node.test.ts b/js-api-spec/logger.node.test.ts new file mode 100644 index 0000000000..e5fdd9d549 --- /dev/null +++ b/js-api-spec/logger.node.test.ts @@ -0,0 +1,74 @@ +// Copyright 2023 Google Inc. Use of this source code is governed by an +// MIT-style license that can be found in the LICENSE file or at +// https://opensource.org/licenses/MIT. + +import {compile, compileAsync} from 'sass'; + +import {sandbox} from './sandbox'; +import {captureStdio, captureStdioAsync} from './utils'; + +describe('compile', () => { + it('emits to stderr by default', () => + sandbox(dir => { + dir.write({'style.scss': '@warn heck; @debug heck'}); + + const stdio = captureStdio(() => { + compile(dir('style.scss')); + }); + expect(stdio.out).toBeEmptyString(); + expect(stdio.err).not.toBeEmptyString(); + })); + + it("doesn't emit to stderr with callbacks", () => + sandbox(dir => { + dir.write({'style.scss': '@warn heck warn; @debug heck debug'}); + + const stdio = captureStdio(() => { + compile(dir('style.scss'), { + logger: { + warn(message: string) { + expect(message).toBe('heck warn'); + }, + debug(message: string) { + expect(message).toBe('heck debug'); + }, + }, + }); + }); + expect(stdio.out).toBeEmptyString(); + expect(stdio.err).toBeEmptyString(); + })); +}); + +describe('compileAsync', () => { + it('emits to stderr by default', () => + sandbox(async dir => { + dir.write({'style.scss': '@warn heck; @debug heck'}); + + const stdio = await captureStdioAsync(async () => { + await compileAsync(dir('style.scss')); + }); + expect(stdio.out).toBeEmptyString(); + expect(stdio.err).not.toBeEmptyString(); + })); + + it("doesn't emit to stderr with callbacks", () => + sandbox(async dir => { + dir.write({'style.scss': '@warn heck warn; @debug heck debug'}); + + const stdio = await captureStdioAsync(async () => { + await compileAsync(dir('style.scss'), { + logger: { + warn(message: string) { + expect(message).toBe('heck warn'); + }, + debug(message: string) { + expect(message).toBe('heck debug'); + }, + }, + }); + }); + expect(stdio.out).toBeEmptyString(); + expect(stdio.err).toBeEmptyString(); + })); +}); diff --git a/js-api-spec/logger.test.ts b/js-api-spec/logger.test.ts index b8fb347328..2acd37ab4e 100644 --- a/js-api-spec/logger.test.ts +++ b/js-api-spec/logger.test.ts @@ -2,22 +2,16 @@ // MIT-style license that can be found in the LICENSE file or at // https://opensource.org/licenses/MIT. -import { - compile, - compileString, - compileAsync, - compileStringAsync, - Logger, -} from 'sass'; +import {compileString, compileStringAsync, Logger, SourceSpan} from 'sass'; -import {sandbox, captureStdio, captureStdioAsync} from './utils'; +import {captureStdio, captureStdioAsync} from './utils'; it('emits debug to stderr by default', () => { const stdio = captureStdio(() => { compileString('@debug heck'); }); - expect(stdio.out).toBeEmpty(); - expect(stdio.err).not.toBeEmpty(); + expect(stdio.out).toBe(''); + expect(stdio.err).not.toBe(''); }); describe('deprecation warning', () => { @@ -25,12 +19,12 @@ describe('deprecation warning', () => { it('passes the message and span to the logger', done => { compileString('* > { --foo: bar }', { logger: { - warn(message, {span}) { - expect(message).toInclude('only valid for nesting'); + warn(message: string, {span}: {span?: SourceSpan}) { + expect(message).toContain('only valid for nesting'); expect(span?.start.line).toBe(0); expect(span?.start.column).toBe(0); expect(span?.end.line).toBe(0); - expect(span?.end.column).toBe(4); + expect(span?.end.column).toBe(3); done(); }, }, @@ -47,7 +41,14 @@ describe('with @warn', () => { `, { logger: { - warn(message, {deprecation, span, stack}) { + warn( + message: string, + { + deprecation, + span, + stack, + }: {deprecation: boolean; span?: SourceSpan; stack?: string} + ) { expect(message).toBe('heck'); expect(span).toBeUndefined(); expect(stack).toBeString(); @@ -62,7 +63,7 @@ describe('with @warn', () => { it('stringifies the argument', done => { compileString('@warn #abc', { logger: { - warn(message) { + warn(message: string) { expect(message).toBe('#abc'); done(); }, @@ -73,7 +74,7 @@ describe('with @warn', () => { it("doesn't inspect the argument", done => { compileString('@warn null', { logger: { - warn(message) { + warn(message: string) { expect(message).toBe(''); done(); }, @@ -85,8 +86,8 @@ describe('with @warn', () => { const stdio = captureStdio(() => { compileString('@warn heck'); }); - expect(stdio.out).toBeEmpty(); - expect(stdio.err).not.toBeEmpty(); + expect(stdio.out).toBe(''); + expect(stdio.err).not.toBe(''); }); it("doesn't emit warnings with a warn callback", () => { @@ -95,8 +96,8 @@ describe('with @warn', () => { logger: {warn() {}}, }); }); - expect(stdio.out).toBeEmpty(); - expect(stdio.err).toBeEmpty(); + expect(stdio.out).toBe(''); + expect(stdio.err).toBe(''); }); it('still emits warning with only a debug callback', () => { @@ -105,16 +106,16 @@ describe('with @warn', () => { logger: {debug() {}}, }); }); - expect(stdio.out).toBeEmpty(); - expect(stdio.err).not.toBeEmpty(); + expect(stdio.out).toBe(''); + expect(stdio.err).not.toBe(''); }); it("doesn't emit warnings with Logger.silent", () => { const stdio = captureStdio(() => { compileString('@warn heck', {logger: Logger.silent}); }); - expect(stdio.out).toBeEmpty(); - expect(stdio.err).toBeEmpty(); + expect(stdio.out).toBe(''); + expect(stdio.err).toBe(''); }); }); @@ -122,12 +123,12 @@ describe('with @debug', () => { it('passes the message and span to the logger', done => { compileString('@debug heck', { logger: { - debug(message, {span}) { + debug(message: string, {span}: {span?: SourceSpan}) { expect(message).toBe('heck'); - expect(span.start.line).toBe(0); - expect(span.start.column).toBe(0); - expect(span.end.line).toBe(0); - expect(span.end.column).toBe(11); + expect(span?.start.line).toBe(0); + expect(span?.start.column).toBe(0); + expect(span?.end.line).toBe(0); + expect(span?.end.column).toBe(11); done(); }, }, @@ -137,7 +138,7 @@ describe('with @debug', () => { it('stringifies the argument', done => { compileString('@debug #abc', { logger: { - debug(message) { + debug(message: string) { expect(message).toBe('#abc'); done(); }, @@ -148,7 +149,7 @@ describe('with @debug', () => { it('inspects the argument', done => { compileString('@debug null', { logger: { - debug(message) { + debug(message: string) { expect(message).toBe('null'); done(); }, @@ -160,8 +161,8 @@ describe('with @debug', () => { const stdio = captureStdio(() => { compileString('@debug heck'); }); - expect(stdio.out).toBeEmpty(); - expect(stdio.err).not.toBeEmpty(); + expect(stdio.out).toBe(''); + expect(stdio.err).not.toBe(''); }); it("doesn't emit debugs with a debug callback", () => { @@ -170,8 +171,8 @@ describe('with @debug', () => { logger: {debug() {}}, }); }); - expect(stdio.out).toBeEmpty(); - expect(stdio.err).toBeEmpty(); + expect(stdio.out).toBe(''); + expect(stdio.err).toBe(''); }); it('still emits debugs with only a warn callback', () => { @@ -180,108 +181,42 @@ describe('with @debug', () => { logger: {warn() {}}, }); }); - expect(stdio.out).toBeEmpty(); - expect(stdio.err).not.toBeEmpty(); + expect(stdio.out).toBe(''); + expect(stdio.err).not.toBe(''); }); it("doesn't emit debugs with Logger.silent", () => { const stdio = captureStdio(() => { compileString('@debug heck', {logger: Logger.silent}); }); - expect(stdio.out).toBeEmpty(); - expect(stdio.err).toBeEmpty(); + expect(stdio.out).toBe(''); + expect(stdio.err).toBe(''); }); }); -describe('compile', () => { - it('emits to stderr by default', () => - sandbox(dir => { - dir.write({'style.scss': '@warn heck; @debug heck'}); - - const stdio = captureStdio(() => { - compile(dir('style.scss')); - }); - expect(stdio.out).toBeEmpty(); - expect(stdio.err).not.toBeEmpty(); - })); - - it("doesn't emit to stderr with callbacks", () => - sandbox(dir => { - dir.write({'style.scss': '@warn heck warn; @debug heck debug'}); - - const stdio = captureStdio(() => { - compile(dir('style.scss'), { - logger: { - warn(message) { - expect(message).toBe('heck warn'); - }, - debug(message) { - expect(message).toBe('heck debug'); - }, - }, - }); - }); - expect(stdio.out).toBeEmpty(); - expect(stdio.err).toBeEmpty(); - })); -}); - describe('compileStringAsync', () => { it('emits to stderr by default', async () => { const stdio = await captureStdioAsync(async () => { await compileStringAsync('@warn heck; @debug heck'); }); - expect(stdio.out).toBeEmpty(); - expect(stdio.err).not.toBeEmpty(); + expect(stdio.out).toBe(''); + expect(stdio.err).not.toBe(''); }); it("doesn't emit to stderr with callbacks", async () => { const stdio = await captureStdioAsync(async () => { await compileStringAsync('@warn heck warn; @debug heck debug', { logger: { - warn(message) { + warn(message: string) { expect(message).toBe('heck warn'); }, - debug(message) { + debug(message: string) { expect(message).toBe('heck debug'); }, }, }); }); - expect(stdio.out).toBeEmpty(); - expect(stdio.err).toBeEmpty(); + expect(stdio.out).toBe(''); + expect(stdio.err).toBe(''); }); }); - -describe('compileAsync', () => { - it('emits to stderr by default', () => - sandbox(async dir => { - dir.write({'style.scss': '@warn heck; @debug heck'}); - - const stdio = await captureStdioAsync(async () => { - await compileAsync(dir('style.scss')); - }); - expect(stdio.out).toBeEmpty(); - expect(stdio.err).not.toBeEmpty(); - })); - - it("doesn't emit to stderr with callbacks", () => - sandbox(async dir => { - dir.write({'style.scss': '@warn heck warn; @debug heck debug'}); - - const stdio = await captureStdioAsync(async () => { - await compileAsync(dir('style.scss'), { - logger: { - warn(message) { - expect(message).toBe('heck warn'); - }, - debug(message) { - expect(message).toBe('heck debug'); - }, - }, - }); - }); - expect(stdio.out).toBeEmpty(); - expect(stdio.err).toBeEmpty(); - })); -}); diff --git a/js-api-spec/setup.ts b/js-api-spec/setup.ts new file mode 100644 index 0000000000..9f5bd41956 --- /dev/null +++ b/js-api-spec/setup.ts @@ -0,0 +1,415 @@ +// Copyright 2023 Google Inc. Use of this source code is governed by an +// MIT-style license that can be found in the LICENSE file or at +// https://opensource.org/licenses/MIT. + +import immutable from 'immutable'; +import * as sass from 'sass'; +import * as util from 'util'; +import type {URL} from 'url'; +import 'jasmine-expect'; + +declare global { + /* eslint-disable-next-line @typescript-eslint/no-namespace */ + namespace jasmine { + interface Matchers { + /** + * Matches a callback that throws a `sass.Exception`. + * + * If `line` is passed, asserts that the exception has a span that starts + * on that line. + * + * If `url` is passed, asserts that the exception has a span with the + * given URL. + * + * If `includes` is passed, asserts that the exception's `sassMessage` + * contains the given `includes` string. + */ + toThrowSassException(object?: { + line?: number; + url?: string | URL; + includes?: string; + }): T; + + /** + * Matches a callback that throws a `sass.Exception` with a span that has + * no URL. + */ + toThrowSassException(object: {line?: number; noUrl: boolean}): T; + + /** + * Matches a callback that throws a `sass.LegacyException` with with the + * given `line` number and `file` path. + * + * If `includes` is passed, this verifies that the exception's + * `toString()` includes that value. + */ + toThrowLegacyException(object?: { + line?: number; + file?: string; + includes?: string; + }): T; + + /** + * Matches a value that's `.equal()` to and has the same `.hashCode()` as + * `value`. + */ + toEqualWithHash(value: immutable.ValueObject): T; + + /** + * Matches a value that's `null` or `undefined`. + */ + toBeNil(): T; + + /** + * Matches a value that's equal (`===`) to `value` ignoring whitespace. + */ + toEqualIgnoringWhitespace(value: string): T; + } + + // eslint-disable-next-line @typescript-eslint/no-unused-vars + interface AsyncMatchers { + /** + * Matches a callback that throws a `sass.Exception`. + * + * If `line` is passed, asserts that the exception has a span that starts + * on that line. + * + * If `url` is passed, asserts that the exception has a span with the + * given URL. + * + * If `includes` is passed, asserts that the exception's `sassMessage` + * contains the given `includes` string. + */ + toThrowSassException(object?: { + line?: number; + url?: string | URL; + includes?: string; + }): PromiseLike; + + /** + * Matches a callback that throws a `sass.Exception` with a span that has + * no URL. + */ + toThrowSassException(object: { + line?: number; + noUrl: boolean; + }): PromiseLike; + } + } +} + +interface ToThrowSassExceptionOptions { + line?: number; + url?: string | URL; + noUrl?: boolean; + includes?: string; +} + +const toThrowSassException = ( + received: unknown, + options: ToThrowSassExceptionOptions = {} +) => { + if (typeof received !== 'function') { + throw new Error('Received value must be a function'); + } + + try { + received(); + } catch (thrown: unknown) { + return verifyThrown(thrown, options); + } + + return { + message: `expected ${received} to throw`, + pass: false, + }; +}; + +const toThrowSassExceptionAsync = ( + received: unknown, + options: ToThrowSassExceptionOptions = {} +) => { + if (typeof received !== 'function') { + throw new Error('Received value must be a function'); + } + + try { + const result = received(); + return result.then( + () => ({ + message: `expected ${received} to throw`, + pass: false, + }), + (thrown: unknown) => verifyThrown(thrown, options) + ); + } catch (thrown: unknown) { + return verifyThrown(thrown, options); + } +}; + +const toThrowLegacyException = ( + received: unknown, + options: {line?: number; file?: string; includes?: string} = {} +) => { + if (typeof received !== 'function') { + throw new Error('Received value must be a function'); + } + + try { + received(); + } catch (thrown: unknown) { + if (typeof thrown !== 'object' || thrown === null) { + return { + message: `expected ${thrown} to be an object`, + pass: false, + }; + } else if (!('formatted' in thrown)) { + return { + message: `expected ${thrown} to have a 'formatted' field`, + pass: false, + }; + } else if (!('status' in thrown)) { + return { + message: `expected ${thrown} to have a 'status' field`, + pass: false, + }; + } + + if (options?.line !== undefined) { + if (!('line' in thrown)) { + return { + message: `expected ${thrown} to have a 'line' field`, + pass: false, + }; + } else if ((thrown as {line: unknown}).line !== options.line) { + return { + message: + `expected exception.line to be ${options.line}, was ` + + `${(thrown as {line: unknown}).line}`, + pass: false, + }; + } + } + + if (options?.file !== undefined) { + if (!('file' in thrown)) { + return { + message: `expected ${thrown} to have a 'file' field`, + pass: false, + }; + } else if ((thrown as {file: unknown}).file !== options.file) { + return { + message: + `expected exception.file to be "${options.file}", was ` + + `"${(thrown as {file: unknown}).file}"`, + pass: false, + }; + } + } + + if ( + options?.includes !== undefined && + !`${thrown}`.includes(options.includes) + ) { + return { + message: + `expected exception.toString() to contain "${options.includes}", ` + + `was "${thrown}"`, + pass: false, + }; + } + + if (options?.line !== undefined) { + return { + message: `expected exception.line not to be ${options.line}`, + pass: true, + }; + } else if (options?.file !== undefined) { + return { + message: `expected exception.file not to be "${options.file}"`, + pass: true, + }; + } else if (options?.includes !== undefined) { + return { + message: + 'expected exception.toString() not to contain ' + + `"${options.includes}"`, + pass: true, + }; + } else { + return { + message: 'expected callback not to throw a LegacyException', + pass: true, + }; + } + } + + return { + message: `expected ${received} to throw`, + pass: false, + }; +}; + +const toEqualWithHash = (received: unknown, actual: immutable.ValueObject) => { + if (typeof received !== 'object' || received === null) { + return { + message: `expected ${util.inspect(received)} to be an object`, + pass: false, + }; + } else if ( + !('equals' in received) || + typeof (received as {equals: unknown}).equals !== 'function' + ) { + return { + message: `expected ${util.inspect(received)} to have an "equals" method`, + pass: false, + }; + } else if ( + !('hashCode' in received) || + typeof (received as {hashCode: unknown}).hashCode !== 'function' + ) { + return { + message: `expected ${util.inspect(received)} to have a "hashCode" method`, + pass: false, + }; + } + + const receivedValue = received as immutable.ValueObject; + if (!receivedValue.equals(actual)) { + return { + message: `expected ${received} to be .equal() to ${actual}`, + pass: false, + }; + } else if (receivedValue.hashCode() !== actual.hashCode()) { + return { + message: `expected ${received} to have the same .hashCode() as ${actual}`, + pass: false, + }; + } else { + return { + message: `expected ${received} not to be .equal() to ${actual}`, + pass: true, + }; + } +}; + +const toBeNil = (received: unknown) => { + return { + message: `expected ${received} to be null or undefined`, + pass: received === null || received === undefined, + }; +}; + +const removeWhitespace = (str: string) => str.trim().replace(/\s+/g, ''); + +const toEqualIgnoringWhitespace = (received: unknown, actual: string) => { + if (typeof received !== 'string') { + throw new Error('Received value must be a string'); + } + return { + message: `expected ${received} to equal ${actual} ignoring whitespace`, + pass: removeWhitespace(actual) === removeWhitespace(received), + }; +}; + +// Add custom matchers to Jasmine +beforeAll(() => { + jasmine.addMatchers({ + toThrowSassException: () => ({ + compare: toThrowSassException, + }), + toThrowLegacyException: () => ({ + compare: toThrowLegacyException, + }), + toEqualWithHash: () => ({ + compare: toEqualWithHash, + }), + toBeNil: () => ({ + compare: toBeNil, + }), + toEqualIgnoringWhitespace: () => ({ + compare: toEqualIgnoringWhitespace, + }), + }); + jasmine.addAsyncMatchers({ + toThrowSassException: () => ({ + compare: toThrowSassExceptionAsync, + }), + }); +}); + +function isSassException(thrown: unknown): thrown is sass.Exception { + return thrown instanceof sass.Exception; +} + +/** + * Verifies that `thrown` matches the expectation of a `toThrowSassException` + * call. + */ +function verifyThrown( + thrown: unknown, + {line, url, noUrl, includes}: ToThrowSassExceptionOptions +) { + if (!isSassException(thrown)) { + return { + message: `expected ${thrown} to be a sass.Exception`, + pass: false, + }; + } else if (url && thrown.span.url?.toString() !== url.toString()) { + return { + message: `expected ${url}, was ${thrown.span.url}:\n${thrown}`, + pass: false, + }; + } else if (noUrl && thrown.span.url) { + return { + message: `expected no URL:\n${thrown}`, + pass: false, + }; + } else if (line !== undefined && thrown.span.start?.line !== line) { + return { + message: + `expected to start on line ${line}, was ` + + `${thrown.span.start?.line}:\n` + + `${thrown}`, + pass: false, + }; + } else if (!thrown.sassMessage) { + return { + message: `expected a sassMessage field:\n${thrown}`, + pass: false, + }; + } else if (includes && !thrown.sassMessage.includes(includes)) { + return { + message: + `expected sassMessage to contain ${includes}, was ` + + `${thrown.sassMessage}:\n` + + `${thrown}`, + pass: false, + }; + } else if (!thrown.sassStack) { + return { + message: `expected a sassStack field:\n${thrown}`, + pass: false, + }; + } else if (url) { + return { + message: `expected not ${url}:\n${thrown}`, + pass: true, + }; + } else if (noUrl) { + return { + message: `expected a URL:\n${thrown}`, + pass: true, + }; + } else if (line !== undefined) { + return { + message: `expected not to start on line ${line}:\n${thrown}`, + pass: true, + }; + } else { + return { + message: `expected not to throw a sass.Exception:\n${thrown}`, + pass: true, + }; + } +} diff --git a/js-api-spec/tsconfig.json b/js-api-spec/tsconfig.json new file mode 100644 index 0000000000..0042d942a6 --- /dev/null +++ b/js-api-spec/tsconfig.json @@ -0,0 +1,7 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "types": ["jasmine", "node", "jasmine-expect"] + }, + "include": ["./**/*.ts"] +} diff --git a/js-api-spec/utils.ts b/js-api-spec/utils.ts index 939b9b81de..a75da896c3 100644 --- a/js-api-spec/utils.ts +++ b/js-api-spec/utils.ts @@ -2,380 +2,65 @@ // MIT-style license that can be found in the LICENSE file or at // https://opensource.org/licenses/MIT. -import 'jest-extended'; -import * as immutable from 'immutable'; -import * as sass from 'sass'; -import * as util from 'util'; -import interceptStdout from 'intercept-stdout'; -import {Console} from 'console'; -import {URL} from 'url'; +/* eslint-disable @typescript-eslint/no-explicit-any */ -export {sandbox} from './sandbox'; +import {info} from 'sass'; -/** The name of the implementation of Sass being tested. */ -export const sassImpl = sass.info.split('\t')[0] as - | 'dart-sass' - | 'sass-embedded'; - -declare global { - /* eslint-disable-next-line @typescript-eslint/no-namespace */ - namespace jest { - interface Matchers { - /** - * Matches a callback that throws a `sass.Exception`. - * - * If `line` is passed, asserts that the exception has a span that starts - * on that line. - * - * If `url` is passed, asserts that the exception has a span with the - * given URL. - * - * If `includes` is passed, asserts that the exception's `sassMessage` - * contains the given `includes` string. - */ - toThrowSassException(object?: { - line?: number; - url?: string | URL; - includes?: string; - }): R; - - /** - * Matches a callback that throws a `sass.Exception` with a span that has - * no URL. - */ - toThrowSassException(object: {line?: number; noUrl: boolean}): R; - - /** - * Matches a callback that throws a `sass.LegacyException` with with the - * given `line` number and `file` path. - * - * If `includes` is passed, this verifies that the exception's - * `toString()` includes that value. - */ - toThrowLegacyException(object?: { - line?: number; - file?: string; - includes?: string; - }): R; - - /** - * Matches a value that's `.equal()` to and has the same `.hashCode()` as - * `value`. - */ - toEqualWithHash(value: immutable.ValueObject): R; - } - } -} - -interface ToThrowSassExceptionOptions { - line?: number; - url?: string | URL; - noUrl?: boolean; - includes?: string; -} - -interface SyncExpectationResult { - pass: boolean; - message: () => string; -} - -expect.extend({ - toThrowSassException( - received: unknown, - options: ToThrowSassExceptionOptions = {} - ): SyncExpectationResult | Promise { - if (typeof received !== 'function') { - throw new Error('Received value must be a function'); - } - - try { - const result = received(); - if (result instanceof Promise) { - return result.then( - () => ({ - message: () => `expected ${received} to throw`, - pass: false, - }), - thrown => verifyThrown(thrown, options) - ); - } - } catch (thrown: unknown) { - return verifyThrown(thrown, options); - } - - return { - message: () => `expected ${received} to throw`, - pass: false, - }; - }, - - toThrowLegacyException( - received: unknown, - options: {line?: number; file?: string; includes?: string} = {} - ): SyncExpectationResult { - if (typeof received !== 'function') { - throw new Error('Received value must be a function'); - } - - try { - received(); - } catch (thrown: unknown) { - if (typeof thrown !== 'object' || thrown === null) { - return { - message: () => `expected ${thrown} to be an object`, - pass: false, - }; - } else if (!('formatted' in thrown)) { - return { - message: () => `expected ${thrown} to have a 'formatted' field`, - pass: false, - }; - } else if (!('status' in thrown)) { - return { - message: () => `expected ${thrown} to have a 'status' field`, - pass: false, - }; - } - - if (options?.line !== undefined) { - if (!('line' in thrown)) { - return { - message: () => `expected ${thrown} to have a 'line' field`, - pass: false, - }; - } else if ((thrown as {line: unknown}).line !== options.line) { - return { - message: () => - `expected exception.line to be ${options.line}, was ` + - `${(thrown as {line: unknown}).line}`, - pass: false, - }; - } - } - - if (options?.file !== undefined) { - if (!('file' in thrown)) { - return { - message: () => `expected ${thrown} to have a 'file' field`, - pass: false, - }; - } else if ((thrown as {file: unknown}).file !== options.file) { - return { - message: () => - `expected exception.file to be "${options.file}", was ` + - `"${(thrown as {file: unknown}).file}"`, - pass: false, - }; - } - } - - if ( - options?.includes !== undefined && - !`${thrown}`.includes(options.includes) - ) { - return { - message: () => - `expected exception.toString() to contain "${options.includes}", ` + - `was "${thrown}"`, - pass: false, - }; - } - - if (options?.line !== undefined) { - return { - message: () => `expected exception.line not to be ${options.line}`, - pass: true, - }; - } else if (options?.file !== undefined) { - return { - message: () => `expected exception.file not to be "${options.file}"`, - pass: true, - }; - } else if (options?.includes !== undefined) { - return { - message: () => - 'expected exception.toString() not to contain ' + - `"${options.includes}"`, - pass: true, - }; - } else { - return { - message: () => 'expected callback not to throw a LegacyException', - pass: true, - }; - } - } +/* Whether the tests are running in a browser context. */ +export const isBrowser = !global.process; - return { - message: () => `expected ${received} to throw`, - pass: false, - }; - }, - - toEqualWithHash( - received: unknown, - actual: immutable.ValueObject - ): SyncExpectationResult { - if (typeof received !== 'object' || received === null) { - return { - message: () => `expected ${util.inspect(received)} to be an object`, - pass: false, - }; - } else if ( - !('equals' in received) || - typeof (received as {equals: unknown}).equals !== 'function' - ) { - return { - message: () => - `expected ${util.inspect(received)} to have an "equals" method`, - pass: false, - }; - } else if ( - !('hashCode' in received) || - typeof (received as {hashCode: unknown}).hashCode !== 'function' - ) { - return { - message: () => - `expected ${util.inspect(received)} to have a "hashCode" method`, - pass: false, - }; - } - - const receivedValue = received as immutable.ValueObject; - if (!receivedValue.equals(actual)) { - return { - message: () => `expected ${received} to be .equal() to ${actual}`, - pass: false, - }; - } else if (receivedValue.hashCode() !== actual.hashCode()) { - return { - message: () => - `expected ${received} to have the same .hashCode() as ${actual}`, - pass: false, - }; - } else { - return { - message: () => `expected ${received} not to be .equal() to ${actual}`, - pass: true, - }; - } - }, -}); - -/** - * Verifies that `thrown` matches the expectation of a `toThrowSassException` - * call. - */ -function verifyThrown( - thrown: unknown, - {line, url, noUrl, includes}: ToThrowSassExceptionOptions -): SyncExpectationResult { - if (!(thrown instanceof sass.Exception)) { - return { - message: () => `expected ${thrown} to be a sass.Exception`, - pass: false, - }; - } else if (url && thrown.span.url?.toString() !== url.toString()) { - return { - message: () => `expected ${url}, was ${thrown.span.url}:\n${thrown}`, - pass: false, - }; - } else if (noUrl && thrown.span.url) { - return { - message: () => `expected no URL:\n${thrown}`, - pass: false, - }; - } else if (line && thrown.span.start?.line !== line) { - return { - message: () => - `expected to start on line ${line}, was ` + - `${thrown.span.start?.line}:\n` + - `${thrown}`, - pass: false, - }; - } else if (!thrown.sassMessage) { - return { - message: () => `expected a sassMessage field:\n${thrown}`, - pass: false, - }; - } else if (includes && !thrown.sassMessage.includes(includes)) { - return { - message: () => - `expected sassMessage to contain ${includes}, was ` + - `${thrown.sassMessage}:\n` + - `${thrown}`, - pass: false, - }; - } else if (!thrown.sassStack) { - return { - message: () => `expected a sassStack field:\n${thrown}`, - pass: false, - }; - } else if (url) { - return { - message: () => `expected not ${url}:\n${thrown}`, - pass: true, - }; - } else if (noUrl) { - return { - message: () => `expected a URL:\n${thrown}`, - pass: true, - }; - } else if (line) { - return { - message: () => `expected not to start on line ${line}:\n${thrown}`, - pass: true, - }; - } else { - return { - message: () => `expected not to throw a sass.Exception:\n${thrown}`, - pass: true, - }; - } -} +/** The name of the implementation of Sass being tested. */ +export const sassImpl = info.split('\t')[0] as 'dart-sass' | 'sass-embedded'; /** Skips the `block` of tests when running against the given `impl`. */ export function skipForImpl( - impl: 'dart-sass' | 'sass-embedded', + impl: 'dart-sass' | 'sass-embedded' | 'browser', block: () => void ): void { - if (sassImpl === impl) { - describe.skip(`[skipped for ${impl}]`, block); + if (sassImpl === impl || (impl === 'browser' && isBrowser)) { + xdescribe(`[skipped for ${impl}]`, block); } else { block(); } } +export const URL = isBrowser + ? (global as unknown as any).URL + : require('url').URL; + +export const spy = (fn: (...args: any[]) => any) => + jasmine.createSpy().and.callFake(fn); + /** Runs `block` and captures any stdout or stderr it emits. */ export function captureStdio(block: () => void): {out: string; err: string} { - // Jest overrides the console to pipe output to test reporter, so while we - // execute `block` we have to replace Jest's console with a normal one that - // can be intercepted by `interceptStdout`. - const nativeConsole = new Console({ - stdout: process.stdout, - stderr: process.stderr, - }); - const jestConsole = global.console; - global.console = nativeConsole; - let out = ''; let err = ''; - const unhook = interceptStdout( - chunk => { - out += chunk; - return ''; - }, - chunk => { - err += chunk; - return ''; - } - ); - try { + if (isBrowser) { + spyOn(console, 'log').and.callFake((msg: string) => (out += msg)); + spyOn(console, 'info').and.callFake((msg: string) => (out += msg)); + spyOn(console, 'warn').and.callFake((msg: string) => (err += msg)); + spyOn(console, 'error').and.callFake((msg: string) => (err += msg)); block(); - } finally { - unhook(); - global.console = jestConsole; + } else { + const interceptStdout = require('intercept-stdout'); + + const unhook = interceptStdout( + (chunk: string) => { + out += chunk; + return ''; + }, + (chunk: string) => { + err += chunk; + return ''; + } + ); + + try { + block(); + } finally { + unhook(); + } } return {out, err}; @@ -385,34 +70,34 @@ export function captureStdio(block: () => void): {out: string; err: string} { export async function captureStdioAsync( block: () => Promise ): Promise<{out: string; err: string}> { - // Jest overrides the console to pipe output to test reporter, so while we - // execute `block` we have to replace Jest's console with a normal one that - // can be intercepted by `interceptStdout`. - const nativeConsole = new Console({ - stdout: process.stdout, - stderr: process.stderr, - }); - const jestConsole = global.console; - global.console = nativeConsole; - let out = ''; let err = ''; - const unhook = interceptStdout( - chunk => { - out += chunk; - return ''; - }, - chunk => { - err += chunk; - return ''; - } - ); - try { + if (isBrowser) { + spyOn(console, 'log').and.callFake((msg: string) => (out += msg)); + spyOn(console, 'info').and.callFake((msg: string) => (out += msg)); + spyOn(console, 'warn').and.callFake((msg: string) => (err += msg)); + spyOn(console, 'error').and.callFake((msg: string) => (err += msg)); await block(); - } finally { - unhook(); - global.console = jestConsole; + } else { + const interceptStdout = require('intercept-stdout'); + + const unhook = interceptStdout( + (chunk: string) => { + out += chunk; + return ''; + }, + (chunk: string) => { + err += chunk; + return ''; + } + ); + + try { + await block(); + } finally { + unhook(); + } } return {out, err}; diff --git a/js-api-spec/value/argument-list.test.ts b/js-api-spec/value/argument-list.test.ts index b7debcc234..ef900126d5 100644 --- a/js-api-spec/value/argument-list.test.ts +++ b/js-api-spec/value/argument-list.test.ts @@ -11,13 +11,12 @@ import { Value, } from 'sass'; import {List, OrderedMap} from 'immutable'; -import {URL} from 'url'; -import '../utils'; +import {spy} from '../utils'; it('passes an argument list', () => { - const fn = jest.fn(args => { - expect(args).toHaveLength(1); + const fn = spy(args => { + expect(args).toBeArrayOfSize(1); expect(args[0]).toBeInstanceOf(SassArgumentList); const arglist = args[0].asList; expect(arglist.size).toBe(3); @@ -33,12 +32,12 @@ it('passes an argument list', () => { }).css ).toBe(''); - expect(fn).toBeCalled(); + expect(fn).toHaveBeenCalled(); }); it('passes keyword arguments', () => { - const fn = jest.fn(args => { - expect(args).toHaveLength(1); + const fn = spy(args => { + expect(args).toBeArrayOfSize(1); expect(args[0]).toBeInstanceOf(SassArgumentList); expect(args[0].asList.size).toBe(0); const keywords = (args[0] as SassArgumentList).keywords; @@ -54,12 +53,12 @@ it('passes keyword arguments', () => { }).css ).toBe(''); - expect(fn).toBeCalled(); + expect(fn).toHaveBeenCalled(); }); it("throws an error if arglist keywords aren't accessed", () => { - const fn = jest.fn(args => { - expect(args).toHaveLength(1); + const fn = spy(args => { + expect(args).toBeArrayOfSize(1); expect(args[0]).toBeInstanceOf(SassArgumentList); return sassNull; }); @@ -67,14 +66,11 @@ it("throws an error if arglist keywords aren't accessed", () => { expect( () => compileString('a {b: foo($bar: baz)}', { - // Necessary until we get a compiler release with - // dart-lang/source_span#78. - url: new URL('file:///input.scss'), functions: {'foo($args...)': fn}, }).css ).toThrowSassException({line: 0}); - expect(fn).toBeCalled(); + expect(fn).toHaveBeenCalled(); }); describe('SassArgumentList', () => { @@ -101,6 +97,7 @@ describe('SassArgumentList', () => { it("isn't any other type", () => { expect(() => list.assertBoolean()).toThrow(); + expect(() => list.assertCalculation()).toThrow(); expect(() => list.assertColor()).toThrow(); expect(() => list.assertFunction()).toThrow(); expect(() => list.assertMap()).toThrow(); diff --git a/js-api-spec/value/boolean.test.ts b/js-api-spec/value/boolean.test.ts index b6bf18c66f..c830e8f259 100644 --- a/js-api-spec/value/boolean.test.ts +++ b/js-api-spec/value/boolean.test.ts @@ -3,7 +3,6 @@ // https://opensource.org/licenses/MIT. import {Value, sassTrue, sassFalse} from 'sass'; -import '../utils'; describe('Sass boolean', () => { describe('sassTrue', () => { @@ -26,6 +25,7 @@ describe('Sass boolean', () => { }); it("isn't any other type", () => { + expect(value.assertCalculation).toThrow(); expect(value.assertColor).toThrow(); expect(value.assertFunction).toThrow(); expect(value.assertMap).toThrow(); @@ -55,6 +55,7 @@ describe('Sass boolean', () => { }); it("isn't any other type", () => { + expect(value.assertCalculation).toThrow(); expect(value.assertColor).toThrow(); expect(value.assertFunction).toThrow(); expect(value.assertMap).toThrow(); diff --git a/js-api-spec/value/calculation.test.ts b/js-api-spec/value/calculation.test.ts new file mode 100644 index 0000000000..b738ed10de --- /dev/null +++ b/js-api-spec/value/calculation.test.ts @@ -0,0 +1,424 @@ +// Copyright 2023 Google Inc. Use of this source code is governed by an +// MIT-style license that can be found in the LICENSE file or at +// https://opensource.org/licenses/MIT. + +import { + Value, + SassCalculation, + SassNumber, + SassString, + CalculationOperation, + CalculationOperator, + CalculationInterpolation, + compileString, + compileStringAsync, +} from 'sass'; +import {List} from 'immutable'; + +import '../utils'; + +const validCalculationValues = [ + new SassNumber(1), + new SassString('1', {quotes: false}), + SassCalculation.calc(new SassNumber(1)), + new CalculationOperation('+', new SassNumber(1), new SassNumber(1)), + new CalculationInterpolation(''), +]; +const invalidCalculationValues = [new SassString('1', {quotes: true})]; + +describe('SassCalculation', () => { + describe('construction', () => { + let calculation: SassCalculation; + beforeEach(() => { + calculation = SassCalculation.calc(new SassNumber(1)); + }); + + it('is a value', () => { + expect(calculation).toBeInstanceOf(Value); + }); + + it('is a calculation', () => { + expect(calculation).toBeInstanceOf(SassCalculation); + expect(calculation.assertCalculation()).toBe(calculation); + }); + + it("isn't any other type", () => { + expect(() => calculation.assertBoolean()).toThrow(); + expect(() => calculation.assertColor()).toThrow(); + expect(() => calculation.assertFunction()).toThrow(); + expect(() => calculation.assertMap()).toThrow(); + expect(calculation.tryMap()).toBe(null); + expect(() => calculation.assertNumber()).toThrow(); + expect(() => calculation.assertString()).toThrow(); + }); + }); + + describe('calc', () => { + it('correctly stores name and arguments', () => { + const result = SassCalculation.calc(new SassNumber(1)); + expect(result.name).toBe('calc'); + expect(result.arguments).toEqualWithHash(List([new SassNumber(1)])); + }); + + it('rejects invalid arguments', () => { + for (const value of invalidCalculationValues) { + expect(() => SassCalculation.calc(value)).toThrow(); + } + }); + + it('accepts valid arguments', () => { + for (const value of validCalculationValues) { + expect(() => SassCalculation.calc(value)).not.toThrow(); + } + }); + }); + + describe('min', () => { + it('correctly stores name and arguments', () => { + const result = SassCalculation.min([ + new SassNumber(1), + new SassNumber(2), + ]); + expect(result.name).toBe('min'); + expect(result.arguments).toEqualWithHash( + List([new SassNumber(1), new SassNumber(2)]) + ); + }); + + it('rejects invalid arguments', () => { + for (const value of invalidCalculationValues) { + expect(() => SassCalculation.min([value, new SassNumber(2)])).toThrow(); + expect(() => SassCalculation.min([new SassNumber(1), value])).toThrow(); + } + }); + + it('accepts valid arguments', () => { + for (const value of validCalculationValues) { + expect(() => + SassCalculation.min([value, new SassNumber(2)]) + ).not.toThrow(); + expect(() => + SassCalculation.min([new SassNumber(1), value]) + ).not.toThrow(); + } + }); + }); + + describe('max', () => { + it('correctly stores name and arguments', () => { + const result = SassCalculation.max([ + new SassNumber(1), + new SassNumber(2), + ]); + expect(result.name).toBe('max'); + expect(result.arguments).toEqualWithHash( + List([new SassNumber(1), new SassNumber(2)]) + ); + }); + + it('rejects invalid arguments', () => { + for (const value of invalidCalculationValues) { + expect(() => SassCalculation.max([value, new SassNumber(2)])).toThrow(); + expect(() => SassCalculation.max([new SassNumber(1), value])).toThrow(); + } + }); + + it('accepts valid arguments', () => { + for (const value of validCalculationValues) { + expect(() => + SassCalculation.max([value, new SassNumber(2)]) + ).not.toThrow(); + expect(() => + SassCalculation.max([new SassNumber(1), value]) + ).not.toThrow(); + } + }); + }); + + describe('clamp', () => { + it('correctly stores name and arguments', () => { + const result = SassCalculation.clamp( + new SassNumber(1), + new SassNumber(2), + new SassNumber(3) + ); + expect(result.name).toBe('clamp'); + expect(result.arguments).toEqualWithHash( + List([new SassNumber(1), new SassNumber(2), new SassNumber(3)]) + ); + }); + + it('rejects invalid arguments', () => { + for (const value of invalidCalculationValues) { + expect(() => + SassCalculation.clamp(value, new SassNumber(2), new SassNumber(3)) + ).toThrow(); + expect(() => + SassCalculation.clamp(new SassNumber(1), value, new SassNumber(3)) + ).toThrow(); + expect(() => + SassCalculation.clamp(new SassNumber(1), new SassNumber(2), value) + ).toThrow(); + } + }); + + it('accepts valid arguments', () => { + for (const value of validCalculationValues) { + expect(() => + SassCalculation.clamp(value, new SassNumber(2), new SassNumber(3)) + ).not.toThrow(); + expect(() => + SassCalculation.clamp(new SassNumber(1), value, new SassNumber(3)) + ).not.toThrow(); + expect(() => + SassCalculation.clamp(new SassNumber(1), new SassNumber(2), value) + ).not.toThrow(); + } + }); + + // When `clamp()` is called with less than three arguments, the list of + // accepted values is much narrower + const validClampValues = [ + new SassString('1', {quotes: false}), + new CalculationInterpolation('1'), + ]; + const invalidClampValues = [ + new SassNumber(1), + new SassString('1', {quotes: true}), + ]; + + it('rejects invalid values for one argument', () => { + for (const value of invalidClampValues) { + expect(() => SassCalculation.clamp(value)).toThrow(); + } + }); + + it('accepts valid values for one argument', () => { + for (const value of validClampValues) { + expect(() => SassCalculation.clamp(value)).not.toThrow(); + } + }); + + it('rejects invalid values for two arguments', () => { + for (const value of invalidClampValues) { + expect(() => SassCalculation.clamp(value, value)).toThrow(); + } + }); + + it('accepts valid values for two arguments', () => { + for (const value of validClampValues) { + expect(() => SassCalculation.clamp(value, value)).not.toThrow(); + } + }); + }); + + describe('simplifies', () => { + it('calc()', () => { + const fn = () => + SassCalculation.calc( + new CalculationOperation('+', new SassNumber(1), new SassNumber(2)) + ); + + expect( + compileString('a {b: foo()}', { + functions: {'foo()': fn}, + }).css + ).toBe('a {\n b: 3;\n}'); + }); + + it('clamp()', () => { + const fn = () => + SassCalculation.clamp( + new SassNumber(1), + new SassNumber(2), + new SassNumber(3) + ); + + expect( + compileString('a {b: foo()}', { + functions: {'foo()': fn}, + }).css + ).toBe('a {\n b: 2;\n}'); + }); + + it('min()', () => { + const fn = () => + SassCalculation.min([new SassNumber(1), new SassNumber(2)]); + + expect( + compileString('a {b: foo()}', { + functions: {'foo()': fn}, + }).css + ).toBe('a {\n b: 1;\n}'); + }); + + it('max()', () => { + const fn = () => + SassCalculation.max([new SassNumber(1), new SassNumber(2)]); + + expect( + compileString('a {b: foo()}', { + functions: {'foo()': fn}, + }).css + ).toBe('a {\n b: 2;\n}'); + }); + + it('operations', () => { + const fn = () => + SassCalculation.calc( + new CalculationOperation( + '+', + SassCalculation.min([new SassNumber(3), new SassNumber(4)]), + new CalculationOperation( + '*', + SassCalculation.max([new SassNumber(5), new SassNumber(6)]), + new CalculationOperation( + '-', + new SassNumber(3), + new CalculationOperation( + '/', + new SassNumber(4), + new SassNumber(5) + ) + ) + ) + ) + ); + + expect( + compileString('a {b: foo()}', { + functions: {'foo()': fn}, + }).css + ).toBe('a {\n b: 16.2;\n}'); + }); + + it('asynchronously', async () => { + const fn = async () => + SassCalculation.calc( + new CalculationOperation('+', new SassNumber(1), new SassNumber(2)) + ); + + const result = await compileStringAsync('a {b: foo()}', { + functions: {'foo()': fn}, + }); + expect(result.css).toBe('a {\n b: 3;\n}'); + }); + }); + + describe('throws when simplifying', () => { + it('calc() with more than one argument', () => { + const fn = () => + // @ts-expect-error: Call `calc` with the wrong number of arguments + new SassCalculation('calc', new SassNumber(1), new SassNumber(2)); + expect(() => + compileString('a {b: foo()}', { + functions: {'foo()': fn}, + }) + ).toThrow(); + }); + + it('clamp() with the wrong argument', () => { + const fn = () => SassCalculation.clamp(new SassNumber(1)); + expect(() => + compileString('a {b: foo()}', { + functions: {'foo()': fn}, + }) + ).toThrowError(/SassString or CalculationInterpolation/); + }); + + it('an unknown calculation function', () => { + const foo = SassCalculation.calc(new SassNumber(1)); + // @ts-expect-error: Assign to read-only property + foo.name = 'foo'; + expect(() => + compileString('a {b: foo()}', { + functions: {'foo()': () => foo}, + }) + ).toThrowError(/"foo" is not a recognized calculation type/); + }); + }); +}); + +describe('CalculationOperation', () => { + const validOperators = ['+', '-', '*', '/']; + const invalidOperators = ['||', '&&', 'plus', 'minus', '']; + + describe('construction', () => { + it('rejects invalid operators', () => { + for (const operator of invalidOperators) { + expect( + () => + new CalculationOperation( + operator as CalculationOperator, + new SassNumber(1), + new SassNumber(2) + ) + ).toThrow(); + } + }); + + it('accepts valid operators', () => { + for (const operator of validOperators) { + expect( + () => + new CalculationOperation( + operator as CalculationOperator, + new SassNumber(1), + new SassNumber(2) + ) + ).not.toThrow(); + } + }); + + it('rejects invalid operands', () => { + for (const operand of invalidCalculationValues) { + expect( + () => new CalculationOperation('+', operand, new SassNumber(1)) + ).toThrow(); + expect( + () => new CalculationOperation('+', new SassNumber(1), operand) + ).toThrow(); + } + }); + + it('accepts valid operands', () => { + for (const operand of validCalculationValues) { + expect( + () => new CalculationOperation('+', operand, new SassNumber(1)) + ).not.toThrow(); + expect( + () => new CalculationOperation('+', new SassNumber(1), operand) + ).not.toThrow(); + } + }); + }); + + describe('stores', () => { + let operation: CalculationOperation; + beforeEach(() => { + operation = new CalculationOperation( + '+', + new SassNumber(1), + new SassNumber(2) + ); + }); + + it('operator', () => { + expect(operation.operator).toBe('+'); + }); + + it('left', () => { + expect(operation.left).toEqual(new SassNumber(1)); + }); + + it('right', () => { + expect(operation.right).toEqual(new SassNumber(2)); + }); + }); +}); + +describe('CalculationInterpolation', () => { + it('stores value', () => { + expect(new CalculationInterpolation('1').value).toEqual('1'); + }); +}); diff --git a/js-api-spec/value/color.test.ts b/js-api-spec/value/color.test.ts index 0ecd495a52..b0678aea05 100644 --- a/js-api-spec/value/color.test.ts +++ b/js-api-spec/value/color.test.ts @@ -55,6 +55,7 @@ describe('SassColor', () => { it("isn't any other type", () => { expect(() => color.assertBoolean()).toThrow(); + expect(() => color.assertCalculation()).toThrow(); expect(() => color.assertFunction()).toThrow(); expect(() => color.assertMap()).toThrow(); expect(color.tryMap()).toBe(null); @@ -70,7 +71,7 @@ describe('SassColor', () => { }); // TODO(#1828): Update these expectations - it.skip('disallows invalid values', () => { + xit('disallows invalid values', () => { expect(() => rgb(-1, 0, 0, 0)).toThrow(); expect(() => rgb(0, -1, 0, 0)).toThrow(); expect(() => rgb(0, 0, -1, 0)).toThrow(); @@ -82,7 +83,7 @@ describe('SassColor', () => { }); // TODO(#1828): Update these expectations - it.skip('rounds channels to the nearest integer', () => { + xit('rounds channels to the nearest integer', () => { expect(rgb(0.1, 50.4, 90.3)).toEqualWithHash(rgb(0, 50, 90)); expect(rgb(-0.1, 50.5, 90.7)).toEqualWithHash(rgb(0, 51, 91)); }); @@ -192,7 +193,7 @@ describe('SassColor', () => { }); // TODO(#1828): Update these expectations - it.skip('equals the same color', () => { + xit('equals the same color', () => { expect(color).toEqualWithHash(rgb(62, 152, 62)); expect(color).toEqualWithHash(hsl(120, 42, 42)); expect(color).toEqualWithHash( @@ -241,7 +242,7 @@ describe('SassColor', () => { }); // TODO(#1828): Update these expectations - it.skip('equals the same color', () => { + xit('equals the same color', () => { expect(color).toEqualWithHash(rgb(107, 148, 107)); expect(color).toEqualWithHash(hsl(120, 16.078431372549026, 50)); expect(color).toEqualWithHash( @@ -286,7 +287,7 @@ describe('SassColor', () => { }); // TODO(#1828): Update these expectations - it.skip('disallows invalid values', () => { + xit('disallows invalid values', () => { expect(() => color.change({red: -1})).toThrow(); expect(() => color.change({red: 256})).toThrow(); expect(() => color.change({green: -1})).toThrow(); @@ -298,7 +299,7 @@ describe('SassColor', () => { }); // TODO(#1828): Update these expectations - it.skip('rounds channels to the nearest integer', () => { + xit('rounds channels to the nearest integer', () => { expect( color.change({red: 0.1, green: 50.4, blue: 90.3}) ).toEqualWithHash(rgb(0, 50, 90)); diff --git a/js-api-spec/value/function.test.ts b/js-api-spec/value/function.test.ts index 0dc35a678d..c56b8b1b3b 100644 --- a/js-api-spec/value/function.test.ts +++ b/js-api-spec/value/function.test.ts @@ -2,13 +2,13 @@ // MIT-style license that can be found in the LICENSE file or at // https://opensource.org/licenses/MIT. -import {SassFunction, SassNumber, compileString, sassNull} from 'sass'; +import {SassFunction, SassNumber, compileString, sassNull, Value} from 'sass'; -import '../utils'; +import {spy} from '../utils'; it('can round-trip a function reference from Sass', () => { - const fn = jest.fn(args => { - expect(args).toHaveLength(1); + const fn = spy(args => { + expect(args).toBeArrayOfSize(1); expect(args[0]).toBeInstanceOf(SassFunction); return args[0]; }); @@ -27,14 +27,14 @@ it('can round-trip a function reference from Sass', () => { ).css ).toBe('a {\n b: 3;\n}'); - expect(fn).toBeCalled(); + expect(fn).toHaveBeenCalled(); }); it('can call a function reference from JS', () => { - const fn = jest.fn(args => { - expect(args).toHaveLength(0); - return new SassFunction('plusOne($n)', args => { - expect(args).toHaveLength(1); + const fn = spy(args => { + expect(args).toBeArrayOfSize(0); + return new SassFunction('plusOne($n)', (args: Value[]) => { + expect(args).toBeArrayOfSize(1); expect(args[0].assertNumber().value).toBe(2); return new SassNumber(args[0].assertNumber().value + 1); }); @@ -53,7 +53,7 @@ it('can call a function reference from JS', () => { ).css ).toBe('a {\n b: 3;\n}'); - expect(fn).toBeCalled(); + expect(fn).toHaveBeenCalled(); }); describe('rejects a function signature that', () => { @@ -61,7 +61,7 @@ describe('rejects a function signature that', () => { // function is instantiated *or* when it's returned from the custom function // callback. This test works in either case. function rejectsSignature(signature: string): void { - const fn = jest.fn(() => new SassFunction(signature, () => sassNull)); + const fn = spy(() => new SassFunction(signature, () => sassNull)); expect(() => compileString('a {b: inspect(foo())}', { @@ -69,7 +69,7 @@ describe('rejects a function signature that', () => { }) ).toThrowSassException({line: 0}); - expect(fn).toBeCalled(); + expect(fn).toHaveBeenCalled(); } it('is empty', () => rejectsSignature('')); diff --git a/js-api-spec/value/list.test.ts b/js-api-spec/value/list.test.ts index 0988da3813..e7d784fcad 100644 --- a/js-api-spec/value/list.test.ts +++ b/js-api-spec/value/list.test.ts @@ -5,8 +5,6 @@ import {Value, SassList, SassMap, SassNumber, SassString} from 'sass'; import {List} from 'immutable'; -import '../utils'; - describe('SassList', () => { describe('construction', () => { let list: SassList; @@ -27,6 +25,7 @@ describe('SassList', () => { it("isn't any other type", () => { expect(() => list.assertBoolean()).toThrow(); + expect(() => list.assertCalculation()).toThrow(); expect(() => list.assertColor()).toThrow(); expect(() => list.assertFunction()).toThrow(); expect(() => list.assertMap()).toThrow(); @@ -356,6 +355,7 @@ describe('SassList', () => { it("isn't any other type", () => { expect(() => list.assertBoolean()).toThrow(); + expect(() => list.assertCalculation()).toThrow(); expect(() => list.assertColor()).toThrow(); expect(() => list.assertFunction()).toThrow(); expect(() => list.assertNumber()).toThrow(); diff --git a/js-api-spec/value/map.test.ts b/js-api-spec/value/map.test.ts index a1cdeaf81c..36a3716a31 100644 --- a/js-api-spec/value/map.test.ts +++ b/js-api-spec/value/map.test.ts @@ -5,8 +5,6 @@ import {Value, SassList, SassMap, SassNumber, SassString} from 'sass'; import {List, OrderedMap} from 'immutable'; -import '../utils'; - describe('SassMap', () => { let map: SassMap; beforeEach(() => { @@ -31,6 +29,7 @@ describe('SassMap', () => { it("isn't any other type", () => { expect(() => map.assertBoolean()).toThrow(); + expect(() => map.assertCalculation()).toThrow(); expect(() => map.assertColor()).toThrow(); expect(() => map.assertFunction()).toThrow(); expect(() => map.assertNumber()).toThrow(); diff --git a/js-api-spec/value/null.test.ts b/js-api-spec/value/null.test.ts index a754d27571..2ed3d37df9 100644 --- a/js-api-spec/value/null.test.ts +++ b/js-api-spec/value/null.test.ts @@ -3,7 +3,6 @@ // https://opensource.org/licenses/MIT. import {Value, sassNull} from 'sass'; -import '../utils'; describe('Sass null', () => { const value: Value = sassNull; @@ -26,6 +25,7 @@ describe('Sass null', () => { it("isn't any type", () => { expect(value.assertBoolean).toThrow(); + expect(value.assertCalculation).toThrow(); expect(value.assertColor).toThrow(); expect(value.assertFunction).toThrow(); expect(value.assertMap).toThrow(); diff --git a/js-api-spec/value/number.test.ts b/js-api-spec/value/number.test.ts index a90b52277e..f2493821be 100644 --- a/js-api-spec/value/number.test.ts +++ b/js-api-spec/value/number.test.ts @@ -5,7 +5,6 @@ import {List} from 'immutable'; import {Value, SassNumber} from 'sass'; -import '../utils'; const precision = 10; @@ -38,6 +37,7 @@ describe('Sass number', () => { it("isn't any other type", () => { expect(() => number.assertBoolean()).toThrow(); + expect(() => number.assertCalculation()).toThrow(); expect(() => number.assertColor()).toThrow(); expect(() => number.assertFunction()).toThrow(); expect(() => number.assertMap()).toThrow(); diff --git a/js-api-spec/value/string.test.ts b/js-api-spec/value/string.test.ts index 100716def2..abe4fc2135 100644 --- a/js-api-spec/value/string.test.ts +++ b/js-api-spec/value/string.test.ts @@ -3,7 +3,6 @@ // https://opensource.org/licenses/MIT. import {Value, SassNumber, SassString} from 'sass'; -import '../utils'; describe('Sass string', () => { describe('construction', () => { @@ -55,6 +54,7 @@ describe('Sass string', () => { it("isn't any other type", () => { const value: Value = new SassString('nb'); expect(value.assertBoolean).toThrow(); + expect(value.assertCalculation).toThrow(); expect(value.assertColor).toThrow(); expect(value.assertFunction).toThrow(); expect(value.assertMap).toThrow(); diff --git a/karma.config.js b/karma.config.js new file mode 100644 index 0000000000..3172441955 --- /dev/null +++ b/karma.config.js @@ -0,0 +1,61 @@ +const { + NodeModulesPolyfillPlugin, +} = require('@esbuild-plugins/node-modules-polyfill'); + +module.exports = config => { + config.set({ + // base path that will be used to resolve all patterns (eg. files, exclude) + basePath: '', + + // frameworks to use + // available frameworks: https://www.npmjs.com/search?q=keywords:karma-adapter + frameworks: ['jasmine', 'jasmine-matchers'], + + // list of files / patterns to exclude + exclude: [], + + // preprocess matching files before serving them to the browser + // available preprocessors: https://www.npmjs.com/search?q=keywords:karma-preprocessor + preprocessors: { + '**/*.ts': ['esbuild'], + }, + + esbuild: { + logLevel: 'error', + // This is needed to support `util.inspect()` usage in custom + // `toEqualWithHash` matcher (defined in `setup.ts`) + plugins: [NodeModulesPolyfillPlugin()], + keepNames: true, + }, + + // test results reporter to use + // possible values: 'dots', 'progress' + // available reporters: https://www.npmjs.com/search?q=keywords:karma-reporter + reporters: ['mocha'], + + // web server port + port: 9876, + + // enable / disable colors in the output (reporters and logs) + colors: true, + + // level of logging + // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG + logLevel: config.LOG_INFO, + + // enable / disable watching file and executing tests whenever any file changes + autoWatch: false, + + // start these browsers + // available browser launchers: https://www.npmjs.com/search?q=keywords:karma-launcher + browsers: ['ChromeHeadless'], + + // Continuous Integration mode + // if true, Karma captures browsers, runs the tests and exits + singleRun: true, + + // Concurrency level + // how many browser instances should be started simultaneously + concurrency: Infinity, + }); +}; diff --git a/lib/cli-args.ts b/lib/cli-args.ts index 10f54e7efa..6d630c57a8 100644 --- a/lib/cli-args.ts +++ b/lib/cli-args.ts @@ -12,6 +12,9 @@ export interface CliArgs { interactive: boolean; testDirs: string[]; todoMode: TodoMode; + trimErrors: boolean; + skipWarning: boolean; + ignoreErrorDiffs: boolean; } const implArgs: Record = { @@ -99,6 +102,22 @@ export async function parseArgs( type: 'boolean', default: false, }) + .options('trim-errors', { + description: 'Only compare the message for errors', + type: 'boolean', + default: false, + }) + .options('ignore-warning-diffs', { + description: 'Ignore diffs in warnings', + type: 'boolean', + default: false, + }) + .options('ignore-error-diffs', { + description: + 'Ignore the contents of error messages. I.e. only validate that an error was thrown.', + type: 'boolean', + default: false, + }) .parseSync(); const root = path.resolve(process.cwd(), argv['root-path']); @@ -113,6 +132,9 @@ export async function parseArgs( : argv['probe-todo'] ? 'probe' : undefined, + trimErrors: argv['trim-errors'], + skipWarning: argv['ignore-warning-diffs'], + ignoreErrorDiffs: argv['ignore-error-diffs'], }; args.impl = argv.dart ? 'dart-sass' : argv.impl!; let cmdArgs = implArgs[args.impl] ?? []; diff --git a/lib/test-case/compare.ts b/lib/test-case/compare.ts index e7545be92e..0be15cc60f 100644 --- a/lib/test-case/compare.ts +++ b/lib/test-case/compare.ts @@ -58,7 +58,7 @@ function getDiff( return createPatch(filename, expected, actual, 'expected', 'actual'); } -interface CompareOptions { +export interface CompareOptions { /** * if true, errors and warnings will be trimmed * so only the messages are compared and not line information @@ -66,6 +66,10 @@ interface CompareOptions { trimErrors?: boolean; /** If true, skip warning checks */ skipWarning?: boolean; + /** + * If true, error messages and line information won't be compared + */ + ignoreErrorDiffs?: boolean; } /** @@ -77,7 +81,7 @@ interface CompareOptions { export function compareResults( expected: ExpectedSassResult, actual: SassResult, - {skipWarning, trimErrors}: CompareOptions + {skipWarning, trimErrors, ignoreErrorDiffs}: CompareOptions ): TestResult { if (expected.isSuccess === null) { return failures.MissingOutput(); @@ -107,10 +111,12 @@ export function compareResults( if (actual.isSuccess) { return failures.UnexpectedSuccess(); } - const normalizer = trimErrors ? extractErrorMessage : normalizeOutput; - const diff = getDiff('error', expected.error, actual.error, normalizer); - if (diff) { - return failures.ErrorDifference(diff); + if (!ignoreErrorDiffs) { + const normalizer = trimErrors ? extractErrorMessage : normalizeOutput; + const diff = getDiff('error', expected.error, actual.error, normalizer); + if (diff) { + return failures.ErrorDifference(diff); + } } } diff --git a/lib/test-case/test-case.ts b/lib/test-case/test-case.ts index 9f3d695b82..be5a07b76a 100644 --- a/lib/test-case/test-case.ts +++ b/lib/test-case/test-case.ts @@ -8,7 +8,7 @@ import { SassResult, TodoMode, } from './util'; -import {compareResults} from './compare'; +import {CompareOptions, compareResults} from './compare'; import {getExpectedResult} from './expected'; /** @@ -31,7 +31,8 @@ export default class TestCase { dir: SpecDirectory, impl: string, compiler: Compiler, - todoMode: TodoMode + todoMode: TodoMode, + private compareOpts?: CompareOptions ) { this.dir = dir; this.impl = impl; @@ -46,9 +47,10 @@ export default class TestCase { dir: SpecDirectory, impl: string, compiler: Compiler, - todoMode?: TodoMode + todoMode?: TodoMode, + compareOpts?: CompareOptions ): Promise { - const testCase = new TestCase(dir, impl, compiler, todoMode); + const testCase = new TestCase(dir, impl, compiler, todoMode, compareOpts); try { testCase._result = await testCase.run(); } catch (caught) { @@ -121,9 +123,11 @@ export default class TestCase { const testResult = compareResults(expected, actual, { // Compare the full error only for dart-sass - trimErrors: this.impl !== 'dart-sass', + trimErrors: this.impl !== 'dart-sass' || this.compareOpts?.trimErrors, // Skip warning checks :warning_todo is enabled and we're not running todos - skipWarning: warningTodo && !this.todoMode, + skipWarning: + (warningTodo && !this.todoMode) || this.compareOpts?.skipWarning, + ignoreErrorDiffs: this.compareOpts?.ignoreErrorDiffs, }); // If we're probing todo if (this.todoMode === 'probe') { @@ -185,7 +189,7 @@ export default class TestCase { // create a warning file if ( this.dir.hasFile('warning') && - this.dir.readFile('warning') && + (await this.dir.readFile('warning')) && actual.isSuccess && !actual.warning ) { diff --git a/package-lock.json b/package-lock.json index 6332a27ad1..6dd7dec466 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,7 +1,7 @@ { "name": "sass-spec", "version": "3.5.4", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, "packages": { "": { @@ -9,13 +9,17 @@ "version": "3.5.4", "license": "MIT", "dependencies": { + "@esbuild-plugins/node-modules-polyfill": "^0.2.2", "@jest/types": "^27.2.5", "@types/data-urls": "^2.0.1", "@types/diff": "^5.0.1", "@types/fs-extra": "^9.0.13", "@types/intercept-stdout": "^0.1.0", + "@types/jasmine": "^4.3.1", + "@types/jasmine-expect": "^3.8.1", "@types/jest": "^27.0.2", "@types/js-yaml": "^4.0.3", + "@types/karma": "^6.3.3", "@types/lodash": "^4.14.168", "@types/node": "^14.14.7", "@types/node-hrx": "^0.1.0", @@ -24,15 +28,25 @@ "data-urls": "^3.0.1", "del": "^6.0.0", "diff": "^5.0.0", + "esbuild": "^0.16.17", "file-lines-count": "^1.0.1", "fs-extra": "^10.0.0", "gts": "^3.1.0", "immutable": "^4.0.0", "intercept-stdout": "^0.1.2", + "jasmine": "^4.6.0", + "jasmine-expect": "^5.0.0", + "jasmine-spec-reporter": "^7.0.0", "jest": "^27.3.1", "jest-environment-node-single-context": "^27.2.0", "jest-extended": "^1.1.0", "js-yaml": "^4.1.0", + "karma": "^6.4.1", + "karma-chrome-launcher": "^3.1.1", + "karma-esbuild": "^2.2.5", + "karma-jasmine": "^5.1.0", + "karma-jasmine-matchers": "^5.0.0", + "karma-mocha-reporter": "^2.2.5", "lodash": "^4.17.21", "node-hrx": "^0.1.0", "prettier": "^2.1.2", @@ -56,9 +70,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.0.tgz", - "integrity": "sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", + "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==", "engines": { "node": ">=6.9.0" } @@ -104,9 +118,9 @@ } }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -120,34 +134,28 @@ } }, "node_modules/@babel/generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", - "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", + "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", "dependencies": { - "@babel/types": "^7.16.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" + "@babel/types": "^7.21.4", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.0.tgz", - "integrity": "sha512-S7iaOT1SYlqK0sQaCi21RX4+13hmdmnxIEAnQUB/eh7GeAnRjOUgTYpLkUOiRXzD+yog1JxP0qyAQZ7ZxVxLVg==", - "dependencies": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", + "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", + "dependencies": { + "@babel/compat-data": "^7.21.4", + "@babel/helper-validator-option": "^7.21.0", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", "semver": "^6.3.0" }, "engines": { @@ -157,156 +165,137 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-function-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", - "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", - "dependencies": { - "@babel/helper-get-function-arity": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } + "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, - "node_modules/@babel/helper-get-function-arity": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", - "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", - "dependencies": { - "@babel/types": "^7.16.0" - }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-hoist-variables": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", - "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", + "node_modules/@babel/helper-function-name": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", "dependencies": { - "@babel/types": "^7.16.0" + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", - "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", + "node_modules/@babel/helper-hoist-variables": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "dependencies": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", "dependencies": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.21.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", - "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", - "dependencies": { - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", - "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", + "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", "dependencies": { - "@babel/types": "^7.16.0" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-replace-supers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", - "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", + "node_modules/@babel/helper-simple-access": { + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.16.0", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/types": "^7.20.2" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", - "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "dependencies": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/helper-split-export-declaration": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", - "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", - "dependencies": { - "@babel/types": "^7.16.0" - }, + "node_modules/@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==", + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", "engines": { "node": ">=6.9.0" } @@ -325,11 +314,11 @@ } }, "node_modules/@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "dependencies": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -402,9 +391,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.0.tgz", - "integrity": "sha512-TEHWXf0xxpi9wKVyBCmRcSSDjbJ/cl6LUdlbYUHEaNQUJGhreJbZrXT6sR4+fZLxVUJqNRB4KyOvjuy/D9009A==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", + "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", "bin": { "parser": "bin/babel-parser.js" }, @@ -562,41 +551,42 @@ } }, "node_modules/@babel/template": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", - "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "dependencies": { - "@babel/code-frame": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template/node_modules/@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "dependencies": { - "@babel/highlight": "^7.16.0" + "@babel/highlight": "^7.18.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.0.tgz", - "integrity": "sha512-qQ84jIs1aRQxaGaxSysII9TuDaguZ5yVrEuC0BN2vcPlalwfLovVmCjbFDPECPXcYM/wLvNFfp8uDOliLxIoUQ==", - "dependencies": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", + "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", + "dependencies": { + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.4", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.21.4", + "@babel/types": "^7.21.4", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -605,11 +595,11 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "dependencies": { - "@babel/highlight": "^7.16.0" + "@babel/highlight": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -624,11 +614,12 @@ } }, "node_modules/@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", + "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", "dependencies": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" }, "engines": { @@ -640,6 +631,14 @@ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/@cspotcode/source-map-consumer": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", @@ -659,6 +658,348 @@ "node": ">=12" } }, + "node_modules/@esbuild-plugins/node-modules-polyfill": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.2.2.tgz", + "integrity": "sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==", + "dependencies": { + "escape-string-regexp": "^4.0.0", + "rollup-plugin-node-polyfills": "^0.2.1" + }, + "peerDependencies": { + "esbuild": "*" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", + "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", + "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", + "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", + "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", + "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", + "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", + "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", + "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", + "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", + "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", + "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", + "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", + "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", + "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", + "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", + "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", + "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", + "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", + "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", + "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", + "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", + "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -880,6 +1221,20 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/@jest/globals/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, "node_modules/@jest/reporters": { "version": "27.3.1", "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.3.1.tgz", @@ -990,9 +1345,9 @@ } }, "node_modules/@jest/types": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.2.5.tgz", - "integrity": "sha512-nmuM4VuDtCZcY+eTpw+0nvstwReMsjPoj7ZR80/BbixulhLaiX+fbv8oeLW8WZlJMcsGQsTmMKT/iTZu1Uy/lQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "dependencies": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -1012,6 +1367,54 @@ "@types/yargs-parser": "*" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1044,14 +1447,6 @@ "node": ">= 8" } }, - "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "engines": { - "node": ">=6" - } - }, "node_modules/@sinonjs/commons": { "version": "1.8.3", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.3.tgz", @@ -1068,16 +1463,10 @@ "@sinonjs/commons": "^1.7.0" } }, - "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } + "node_modules/@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" }, "node_modules/@tootallnate/once": { "version": "1.1.2", @@ -1144,6 +1533,19 @@ "@babel/types": "^7.3.0" } }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "node_modules/@types/cors": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/data-urls": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/data-urls/-/data-urls-2.0.1.tgz", @@ -1201,6 +1603,20 @@ "@types/istanbul-lib-report": "*" } }, + "node_modules/@types/jasmine": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.3.1.tgz", + "integrity": "sha512-Vu8l+UGcshYmV1VWwULgnV/2RDbBaO6i2Ptx7nd//oJPIZGhoI1YLST4VKagD2Pq/Bc2/7zvtvhM7F3p4SN7kQ==" + }, + "node_modules/@types/jasmine-expect": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@types/jasmine-expect/-/jasmine-expect-3.8.1.tgz", + "integrity": "sha512-th6GNWDqK4lFWDsJrG8KVBRNdZ9GNHFqFUAtFal110OB0ET0v+tJwJ/xHV0i4xRXmohtpcXd3X0whovgbQVteg==", + "deprecated": "This is a stub types definition for jasmine-expect (https://github.com/JamieMason/Jasmine-Matchers). jasmine-expect provides its own type definitions, so you don\\'t need @types/jasmine-expect installed!", + "dependencies": { + "jasmine-expect": "*" + } + }, "node_modules/@types/jest": { "version": "27.0.2", "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.0.2.tgz", @@ -1220,6 +1636,15 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" }, + "node_modules/@types/karma": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@types/karma/-/karma-6.3.3.tgz", + "integrity": "sha512-nRMec4mTCt+tkpRqh5/pAxmnjzEgAaalIq7mdfLFH88gSRC8+bxejLiSjHMMT/vHIhJHqg4GPIGCnCFbwvDRww==", + "dependencies": { + "@types/node": "*", + "log4js": "^6.4.1" + } + }, "node_modules/@types/lodash": { "version": "4.14.176", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.176.tgz", @@ -1450,6 +1875,18 @@ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", @@ -1486,6 +1923,11 @@ "node": ">=0.4.0" } }, + "node_modules/add-matchers": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/add-matchers/-/add-matchers-0.6.2.tgz", + "integrity": "sha512-hVO2wodMei9RF00qe+506MoeJ/NEOdCMEkSJ12+fC3hx/5Z4zmhNiP92nJEF6XhmXokeB0hOtuQrjHCx2vmXrQ==" + }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -1524,14 +1966,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dependencies": { - "string-width": "^4.1.0" - } - }, "node_modules/ansi-colors": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", @@ -1690,9 +2124,9 @@ } }, "node_modules/babel-plugin-istanbul/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -1753,38 +2187,58 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, - "node_modules/boxen": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", - "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.2", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": "^4.5.0 || >= 5.9" } }, - "node_modules/boxen/node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "engines": { - "node": ">=10" + "node": ">=8" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1811,25 +2265,30 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "node_modules/browserslist": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.5.tgz", - "integrity": "sha512-I3ekeB92mmpctWBoLXe0d5wPS2cBuRvvW0JyyJHMrk9/HmP2ZjrTboNAZ8iuGqaEIlKguljbQY32OkOJIRrgoA==", + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], "dependencies": { - "caniuse-lite": "^1.0.30001271", - "electron-to-chromium": "^1.3.878", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" }, "bin": { "browserslist": "cli.js" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" } }, "node_modules/bs-logger": { @@ -1856,43 +2315,24 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, - "node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "engines": { - "node": ">=8" + "node": ">= 0.8" } }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "engines": { - "node": ">=8" + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/callsites": { @@ -1928,13 +2368,23 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001274", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001274.tgz", - "integrity": "sha512-+Nkvv0fHyhISkiMIjnyjmf5YJcQ1IQHZN6U9TLUMroWR38FNwpsC51Gb68yueafX1V6ifOisInSgP9WJFS13ew==", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - } + "version": "1.0.30001478", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001478.tgz", + "integrity": "sha512-gMhDyXGItTHipJj2ApIvR+iVB5hd0KP3svMWWXDvZOmjzJJassGLMfxRkQCSYgGd2gtdL/ReeiyvMSFD1Ss6Mw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] }, "node_modules/chalk": { "version": "4.1.2", @@ -1964,6 +2414,32 @@ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/ci-info": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", @@ -1982,17 +2458,6 @@ "node": ">=6" } }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -2022,14 +2487,6 @@ "wrap-ansi": "^7.0.0" } }, - "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dependencies": { - "mimic-response": "^1.0.0" - } - }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", @@ -2060,6 +2517,14 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -2076,20 +2541,39 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" }, "engines": { - "node": ">=8" + "node": ">= 0.10.0" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" } }, "node_modules/convert-source-map": { @@ -2100,6 +2584,26 @@ "safe-buffer": "~5.1.1" } }, + "node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -2118,14 +2622,6 @@ "node": ">= 8" } }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "engines": { - "node": ">=8" - } - }, "node_modules/cssom": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", @@ -2147,6 +2643,11 @@ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" }, + "node_modules/custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==" + }, "node_modules/data-urls": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.1.tgz", @@ -2199,10 +2700,18 @@ "node": ">=12" } }, + "node_modules/date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "engines": { + "node": ">=4.0" + } + }, "node_modules/debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dependencies": { "ms": "2.1.2" }, @@ -2248,30 +2757,11 @@ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.3.1.tgz", "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" }, - "node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=" }, - "node_modules/deep-extend": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", - "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -2285,11 +2775,6 @@ "node": ">=0.10.0" } }, - "node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" - }, "node_modules/del": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", @@ -2311,12 +2796,29 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "engines": { - "node": ">=0.4.0" + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" } }, "node_modules/detect-newline": { @@ -2327,6 +2829,11 @@ "node": ">=8" } }, + "node_modules/di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==" + }, "node_modules/diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", @@ -2336,9 +2843,9 @@ } }, "node_modules/diff-sequences": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz", - "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } @@ -2365,6 +2872,17 @@ "node": ">=6.0.0" } }, + "node_modules/dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, "node_modules/domexception": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", @@ -2384,26 +2902,15 @@ "node": ">=8" } }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.3.886", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.886.tgz", - "integrity": "sha512-+vYdeBosI63VkCtNWnEVFjgNd/IZwvnsWkKyPtWAvrhA+XfByKoBJcbsMgudVU/bUcGAF9Xp3aXn96voWlc3oQ==" + "version": "1.4.363", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.363.tgz", + "integrity": "sha512-ReX5qgmSU7ybhzMuMdlJAdYnRhT90UB3k9M05O5nF5WH3wR5wgdJjXw0uDeFyKNhmglmQiOxkAbzrP0hMKM59g==" }, "node_modules/emittery": { "version": "0.8.1", @@ -2421,12 +2928,60 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/engine.io": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", + "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", "dependencies": { - "once": "^1.4.0" + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.11.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", + "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } } }, "node_modules/enquirer": { @@ -2440,6 +2995,11 @@ "node": ">=8.6" } }, + "node_modules/ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==" + }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2448,6 +3008,42 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/esbuild": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", + "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.16.17", + "@esbuild/android-arm64": "0.16.17", + "@esbuild/android-x64": "0.16.17", + "@esbuild/darwin-arm64": "0.16.17", + "@esbuild/darwin-x64": "0.16.17", + "@esbuild/freebsd-arm64": "0.16.17", + "@esbuild/freebsd-x64": "0.16.17", + "@esbuild/linux-arm": "0.16.17", + "@esbuild/linux-arm64": "0.16.17", + "@esbuild/linux-ia32": "0.16.17", + "@esbuild/linux-loong64": "0.16.17", + "@esbuild/linux-mips64el": "0.16.17", + "@esbuild/linux-ppc64": "0.16.17", + "@esbuild/linux-riscv64": "0.16.17", + "@esbuild/linux-s390x": "0.16.17", + "@esbuild/linux-x64": "0.16.17", + "@esbuild/netbsd-x64": "0.16.17", + "@esbuild/openbsd-x64": "0.16.17", + "@esbuild/sunos-x64": "0.16.17", + "@esbuild/win32-arm64": "0.16.17", + "@esbuild/win32-ia32": "0.16.17", + "@esbuild/win32-x64": "0.16.17" + } + }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -2456,13 +3052,10 @@ "node": ">=6" } }, - "node_modules/escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "engines": { - "node": ">=8" - } + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/escape-string-regexp": { "version": "4.0.0", @@ -2700,9 +3293,9 @@ } }, "node_modules/eslint-plugin-node/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -2893,6 +3486,11 @@ "node": ">=4.0" } }, + "node_modules/estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" + }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", @@ -2901,6 +3499,11 @@ "node": ">=0.10.0" } }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -2931,32 +3534,10 @@ "node": ">= 0.8.0" } }, - "node_modules/expect": { - "version": "27.3.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.3.1.tgz", - "integrity": "sha512-MrNXV2sL9iDRebWPGOGFdPQRl2eDQNu/uhxIMShjjx74T6kC6jFIkmQ6OqXDtevjGUkyB2IT56RzDBqXf/QPCg==", - "dependencies": { - "@jest/types": "^27.2.5", - "ansi-styles": "^5.0.0", - "jest-get-type": "^27.3.1", - "jest-matcher-utils": "^27.3.1", - "jest-message-util": "^27.3.1", - "jest-regex-util": "^27.0.6" - }, - "engines": { - "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" - } - }, - "node_modules/expect/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "node_modules/external-editor": { "version": "3.1.0", @@ -3085,6 +3666,47 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/finalhandler/node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -3110,9 +3732,28 @@ } }, "node_modules/flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==" + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } }, "node_modules/form-data": { "version": "3.0.1", @@ -3192,6 +3833,19 @@ "node": "6.* || 8.* || >= 10.*" } }, + "node_modules/get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -3241,20 +3895,6 @@ "node": ">= 6" } }, - "node_modules/global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/globals": { "version": "13.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.12.0.tgz", @@ -3288,47 +3928,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/got/node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/gts": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/gts/-/gts-3.1.0.tgz", - "integrity": "sha512-Pbj3ob1VR1IRlEVEBNtKoQ1wHOa8cZz62KEojK8Fn/qeS2ClWI4gLNfhek3lD68aZSmUEg8TFb6AHXIwUMgyqQ==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/gts/-/gts-3.1.1.tgz", + "integrity": "sha512-Jw44aBbzMnd1vtZs7tZt3LMstKQukCBg7N4CKVGzviIQ45Cz5b9lxDJGXVKj/9ySuGv6TYEeijZJGbiiVcM27w==", "dependencies": { "@typescript-eslint/eslint-plugin": "^4.2.0", "@typescript-eslint/parser": "^4.2.0", @@ -3344,7 +3952,6 @@ "ncp": "^2.0.0", "prettier": "^2.1.2", "rimraf": "^3.0.2", - "update-notifier": "^5.0.0", "write-file-atomic": "^3.0.3" }, "bin": { @@ -3384,12 +3991,15 @@ "node": ">=8" } }, - "node_modules/has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/hosted-git-info": { @@ -3419,10 +4029,41 @@ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } }, "node_modules/http-proxy-agent": { "version": "4.0.1", @@ -3438,9 +4079,9 @@ } }, "node_modules/https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dependencies": { "agent-base": "6", "debug": "4" @@ -3496,14 +4137,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "engines": { - "node": ">=4" - } - }, "node_modules/import-local": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.3.tgz", @@ -3549,14 +4182,6 @@ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, - "node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "engines": { - "node": ">=10" - } - }, "node_modules/inquirer": { "version": "7.3.3", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz", @@ -3593,22 +4218,17 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "dependencies": { - "ci-info": "^2.0.0" + "binary-extensions": "^2.0.0" }, - "bin": { - "is-ci": "bin.js" + "engines": { + "node": ">=8" } }, - "node_modules/is-ci/node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" - }, "node_modules/is-core-module": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", @@ -3655,32 +4275,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -3689,14 +4283,6 @@ "node": ">=0.12.0" } }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "engines": { - "node": ">=8" - } - }, "node_modules/is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", @@ -3742,10 +4328,16 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, - "node_modules/is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + "node_modules/isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==", + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } }, "node_modules/isexe": { "version": "2.0.0", @@ -3775,9 +4367,9 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -3820,6 +4412,39 @@ "node": ">=8" } }, + "node_modules/jasmine": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-4.6.0.tgz", + "integrity": "sha512-iq7HQ5M8ydNUspjd9vbFW9Lu+6lQ1QLDIqjl0WysEllF5EJZy8XaUyNlhCJVwOx2YFzqTtARWbS56F/f0PzRFw==", + "dependencies": { + "glob": "^7.1.6", + "jasmine-core": "^4.6.0" + }, + "bin": { + "jasmine": "bin/jasmine.js" + } + }, + "node_modules/jasmine-core": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.0.tgz", + "integrity": "sha512-O236+gd0ZXS8YAjFx8xKaJ94/erqUliEkJTDedyE7iHvv4ZVqi+q+8acJxu05/WJDKm512EUNn809In37nWlAQ==" + }, + "node_modules/jasmine-expect": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/jasmine-expect/-/jasmine-expect-5.0.0.tgz", + "integrity": "sha512-byn1zq0EQBA9UKs5A+H6gk5TRcanV+TqQMRxrjurGuqKkclaqgjw/vV6aT/jtf5tabXGonTH6VDZJ33Z1pxSxw==", + "dependencies": { + "add-matchers": "0.6.2" + } + }, + "node_modules/jasmine-spec-reporter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-7.0.0.tgz", + "integrity": "sha512-OtC7JRasiTcjsaCBPtMO0Tl8glCejM4J4/dNuOJdA8lBjz4PmWjYQ6pzb0uzpBNAWJMDudYuj9OdXJWqM2QTJg==", + "dependencies": { + "colors": "1.4.0" + } + }, "node_modules/jest": { "version": "27.3.1", "resolved": "https://registry.npmjs.org/jest/-/jest-27.3.1.tgz", @@ -3886,6 +4511,20 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-circus/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, "node_modules/jest-cli": { "version": "27.3.1", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.3.1.tgz", @@ -4198,9 +4837,9 @@ } }, "node_modules/jest-get-type": { - "version": "27.3.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.3.1.tgz", - "integrity": "sha512-+Ilqi8hgHSAdhlQ3s12CAVNd8H96ZkQBfYoXmArzZnOfAtVAJEiPDBirjByEblvG/4LPJmkL+nBqPO3A1YJAEg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } @@ -4258,6 +4897,20 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-jasmine2/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, "node_modules/jest-leak-detector": { "version": "27.3.1", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.3.1.tgz", @@ -4271,31 +4924,69 @@ } }, "node_modules/jest-matcher-utils": { - "version": "27.3.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.3.1.tgz", - "integrity": "sha512-hX8N7zXS4k+8bC1Aj0OWpGb7D3gIXxYvPNK1inP5xvE4ztbz3rc4AkI6jGVaerepBnfWB17FL5lWFJT3s7qo8w==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", "dependencies": { "chalk": "^4.0.0", - "jest-diff": "^27.3.1", - "jest-get-type": "^27.3.1", - "pretty-format": "^27.3.1" + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" }, "engines": { "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, "node_modules/jest-message-util": { - "version": "27.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.3.1.tgz", - "integrity": "sha512-bh3JEmxsTZ/9rTm0jQrPElbY2+y48Rw2t47uMfByNyUVR+OfPh4anuyKsGqsNkXk/TI4JbLRZx+7p7Hdt6q1yg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", "dependencies": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.2.5", + "@jest/types": "^27.5.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^27.3.1", + "pretty-format": "^27.5.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -4314,6 +5005,30 @@ "node": ">=6.9.0" } }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, "node_modules/jest-mock": { "version": "27.3.0", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.3.0.tgz", @@ -4522,6 +5237,20 @@ "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" } }, + "node_modules/jest-snapshot/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, "node_modules/jest-util": { "version": "27.3.1", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.3.1.tgz", @@ -4583,9 +5312,9 @@ } }, "node_modules/jest-worker": { - "version": "27.3.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.3.1.tgz", - "integrity": "sha512-ks3WCzsiZaOPJl/oMsDjaf0TRiSv7ctNgs0FqRr2nARsovz6AWWy4oLElwcquGSz692DzgZQrCLScPNs5YlC4g==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -4705,11 +5434,6 @@ "node": ">=4" } }, - "node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" - }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -4755,12 +5479,207 @@ "node": ">= 10.0.0" } }, - "node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "node_modules/karma": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.1.tgz", + "integrity": "sha512-Cj57NKOskK7wtFWSlMvZf459iX+kpYIPXmkNUzP2WAFcA7nhr/ALn5R7sw3w+1udFDcpMx/tuB8d5amgm3ijaA==", + "dependencies": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.4.1", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/karma-chrome-launcher": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz", + "integrity": "sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ==", + "dependencies": { + "which": "^1.2.1" + } + }, + "node_modules/karma-chrome-launcher/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/karma-esbuild": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/karma-esbuild/-/karma-esbuild-2.2.5.tgz", + "integrity": "sha512-+NiRmZhUm/MqOsL1cAu8+RmiOMvIxWDaeYDLBB5upxHF9Hh3Og8YH43EAmDan40pxt2FKDcOjupgqIe4Tx2szQ==", + "dependencies": { + "chokidar": "^3.5.1", + "source-map": "0.6.1" + }, + "peerDependencies": { + "esbuild": ">=0.8.45" + } + }, + "node_modules/karma-jasmine": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", + "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", + "dependencies": { + "jasmine-core": "^4.1.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "karma": "^6.0.0" + } + }, + "node_modules/karma-jasmine-matchers": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-matchers/-/karma-jasmine-matchers-5.0.0.tgz", + "integrity": "sha512-XnwKFbeQ8vqCkL/6bLiCFsHR4+TWTIVByuUYFrPM38JBD1hb7TNLP7cPRkQs4QBNWQ1o8z/u4EOetQC2ZFMb8A==", + "dependencies": { + "jasmine-expect": "5.0.0" + } + }, + "node_modules/karma-mocha-reporter": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz", + "integrity": "sha512-Hr6nhkIp0GIJJrvzY8JFeHpQZNseuIakGac4bpw8K1+5F0tLb6l7uvXRa8mt2Z+NVwYgCct4QAfp2R2QP6o00w==", + "dependencies": { + "chalk": "^2.1.0", + "log-symbols": "^2.1.0", + "strip-ansi": "^4.0.0" + }, + "peerDependencies": { + "karma": ">=0.13" + } + }, + "node_modules/karma-mocha-reporter/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/karma-mocha-reporter/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/karma-mocha-reporter/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dependencies": { - "json-buffer": "3.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/karma-mocha-reporter/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/karma-mocha-reporter/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/karma-mocha-reporter/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/karma-mocha-reporter/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/karma-mocha-reporter/node_modules/strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "dependencies": { + "ansi-regex": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/karma-mocha-reporter/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/karma/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" } }, "node_modules/kind-of": { @@ -4779,17 +5698,6 @@ "node": ">=6" } }, - "node_modules/latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -4881,27 +5789,109 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, - "node_modules/lodash.toarray": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-3.0.2.tgz", - "integrity": "sha1-KyBPD6T1HChcbwDIHRzqWiMEEXk=", - "dependencies": { - "lodash._arraycopy": "^3.0.0", - "lodash._basevalues": "^3.0.0", - "lodash.keys": "^3.0.0" + "node_modules/lodash.toarray": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-3.0.2.tgz", + "integrity": "sha1-KyBPD6T1HChcbwDIHRzqWiMEEXk=", + "dependencies": { + "lodash._arraycopy": "^3.0.0", + "lodash._basevalues": "^3.0.0", + "lodash.keys": "^3.0.0" + } + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", + "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" + }, + "node_modules/log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dependencies": { + "chalk": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/log-symbols/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/log-symbols/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" } }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" + "node_modules/log-symbols/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "node_modules/log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + }, "engines": { - "node": ">=0.10.0" + "node": ">=8.0" } }, "node_modules/lru-cache": { @@ -4915,6 +5905,14 @@ "node": ">=10" } }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -4930,9 +5928,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "bin": { "semver": "bin/semver.js" } @@ -4961,6 +5959,14 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/meow": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", @@ -5022,20 +6028,31 @@ "node": ">=8.6" } }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/mime-db": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", - "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==", + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { - "version": "2.1.33", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", - "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dependencies": { - "mime-db": "1.50.0" + "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" @@ -5049,14 +6066,6 @@ "node": ">=6" } }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "engines": { - "node": ">=4" - } - }, "node_modules/min-indent": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", @@ -5094,6 +6103,17 @@ "node": ">= 6" } }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -5117,6 +6137,14 @@ "ncp": "bin/ncp" } }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/node-hrx": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/node-hrx/-/node-hrx-0.1.0.tgz", @@ -5136,9 +6164,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==" + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" }, "node_modules/normalize-package-data": { "version": "3.0.3", @@ -5162,14 +6190,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "engines": { - "node": ">=8" - } - }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -5186,6 +6206,33 @@ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -5232,14 +6279,6 @@ "node": ">=0.10.0" } }, - "node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "engines": { - "node": ">=6" - } - }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -5287,28 +6326,6 @@ "node": ">=6" } }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/package-json/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -5342,6 +6359,14 @@ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -5425,14 +6450,6 @@ "node": ">= 0.8.0" } }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "engines": { - "node": ">=4" - } - }, "node_modules/prettier": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", @@ -5505,15 +6522,6 @@ "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -5522,17 +6530,33 @@ "node": ">=6" } }, - "node_modules/pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "node_modules/qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { - "escape-goat": "^2.0.0" + "side-channel": "^1.0.4" }, "engines": { - "node": ">=8" + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -5560,31 +6584,26 @@ "node": ">=8" } }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" } }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" - }, - "node_modules/rc/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": ">= 0.8" } }, "node_modules/react-is": { @@ -5647,9 +6666,9 @@ } }, "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "bin": { "semver": "bin/semver" } @@ -5662,6 +6681,17 @@ "node": ">=8" } }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -5685,28 +6715,6 @@ "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -5723,6 +6731,11 @@ "node": ">=0.10.0" } }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, "node_modules/resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", @@ -5770,14 +6783,6 @@ "node": ">=10" } }, - "node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -5799,6 +6804,11 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -5813,6 +6823,33 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rollup-plugin-inject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", + "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject.", + "dependencies": { + "estree-walker": "^0.6.1", + "magic-string": "^0.25.3", + "rollup-pluginutils": "^2.8.1" + } + }, + "node_modules/rollup-plugin-node-polyfills": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", + "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", + "dependencies": { + "rollup-plugin-inject": "^3.0.0" + } + }, + "node_modules/rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "dependencies": { + "estree-walker": "^0.6.1" + } + }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -5876,9 +6913,9 @@ } }, "node_modules/semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dependencies": { "lru-cache": "^6.0.0" }, @@ -5889,24 +6926,10 @@ "node": ">=10" } }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/semver-diff/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "bin": { - "semver": "bin/semver.js" - } + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/shebang-command": { "version": "2.0.0", @@ -5927,6 +6950,19 @@ "node": ">=8" } }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/signal-exit": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", @@ -5961,6 +6997,62 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, + "node_modules/socket.io": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", + "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.4.1", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "dependencies": { + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/socket.io-parser": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.3.tgz", + "integrity": "sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==", + "dependencies": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -5986,6 +7078,12 @@ "source-map": "^0.6.0" } }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead" + }, "node_modules/spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -6038,6 +7136,48 @@ "node": ">=8" } }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "dependencies": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/streamroller/node_modules/fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + }, + "engines": { + "node": ">=6 <7 || >=8" + } + }, + "node_modules/streamroller/node_modules/jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -6243,14 +7383,6 @@ "node": ">=4" } }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "engines": { - "node": ">=6" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6262,19 +7394,36 @@ "node": ">=8.0" } }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, "node_modules/tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", - "universalify": "^0.1.2" + "universalify": "^0.2.0", + "url-parse": "^1.5.3" }, "engines": { "node": ">=6" } }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "engines": { + "node": ">= 4.0.0" + } + }, "node_modules/tr46": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", @@ -6295,9 +7444,9 @@ } }, "node_modules/ts-jest": { - "version": "27.0.7", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.0.7.tgz", - "integrity": "sha512-O41shibMqzdafpuP+CkrOL7ykbmLh+FqQrXEmV9CydQ5JBk0Sj0uAEF5TNNe94fZWKm3yYvWa/IbyV4Yg1zK2Q==", + "version": "27.1.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.5.tgz", + "integrity": "sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==", "dependencies": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", @@ -6330,6 +7479,9 @@ }, "babel-jest": { "optional": true + }, + "esbuild": { + "optional": true } } }, @@ -6449,6 +7601,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -6469,15 +7633,22 @@ "node": ">=4.2.0" } }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dependencies": { - "crypto-random-string": "^2.0.0" - }, + "node_modules/ua-parser-js": { + "version": "0.7.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", + "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], "engines": { - "node": ">=8" + "node": "*" } }, "node_modules/universalify": { @@ -6488,31 +7659,37 @@ "node": ">= 4.0.0" } }, - "node_modules/update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], "dependencies": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" + "escalade": "^3.1.1", + "picocolors": "^1.0.0" }, - "engines": { - "node": ">=10" + "bin": { + "browserslist-lint": "cli.js" }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" + "peerDependencies": { + "browserslist": ">= 4.21.0" } }, "node_modules/uri-js": { @@ -6523,15 +7700,21 @@ "punycode": "^2.1.0" } }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dependencies": { - "prepend-http": "^2.0.0" - }, + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", "engines": { - "node": ">=4" + "node": ">= 0.4.0" } }, "node_modules/v8-compile-cache": { @@ -6569,6 +7752,22 @@ "spdx-expression-parse": "^3.0.0" } }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -6644,21 +7843,10 @@ "node": ">= 8" } }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==", "engines": { "node": ">=0.10.0" } @@ -6715,14 +7903,6 @@ } } }, - "node_modules/xdg-basedir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", - "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", - "engines": { - "node": ">=8" - } - }, "node_modules/xml-name-validator": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", @@ -6747,17 +7927,17 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yargs": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", - "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" @@ -6771,6 +7951,27 @@ "node": ">=10" } }, + "node_modules/yargs/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "engines": { + "node": ">=12" + } + }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", @@ -6790,9 +7991,9 @@ } }, "@babel/compat-data": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.0.tgz", - "integrity": "sha512-DGjt2QZse5SGd9nfOSqO4WLJ8NN/oHkijbXbPrxuoJO3oIPJL3TciZs9FX+cOHNiY9E9l0opL8g7BmLe3T+9ew==" + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.4.tgz", + "integrity": "sha512-/DYyDpeCfaVinT40FPGdkkb+lYSKvsVuMjDAG7jPOWWiM1ibOaB9CXJAlc4d1QpP/U2q2P9jbrSlClKSErd55g==" }, "@babel/core": { "version": "7.16.0", @@ -6825,9 +8026,9 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" }, "source-map": { "version": "0.5.7", @@ -6837,146 +8038,128 @@ } }, "@babel/generator": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", - "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", + "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", "requires": { - "@babel/types": "^7.16.0", - "jsesc": "^2.5.1", - "source-map": "^0.5.0" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" - } + "@babel/types": "^7.21.4", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" } }, "@babel/helper-compilation-targets": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.0.tgz", - "integrity": "sha512-S7iaOT1SYlqK0sQaCi21RX4+13hmdmnxIEAnQUB/eh7GeAnRjOUgTYpLkUOiRXzD+yog1JxP0qyAQZ7ZxVxLVg==", - "requires": { - "@babel/compat-data": "^7.16.0", - "@babel/helper-validator-option": "^7.14.5", - "browserslist": "^4.16.6", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.4.tgz", + "integrity": "sha512-Fa0tTuOXZ1iL8IeDFUWCzjZcn+sJGd9RZdH9esYVjEejGmzf+FFYQpMi/kZUk2kPy/q1H3/GPw7np8qar/stfg==", + "requires": { + "@babel/compat-data": "^7.21.4", + "@babel/helper-validator-option": "^7.21.0", + "browserslist": "^4.21.3", + "lru-cache": "^5.1.1", "semver": "^6.3.0" }, "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "requires": { + "yallist": "^3.0.2" + } + }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" } } }, - "@babel/helper-function-name": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.0.tgz", - "integrity": "sha512-BZh4mEk1xi2h4HFjWUXRQX5AEx4rvaZxHgax9gcjdLWdkjsY7MKt5p0otjsg5noXw+pB+clMCjw+aEVYADMjog==", - "requires": { - "@babel/helper-get-function-arity": "^7.16.0", - "@babel/template": "^7.16.0", - "@babel/types": "^7.16.0" - } + "@babel/helper-environment-visitor": { + "version": "7.18.9", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", + "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==" }, - "@babel/helper-get-function-arity": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.0.tgz", - "integrity": "sha512-ASCquNcywC1NkYh/z7Cgp3w31YW8aojjYIlNg4VeJiHkqyP4AzIvr4qx7pYDb4/s8YcsZWqqOSxgkvjUz1kpDQ==", + "@babel/helper-function-name": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", + "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", "requires": { - "@babel/types": "^7.16.0" + "@babel/template": "^7.20.7", + "@babel/types": "^7.21.0" } }, "@babel/helper-hoist-variables": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.0.tgz", - "integrity": "sha512-1AZlpazjUR0EQZQv3sgRNfM9mEVWPK3M6vlalczA+EECcPz3XPh6VplbErL5UoMpChhSck5wAJHthlj1bYpcmg==", - "requires": { - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-member-expression-to-functions": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.0.tgz", - "integrity": "sha512-bsjlBFPuWT6IWhl28EdrQ+gTvSvj5tqVP5Xeftp07SEuz5pLnsXZuDkDD3Rfcxy0IsHmbZ+7B2/9SHzxO0T+sQ==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", + "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.6" } }, "@babel/helper-module-imports": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.0.tgz", - "integrity": "sha512-kkH7sWzKPq0xt3H1n+ghb4xEMP8k0U7XV3kkB+ZGy69kDk2ySFW1qPi06sjKzFY3t1j6XbJSqr4mF9L7CYVyhg==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", + "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.21.4" } }, "@babel/helper-module-transforms": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz", - "integrity": "sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA==", - "requires": { - "@babel/helper-module-imports": "^7.16.0", - "@babel/helper-replace-supers": "^7.16.0", - "@babel/helper-simple-access": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/helper-validator-identifier": "^7.15.7", - "@babel/template": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" - } - }, - "@babel/helper-optimise-call-expression": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.0.tgz", - "integrity": "sha512-SuI467Gi2V8fkofm2JPnZzB/SUuXoJA5zXe/xzyPP2M04686RzFKFHPK6HDVN6JvWBIEW8tt9hPR7fXdn2Lgpw==", + "version": "7.21.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", + "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", "requires": { - "@babel/types": "^7.16.0" + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-module-imports": "^7.18.6", + "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.2", + "@babel/types": "^7.21.2" } }, "@babel/helper-plugin-utils": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz", - "integrity": "sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ==" - }, - "@babel/helper-replace-supers": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.0.tgz", - "integrity": "sha512-TQxuQfSCdoha7cpRNJvfaYxxxzmbxXw/+6cS7V02eeDYyhxderSoMVALvwupA54/pZcOTtVeJ0xccp1nGWladA==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.16.0", - "@babel/helper-optimise-call-expression": "^7.16.0", - "@babel/traverse": "^7.16.0", - "@babel/types": "^7.16.0" - } + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", + "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==" }, "@babel/helper-simple-access": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.0.tgz", - "integrity": "sha512-o1rjBT/gppAqKsYfUdfHq5Rk03lMQrkPHG1OWzHWpLgVXRH4HnMM9Et9CVdIqwkCQlobnGHEJMsgWP/jE1zUiw==", + "version": "7.20.2", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", + "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.20.2" } }, "@babel/helper-split-export-declaration": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.0.tgz", - "integrity": "sha512-0YMMRpuDFNGTHNRiiqJX19GjNXA4H0E8jZ2ibccfSxaCogbm3am5WN/2nQNj0YnQwGWM1J06GOcQ2qnh3+0paw==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", + "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", "requires": { - "@babel/types": "^7.16.0" + "@babel/types": "^7.18.6" } }, + "@babel/helper-string-parser": { + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==" + }, "@babel/helper-validator-identifier": { - "version": "7.15.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", - "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==" + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==" }, "@babel/helper-validator-option": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.14.5.tgz", - "integrity": "sha512-OX8D5eeX4XwcroVW45NMvoYaIuFI+GQpA2a8Gi+X/U/cDUIRsV37qQfF905F0htTRCREQIB4KqPeaveRJUl3Ow==" + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", + "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==" }, "@babel/helpers": { "version": "7.16.0", @@ -6989,11 +8172,11 @@ } }, "@babel/highlight": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.0.tgz", - "integrity": "sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g==", + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-validator-identifier": "^7.18.6", "chalk": "^2.0.0", "js-tokens": "^4.0.0" }, @@ -7050,9 +8233,9 @@ } }, "@babel/parser": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.0.tgz", - "integrity": "sha512-TEHWXf0xxpi9wKVyBCmRcSSDjbJ/cl6LUdlbYUHEaNQUJGhreJbZrXT6sR4+fZLxVUJqNRB4KyOvjuy/D9009A==" + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", + "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==" }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", @@ -7159,47 +8342,48 @@ } }, "@babel/template": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", - "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "version": "7.20.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", + "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0" + "@babel/code-frame": "^7.18.6", + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7" }, "dependencies": { "@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "requires": { - "@babel/highlight": "^7.16.0" + "@babel/highlight": "^7.18.6" } } } }, "@babel/traverse": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.0.tgz", - "integrity": "sha512-qQ84jIs1aRQxaGaxSysII9TuDaguZ5yVrEuC0BN2vcPlalwfLovVmCjbFDPECPXcYM/wLvNFfp8uDOliLxIoUQ==", - "requires": { - "@babel/code-frame": "^7.16.0", - "@babel/generator": "^7.16.0", - "@babel/helper-function-name": "^7.16.0", - "@babel/helper-hoist-variables": "^7.16.0", - "@babel/helper-split-export-declaration": "^7.16.0", - "@babel/parser": "^7.16.0", - "@babel/types": "^7.16.0", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", + "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", + "requires": { + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.4", + "@babel/helper-environment-visitor": "^7.18.9", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.21.4", + "@babel/types": "^7.21.4", "debug": "^4.1.0", "globals": "^11.1.0" }, "dependencies": { "@babel/code-frame": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.0.tgz", - "integrity": "sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "requires": { - "@babel/highlight": "^7.16.0" + "@babel/highlight": "^7.18.6" } }, "globals": { @@ -7210,11 +8394,12 @@ } }, "@babel/types": { - "version": "7.16.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.0.tgz", - "integrity": "sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg==", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", + "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", "requires": { - "@babel/helper-validator-identifier": "^7.15.7", + "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" } }, @@ -7223,6 +8408,11 @@ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==" + }, "@cspotcode/source-map-consumer": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-consumer/-/source-map-consumer-0.8.0.tgz", @@ -7236,6 +8426,147 @@ "@cspotcode/source-map-consumer": "0.8.0" } }, + "@esbuild-plugins/node-modules-polyfill": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@esbuild-plugins/node-modules-polyfill/-/node-modules-polyfill-0.2.2.tgz", + "integrity": "sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==", + "requires": { + "escape-string-regexp": "^4.0.0", + "rollup-plugin-node-polyfills": "^0.2.1" + } + }, + "@esbuild/android-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.16.17.tgz", + "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", + "optional": true + }, + "@esbuild/android-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", + "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", + "optional": true + }, + "@esbuild/android-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.16.17.tgz", + "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", + "optional": true + }, + "@esbuild/darwin-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", + "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", + "optional": true + }, + "@esbuild/darwin-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", + "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", + "optional": true + }, + "@esbuild/freebsd-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", + "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", + "optional": true + }, + "@esbuild/freebsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", + "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", + "optional": true + }, + "@esbuild/linux-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", + "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", + "optional": true + }, + "@esbuild/linux-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", + "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", + "optional": true + }, + "@esbuild/linux-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", + "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", + "optional": true + }, + "@esbuild/linux-loong64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", + "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", + "optional": true + }, + "@esbuild/linux-mips64el": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", + "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", + "optional": true + }, + "@esbuild/linux-ppc64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", + "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", + "optional": true + }, + "@esbuild/linux-riscv64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", + "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", + "optional": true + }, + "@esbuild/linux-s390x": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", + "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", + "optional": true + }, + "@esbuild/linux-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", + "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", + "optional": true + }, + "@esbuild/netbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", + "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", + "optional": true + }, + "@esbuild/openbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", + "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", + "optional": true + }, + "@esbuild/sunos-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", + "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", + "optional": true + }, + "@esbuild/win32-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", + "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", + "optional": true + }, + "@esbuild/win32-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", + "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", + "optional": true + }, + "@esbuild/win32-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", + "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", + "optional": true + }, "@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -7412,6 +8743,19 @@ "@jest/environment": "^27.3.1", "@jest/types": "^27.2.5", "expect": "^27.3.1" + }, + "dependencies": { + "expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "requires": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + } + } } }, "@jest/reporters": { @@ -7501,9 +8845,9 @@ } }, "@jest/types": { - "version": "27.2.5", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.2.5.tgz", - "integrity": "sha512-nmuM4VuDtCZcY+eTpw+0nvstwReMsjPoj7ZR80/BbixulhLaiX+fbv8oeLW8WZlJMcsGQsTmMKT/iTZu1Uy/lQ==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", "requires": { "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", @@ -7522,6 +8866,47 @@ } } }, + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==" + }, + "@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==" + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "requires": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + }, + "dependencies": { + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + } + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -7561,6 +8946,11 @@ "@sinonjs/commons": "^1.7.0" } }, + "@socket.io/component-emitter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", + "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==" + }, "@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -7623,6 +9013,19 @@ "@babel/types": "^7.3.0" } }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "@types/cors": { + "version": "2.8.13", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", + "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "requires": { + "@types/node": "*" + } + }, "@types/data-urls": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/data-urls/-/data-urls-2.0.1.tgz", @@ -7680,6 +9083,19 @@ "@types/istanbul-lib-report": "*" } }, + "@types/jasmine": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.3.1.tgz", + "integrity": "sha512-Vu8l+UGcshYmV1VWwULgnV/2RDbBaO6i2Ptx7nd//oJPIZGhoI1YLST4VKagD2Pq/Bc2/7zvtvhM7F3p4SN7kQ==" + }, + "@types/jasmine-expect": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/@types/jasmine-expect/-/jasmine-expect-3.8.1.tgz", + "integrity": "sha512-th6GNWDqK4lFWDsJrG8KVBRNdZ9GNHFqFUAtFal110OB0ET0v+tJwJ/xHV0i4xRXmohtpcXd3X0whovgbQVteg==", + "requires": { + "jasmine-expect": "*" + } + }, "@types/jest": { "version": "27.0.2", "resolved": "https://registry.npmjs.org/@types/jest/-/jest-27.0.2.tgz", @@ -7699,6 +9115,15 @@ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==" }, + "@types/karma": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@types/karma/-/karma-6.3.3.tgz", + "integrity": "sha512-nRMec4mTCt+tkpRqh5/pAxmnjzEgAaalIq7mdfLFH88gSRC8+bxejLiSjHMMT/vHIhJHqg4GPIGCnCFbwvDRww==", + "requires": { + "@types/node": "*", + "log4js": "^6.4.1" + } + }, "@types/lodash": { "version": "4.14.176", "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.176.tgz", @@ -7855,6 +9280,15 @@ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, "acorn": { "version": "7.4.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", @@ -7872,13 +9306,19 @@ "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==" + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "requires": {} }, "acorn-walk": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" }, + "add-matchers": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/add-matchers/-/add-matchers-0.6.2.tgz", + "integrity": "sha512-hVO2wodMei9RF00qe+506MoeJ/NEOdCMEkSJ12+fC3hx/5Z4zmhNiP92nJEF6XhmXokeB0hOtuQrjHCx2vmXrQ==" + }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -8019,9 +9459,9 @@ } }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -8069,6 +9509,50 @@ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -8092,15 +9576,14 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "browserslist": { - "version": "4.17.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.17.5.tgz", - "integrity": "sha512-I3ekeB92mmpctWBoLXe0d5wPS2cBuRvvW0JyyJHMrk9/HmP2ZjrTboNAZ8iuGqaEIlKguljbQY32OkOJIRrgoA==", + "version": "4.21.5", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", + "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", "requires": { - "caniuse-lite": "^1.0.30001271", - "electron-to-chromium": "^1.3.878", - "escalade": "^3.1.1", - "node-releases": "^2.0.1", - "picocolors": "^1.0.0" + "caniuse-lite": "^1.0.30001449", + "electron-to-chromium": "^1.4.284", + "node-releases": "^2.0.8", + "update-browserslist-db": "^1.0.10" } }, "bs-logger": { @@ -8124,6 +9607,20 @@ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -8145,9 +9642,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001274", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001274.tgz", - "integrity": "sha512-+Nkvv0fHyhISkiMIjnyjmf5YJcQ1IQHZN6U9TLUMroWR38FNwpsC51Gb68yueafX1V6ifOisInSgP9WJFS13ew==" + "version": "1.0.30001478", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001478.tgz", + "integrity": "sha512-gMhDyXGItTHipJj2ApIvR+iVB5hd0KP3svMWWXDvZOmjzJJassGLMfxRkQCSYgGd2gtdL/ReeiyvMSFD1Ss6Mw==" }, "chalk": { "version": "4.1.2", @@ -8168,6 +9665,21 @@ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==" }, + "chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, "ci-info": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", @@ -8229,6 +9741,11 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -8242,6 +9759,37 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==" + }, "convert-source-map": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", @@ -8250,6 +9798,20 @@ "safe-buffer": "~5.1.1" } }, + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", @@ -8285,6 +9847,11 @@ } } }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha512-GAj5FOq0Hd+RsCGVJxZuKaIDXDf3h6GQoNEjFgbLLI/trgtavwUbSnZ5pVfg27DVCaWjIohryS0JFwIJyT2cMg==" + }, "data-urls": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.1.tgz", @@ -8324,10 +9891,15 @@ } } }, + "date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==" + }, "debug": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.2.tgz", - "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "requires": { "ms": "2.1.2" } @@ -8393,20 +9965,35 @@ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" + }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==" }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha512-uJaamHkagcZtHPqCIHZxnFrXlunQXgBOsZSUOWwFw31QJCAbyTBoHMW75YOTur5ZNx8pIeAKgf6GWIgaqqiLhA==" + }, "diff": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==" }, "diff-sequences": { - "version": "27.0.6", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.0.6.tgz", - "integrity": "sha512-ag6wfpBFyNXZ0p8pcuIDS//D8H062ZQJ3fzYxjpmeKjnz8W4pekL3AI8VohmyZmsWW2PWaHgjsmqR6L13101VQ==" + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==" }, "dir-glob": { "version": "3.0.1", @@ -8424,6 +10011,17 @@ "esutils": "^2.0.2" } }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha512-Yra4DbvoW7/Z6LBN560ZwXMjoNOSAN2wRsKFGc4iBeso+mpIA6qj1vfdf9HpMaKAqG6wXTy+1SYEzmNpKXOSsQ==", + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, "domexception": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", @@ -8439,10 +10037,15 @@ } } }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, "electron-to-chromium": { - "version": "1.3.886", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.886.tgz", - "integrity": "sha512-+vYdeBosI63VkCtNWnEVFjgNd/IZwvnsWkKyPtWAvrhA+XfByKoBJcbsMgudVU/bUcGAF9Xp3aXn96voWlc3oQ==" + "version": "1.4.363", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.363.tgz", + "integrity": "sha512-ReX5qgmSU7ybhzMuMdlJAdYnRhT90UB3k9M05O5nF5WH3wR5wgdJjXw0uDeFyKNhmglmQiOxkAbzrP0hMKM59g==" }, "emittery": { "version": "0.8.1", @@ -8454,6 +10057,41 @@ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "engine.io": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", + "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", + "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.11.0" + }, + "dependencies": { + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "requires": {} + } + } + }, + "engine.io-parser": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", + "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==" + }, "enquirer": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", @@ -8462,6 +10100,11 @@ "ansi-colors": "^4.1.1" } }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==" + }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -8470,11 +10113,45 @@ "is-arrayish": "^0.2.1" } }, + "esbuild": { + "version": "0.16.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz", + "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", + "requires": { + "@esbuild/android-arm": "0.16.17", + "@esbuild/android-arm64": "0.16.17", + "@esbuild/android-x64": "0.16.17", + "@esbuild/darwin-arm64": "0.16.17", + "@esbuild/darwin-x64": "0.16.17", + "@esbuild/freebsd-arm64": "0.16.17", + "@esbuild/freebsd-x64": "0.16.17", + "@esbuild/linux-arm": "0.16.17", + "@esbuild/linux-arm64": "0.16.17", + "@esbuild/linux-ia32": "0.16.17", + "@esbuild/linux-loong64": "0.16.17", + "@esbuild/linux-mips64el": "0.16.17", + "@esbuild/linux-ppc64": "0.16.17", + "@esbuild/linux-riscv64": "0.16.17", + "@esbuild/linux-s390x": "0.16.17", + "@esbuild/linux-x64": "0.16.17", + "@esbuild/netbsd-x64": "0.16.17", + "@esbuild/openbsd-x64": "0.16.17", + "@esbuild/sunos-x64": "0.16.17", + "@esbuild/win32-arm64": "0.16.17", + "@esbuild/win32-ia32": "0.16.17", + "@esbuild/win32-x64": "0.16.17" + } + }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -8623,7 +10300,8 @@ "eslint-config-prettier": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz", - "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==" + "integrity": "sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg==", + "requires": {} }, "eslint-plugin-es": { "version": "3.0.1", @@ -8676,9 +10354,9 @@ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==" }, "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -8769,11 +10447,21 @@ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" }, + "estree-walker": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", + "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==" + }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, "execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -8795,25 +10483,10 @@ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=" }, - "expect": { - "version": "27.3.1", - "resolved": "https://registry.npmjs.org/expect/-/expect-27.3.1.tgz", - "integrity": "sha512-MrNXV2sL9iDRebWPGOGFdPQRl2eDQNu/uhxIMShjjx74T6kC6jFIkmQ6OqXDtevjGUkyB2IT56RzDBqXf/QPCg==", - "requires": { - "@jest/types": "^27.2.5", - "ansi-styles": "^5.0.0", - "jest-get-type": "^27.3.1", - "jest-matcher-utils": "^27.3.1", - "jest-message-util": "^27.3.1", - "jest-regex-util": "^27.0.6" - }, - "dependencies": { - "ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" - } - } + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, "external-editor": { "version": "3.1.0", @@ -8919,6 +10592,43 @@ "to-regex-range": "^5.0.1" } }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "requires": { + "ee-first": "1.1.1" + } + } + } + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -8938,9 +10648,14 @@ } }, "flatted": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.2.tgz", - "integrity": "sha512-JaTY/wtrcSyvXJl4IMFHPKyFur1sE9AUqc0QnhOaJ0CxHtAoIV8pYDzeEfAaNEtGkOfq4gr3LBFmdXW5mOQFnA==" + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" }, "form-data": { "version": "3.0.1", @@ -9000,6 +10715,16 @@ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" }, + "get-intrinsic": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", + "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" + } + }, "get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", @@ -9053,9 +10778,9 @@ } }, "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "gts": { "version": "3.1.1", @@ -9097,6 +10822,11 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" + }, "hosted-git-info": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.0.2.tgz", @@ -9118,6 +10848,35 @@ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "dependencies": { + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" + } + } + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, "http-proxy-agent": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", @@ -9129,9 +10888,9 @@ } }, "https-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", - "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "requires": { "agent-base": "6", "debug": "4" @@ -9235,6 +10994,14 @@ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "requires": { + "binary-extensions": "^2.0.0" + } + }, "is-core-module": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.0.tgz", @@ -9301,6 +11068,11 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, + "isbinaryfile": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz", + "integrity": "sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==" + }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -9323,9 +11095,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -9358,6 +11130,36 @@ "istanbul-lib-report": "^3.0.0" } }, + "jasmine": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-4.6.0.tgz", + "integrity": "sha512-iq7HQ5M8ydNUspjd9vbFW9Lu+6lQ1QLDIqjl0WysEllF5EJZy8XaUyNlhCJVwOx2YFzqTtARWbS56F/f0PzRFw==", + "requires": { + "glob": "^7.1.6", + "jasmine-core": "^4.6.0" + } + }, + "jasmine-core": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.6.0.tgz", + "integrity": "sha512-O236+gd0ZXS8YAjFx8xKaJ94/erqUliEkJTDedyE7iHvv4ZVqi+q+8acJxu05/WJDKm512EUNn809In37nWlAQ==" + }, + "jasmine-expect": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/jasmine-expect/-/jasmine-expect-5.0.0.tgz", + "integrity": "sha512-byn1zq0EQBA9UKs5A+H6gk5TRcanV+TqQMRxrjurGuqKkclaqgjw/vV6aT/jtf5tabXGonTH6VDZJ33Z1pxSxw==", + "requires": { + "add-matchers": "0.6.2" + } + }, + "jasmine-spec-reporter": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-7.0.0.tgz", + "integrity": "sha512-OtC7JRasiTcjsaCBPtMO0Tl8glCejM4J4/dNuOJdA8lBjz4PmWjYQ6pzb0uzpBNAWJMDudYuj9OdXJWqM2QTJg==", + "requires": { + "colors": "1.4.0" + } + }, "jest": { "version": "27.3.1", "resolved": "https://registry.npmjs.org/jest/-/jest-27.3.1.tgz", @@ -9402,6 +11204,19 @@ "slash": "^3.0.0", "stack-utils": "^2.0.3", "throat": "^6.0.1" + }, + "dependencies": { + "expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "requires": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + } + } } }, "jest-cli": { @@ -9646,9 +11461,9 @@ } }, "jest-get-type": { - "version": "27.3.1", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.3.1.tgz", - "integrity": "sha512-+Ilqi8hgHSAdhlQ3s12CAVNd8H96ZkQBfYoXmArzZnOfAtVAJEiPDBirjByEblvG/4LPJmkL+nBqPO3A1YJAEg==" + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==" }, "jest-haste-map": { "version": "27.3.1", @@ -9693,6 +11508,19 @@ "jest-util": "^27.3.1", "pretty-format": "^27.3.1", "throat": "^6.0.1" + }, + "dependencies": { + "expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "requires": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + } + } } }, "jest-leak-detector": { @@ -9705,28 +11533,56 @@ } }, "jest-matcher-utils": { - "version": "27.3.1", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.3.1.tgz", - "integrity": "sha512-hX8N7zXS4k+8bC1Aj0OWpGb7D3gIXxYvPNK1inP5xvE4ztbz3rc4AkI6jGVaerepBnfWB17FL5lWFJT3s7qo8w==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", "requires": { "chalk": "^4.0.0", - "jest-diff": "^27.3.1", - "jest-get-type": "^27.3.1", - "pretty-format": "^27.3.1" + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + }, + "jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + } + }, + "pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + } + } } }, "jest-message-util": { - "version": "27.3.1", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.3.1.tgz", - "integrity": "sha512-bh3JEmxsTZ/9rTm0jQrPElbY2+y48Rw2t47uMfByNyUVR+OfPh4anuyKsGqsNkXk/TI4JbLRZx+7p7Hdt6q1yg==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", "requires": { "@babel/code-frame": "^7.12.13", - "@jest/types": "^27.2.5", + "@jest/types": "^27.5.1", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", - "graceful-fs": "^4.2.4", + "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", - "pretty-format": "^27.3.1", + "pretty-format": "^27.5.1", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, @@ -9738,6 +11594,21 @@ "requires": { "@babel/highlight": "^7.16.0" } + }, + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==" + }, + "pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "requires": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + } } } }, @@ -9753,7 +11624,8 @@ "jest-pnp-resolver": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", - "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==" + "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", + "requires": {} }, "jest-regex-util": { "version": "27.0.6", @@ -9911,6 +11783,19 @@ "natural-compare": "^1.4.0", "pretty-format": "^27.3.1", "semver": "^7.3.2" + }, + "dependencies": { + "expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "requires": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + } + } } }, "jest-util": { @@ -9961,9 +11846,9 @@ } }, "jest-worker": { - "version": "27.3.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.3.1.tgz", - "integrity": "sha512-ks3WCzsiZaOPJl/oMsDjaf0TRiSv7ctNgs0FqRr2nARsovz6AWWy4oLElwcquGSz692DzgZQrCLScPNs5YlC4g==", + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "requires": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -10064,24 +11949,188 @@ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" }, - "json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" + "json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + }, + "dependencies": { + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + } + } + }, + "karma": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.1.tgz", + "integrity": "sha512-Cj57NKOskK7wtFWSlMvZf459iX+kpYIPXmkNUzP2WAFcA7nhr/ALn5R7sw3w+1udFDcpMx/tuB8d5amgm3ijaA==", + "requires": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.4.1", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "dependencies": { + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } + } + }, + "karma-chrome-launcher": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz", + "integrity": "sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ==", + "requires": { + "which": "^1.2.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "karma-esbuild": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/karma-esbuild/-/karma-esbuild-2.2.5.tgz", + "integrity": "sha512-+NiRmZhUm/MqOsL1cAu8+RmiOMvIxWDaeYDLBB5upxHF9Hh3Og8YH43EAmDan40pxt2FKDcOjupgqIe4Tx2szQ==", + "requires": { + "chokidar": "^3.5.1", + "source-map": "0.6.1" + } + }, + "karma-jasmine": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.1.0.tgz", + "integrity": "sha512-i/zQLFrfEpRyQoJF9fsCdTMOF5c2dK7C7OmsuKg2D0YSsuZSfQDiLuaiktbuio6F2wiCsZSnSnieIQ0ant/uzQ==", + "requires": { + "jasmine-core": "^4.1.0" + } }, - "jsonfile": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", - "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "karma-jasmine-matchers": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-matchers/-/karma-jasmine-matchers-5.0.0.tgz", + "integrity": "sha512-XnwKFbeQ8vqCkL/6bLiCFsHR4+TWTIVByuUYFrPM38JBD1hb7TNLP7cPRkQs4QBNWQ1o8z/u4EOetQC2ZFMb8A==", "requires": { - "graceful-fs": "^4.1.6", - "universalify": "^2.0.0" + "jasmine-expect": "5.0.0" + } + }, + "karma-mocha-reporter": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/karma-mocha-reporter/-/karma-mocha-reporter-2.2.5.tgz", + "integrity": "sha512-Hr6nhkIp0GIJJrvzY8JFeHpQZNseuIakGac4bpw8K1+5F0tLb6l7uvXRa8mt2Z+NVwYgCct4QAfp2R2QP6o00w==", + "requires": { + "chalk": "^2.1.0", + "log-symbols": "^2.1.0", + "strip-ansi": "^4.0.0" }, "dependencies": { - "universalify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", - "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + "ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==" + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } } } }, @@ -10192,6 +12241,77 @@ "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=" }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "requires": { + "chalk": "^2.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "log4js": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.9.1.tgz", + "integrity": "sha512-1somDdy9sChrr9/f4UlzhdaGfDR2c/SaD2a4T7qEkG4jTS57/B3qmnjLYePwQ8cqWnUHZI0iAKxMBpCZICiZ2g==", + "requires": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "flatted": "^3.2.7", + "rfdc": "^1.3.0", + "streamroller": "^3.1.5" + } + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -10200,6 +12320,14 @@ "yallist": "^4.0.0" } }, + "magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "requires": { + "sourcemap-codec": "^1.4.8" + } + }, "make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -10209,9 +12337,9 @@ }, "dependencies": { "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==" } } }, @@ -10233,6 +12361,11 @@ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==" }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" + }, "meow": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", @@ -10278,17 +12411,22 @@ "picomatch": "^2.2.3" } }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==" + }, "mime-db": { - "version": "1.50.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.50.0.tgz", - "integrity": "sha512-9tMZCDlYHqeERXEHO9f/hKfNXhre5dK2eE/krIvUjZbS2KPcqGDfNShIWS1uW9XOTKQKqK6qbeOci18rbfW77A==" + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==" }, "mime-types": { - "version": "2.1.33", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.33.tgz", - "integrity": "sha512-plLElXp7pRDd0bNZHw+nMd52vRYjLwQjygaNg7ddJ2uJtTlmnTCjWuPKxVu6//AdaRuME84SvLW91sIkBqGT0g==", + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "requires": { - "mime-db": "1.50.0" + "mime-db": "1.52.0" } }, "mimic-fn": { @@ -10309,6 +12447,11 @@ "brace-expansion": "^1.1.7" } }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, "minimist-options": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", @@ -10319,6 +12462,14 @@ "kind-of": "^6.0.3" } }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "requires": { + "minimist": "^1.2.6" + } + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -10339,6 +12490,11 @@ "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=" }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" + }, "node-hrx": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/node-hrx/-/node-hrx-0.1.0.tgz", @@ -10355,9 +12511,9 @@ "integrity": "sha1-jZ2+KJZKSsVxLpExZCEHxx6Q7EA=" }, "node-releases": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", - "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==" + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", + "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==" }, "normalize-package-data": { "version": "3.0.3", @@ -10388,6 +12544,24 @@ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz", "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==" + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "requires": { + "ee-first": "1.1.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -10475,6 +12649,11 @@ "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", @@ -10586,6 +12765,24 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==" + }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", @@ -10596,6 +12793,22 @@ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==" }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, "react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -10629,9 +12842,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==" }, "type-fest": { "version": "0.6.0", @@ -10657,6 +12870,14 @@ } } }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, "redent": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", @@ -10681,6 +12902,11 @@ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, "resolve": { "version": "1.20.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", @@ -10729,6 +12955,11 @@ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -10737,6 +12968,32 @@ "glob": "^7.1.3" } }, + "rollup-plugin-inject": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-inject/-/rollup-plugin-inject-3.0.2.tgz", + "integrity": "sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==", + "requires": { + "estree-walker": "^0.6.1", + "magic-string": "^0.25.3", + "rollup-pluginutils": "^2.8.1" + } + }, + "rollup-plugin-node-polyfills": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/rollup-plugin-node-polyfills/-/rollup-plugin-node-polyfills-0.2.1.tgz", + "integrity": "sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==", + "requires": { + "rollup-plugin-inject": "^3.0.0" + } + }, + "rollup-pluginutils": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz", + "integrity": "sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==", + "requires": { + "estree-walker": "^0.6.1" + } + }, "run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -10777,13 +13034,18 @@ } }, "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "requires": { "lru-cache": "^6.0.0" } }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -10797,6 +13059,16 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, "signal-exit": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", @@ -10822,6 +13094,44 @@ "is-fullwidth-code-point": "^3.0.0" } }, + "socket.io": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", + "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", + "requires": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.4.1", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.1" + } + }, + "socket.io-adapter": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.2.tgz", + "integrity": "sha512-87C3LO/NOMc+eMcpcxUBebGjkpMDkNBS9tf7KJqcDsmL936EChtVva71Dw2q4tQcuVC+hAUy4an2NO/sYXmwRA==", + "requires": { + "ws": "~8.11.0" + }, + "dependencies": { + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "requires": {} + } + } + }, + "socket.io-parser": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.3.tgz", + "integrity": "sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==", + "requires": { + "@socket.io/component-emitter": "~3.1.0", + "debug": "~4.3.1" + } + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -10841,6 +13151,11 @@ "source-map": "^0.6.0" } }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", @@ -10889,6 +13204,41 @@ } } }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" + }, + "streamroller": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.1.5.tgz", + "integrity": "sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==", + "requires": { + "date-format": "^4.0.14", + "debug": "^4.3.4", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", + "requires": { + "graceful-fs": "^4.1.6" + } + } + } + }, "string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -11052,14 +13402,27 @@ "is-number": "^7.0.0" } }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, "tough-cookie": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.0.0.tgz", - "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "requires": { "psl": "^1.1.33", "punycode": "^2.1.1", - "universalify": "^0.1.2" + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "dependencies": { + "universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==" + } } }, "tr46": { @@ -11076,9 +13439,9 @@ "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==" }, "ts-jest": { - "version": "27.0.7", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.0.7.tgz", - "integrity": "sha512-O41shibMqzdafpuP+CkrOL7ykbmLh+FqQrXEmV9CydQ5JBk0Sj0uAEF5TNNe94fZWKm3yYvWa/IbyV4Yg1zK2Q==", + "version": "27.1.5", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-27.1.5.tgz", + "integrity": "sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==", "requires": { "bs-logger": "0.x", "fast-json-stable-stringify": "2.x", @@ -11157,6 +13520,15 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==" }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -11170,11 +13542,30 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==" }, + "ua-parser-js": { + "version": "0.7.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.35.tgz", + "integrity": "sha512-veRf7dawaj9xaWEu9HoTVn5Pggtc/qj+kqTOFvNiN1l0YdxwC1kvel57UCjThjGa3BHBihE8/UJAHI+uQHmd/g==" + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "update-browserslist-db": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", + "requires": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -11183,6 +13574,20 @@ "punycode": "^2.1.0" } }, + "url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, "v8-compile-cache": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", @@ -11214,6 +13619,16 @@ "spdx-expression-parse": "^3.0.0" } }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==" + }, "w3c-hr-time": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", @@ -11275,9 +13690,9 @@ } }, "word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz", + "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==" }, "wrap-ansi": { "version": "7.0.0", @@ -11308,7 +13723,8 @@ "ws": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.5.tgz", - "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==" + "integrity": "sha512-BAkMFcAzl8as1G/hArkxOxq3G7pjUqQ3gzYbLL0/5zNkph70e+lCoxBGnm6AW1+/aiNeV4fnKqZ8m4GZewmH2w==", + "requires": {} }, "xml-name-validator": { "version": "3.0.0", @@ -11331,17 +13747,34 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yargs": { - "version": "17.2.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.2.1.tgz", - "integrity": "sha512-XfR8du6ua4K6uLGm5S6fA+FIJom/MdJcFNVY8geLlp2v8GYbOXD4EB1tPNZsRn4vBzKGMgb5DRZMeWuFc2GO8Q==", + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", "requires": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.1.1" + }, + "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==" + } } }, "yargs-parser": { diff --git a/package.json b/package.json index fd03964db0..55f6358bc7 100644 --- a/package.json +++ b/package.json @@ -21,13 +21,17 @@ }, "homepage": "https://github.com/sass/sass-spec#readme", "dependencies": { + "@esbuild-plugins/node-modules-polyfill": "^0.2.2", "@jest/types": "^27.2.5", "@types/data-urls": "^2.0.1", "@types/diff": "^5.0.1", "@types/fs-extra": "^9.0.13", "@types/intercept-stdout": "^0.1.0", + "@types/jasmine": "^4.3.1", + "@types/jasmine-expect": "^3.8.1", "@types/jest": "^27.0.2", "@types/js-yaml": "^4.0.3", + "@types/karma": "^6.3.3", "@types/lodash": "^4.14.168", "@types/node": "^14.14.7", "@types/node-hrx": "^0.1.0", @@ -36,15 +40,25 @@ "data-urls": "^3.0.1", "del": "^6.0.0", "diff": "^5.0.0", + "esbuild": "^0.16.17", "file-lines-count": "^1.0.1", "fs-extra": "^10.0.0", "gts": "^3.1.0", "immutable": "^4.0.0", "intercept-stdout": "^0.1.2", + "jasmine": "^4.6.0", + "jasmine-expect": "^5.0.0", + "jasmine-spec-reporter": "^7.0.0", "jest": "^27.3.1", "jest-environment-node-single-context": "^27.2.0", "jest-extended": "^1.1.0", "js-yaml": "^4.1.0", + "karma": "^6.4.1", + "karma-chrome-launcher": "^3.1.1", + "karma-esbuild": "^2.2.5", + "karma-jasmine": "^5.1.0", + "karma-jasmine-matchers": "^5.0.0", + "karma-mocha-reporter": "^2.2.5", "lodash": "^4.17.21", "node-hrx": "^0.1.0", "prettier": "^2.1.2", diff --git a/sass-spec.ts b/sass-spec.ts index 88ebd37afa..d99e64f124 100644 --- a/sass-spec.ts +++ b/sass-spec.ts @@ -26,7 +26,12 @@ async function runAllTests() { testDir, args.impl, args.compiler, - args.todoMode + args.todoMode, + { + trimErrors: args.trimErrors, + skipWarning: args.skipWarning, + ignoreErrorDiffs: args.ignoreErrorDiffs, + } ); if (test.result().type === 'fail' && args.interactive) { await interactor.prompt(test); diff --git a/spec/core_functions/color/alpha.hrx b/spec/core_functions/color/alpha.hrx index 8a68d2bd96..6bb5f6aa32 100644 --- a/spec/core_functions/color/alpha.hrx +++ b/spec/core_functions/color/alpha.hrx @@ -96,6 +96,48 @@ a { b: opacity(10%); } +<===> +================================================================================ +<===> opacity/with_css_var/options.yml +:ignore_for: + - libsass + +<===> opacity/with_css_var/input.scss +a {b: opacity(var(--c))} + +<===> opacity/with_css_var/output.css +a { + b: opacity(var(--c)); +} + +<===> +================================================================================ +<===> opacity/with_calc/options.yml +:ignore_for: + - libsass + +<===> opacity/with_calc/input.scss +a {b: opacity(calc(1 + 2))} + +<===> opacity/with_calc/output.css +a { + b: opacity(3); +} + +<===> +================================================================================ +<===> opacity/with_unquoted_calc/options.yml +:ignore_for: + - libsass + +<===> opacity/with_unquoted_calc/input.scss +a {b: opacity(unquote('calc(1)'))} + +<===> opacity/with_unquoted_calc/output.css +a { + b: opacity(calc(1)); +} + <===> ================================================================================ <===> error/too_few_args/input.scss @@ -154,6 +196,24 @@ Error: $color: 1 is not a color. ' input.scss 1:7 root stylesheet +<===> +================================================================================ +<===> error/with_module/type/options.yml +:ignore_for: + - libsass + +<===> error/with_module/type/input.scss +@use 'sass:color'; +a {b: color.opacity(var(--c))} + +<===> error/with_module/type/error +Error: $color: var(--c) is not a color. + , +2 | a {b: color.opacity(var(--c))} + | ^^^^^^^^^^^^^^^^^^^^^^^ + ' + input.scss 2:7 root stylesheet + <===> ================================================================================ <===> error/quoted_string/options.yml diff --git a/spec/core_functions/color/grayscale.hrx b/spec/core_functions/color/grayscale.hrx index b71fbca7cd..ef3a481dff 100644 --- a/spec/core_functions/color/grayscale.hrx +++ b/spec/core_functions/color/grayscale.hrx @@ -134,6 +134,48 @@ a { b: color(xyz 0.232829773 0.2449664044 0.2667826176); } +<===> +================================================================================ +<===> with_css_var/options.yml +':ignore_for': + - libsass + +<===> with_css_var/input.scss +a {b: grayscale(var(--c))} + +<===> with_css_var/output.css +a { + b: grayscale(var(--c)); +} + +<===> +================================================================================ +<===> with_calc/options.yml +:ignore_for: + - libsass + +<===> with_calc/input.scss +a {b: grayscale(calc(1 + 2))} + +<===> with_calc/output.css +a { + b: grayscale(3); +} + +<===> +================================================================================ +<===> with_unquoted_calc/options.yml +:ignore_for: + - libsass + +<===> with_unquoted_calc/input.scss +a {b: grayscale(unquote('calc(1)'))} + +<===> with_unquoted_calc/output.css +a { + b: grayscale(calc(1)); +} + <===> ================================================================================ <===> error/too_few_args/input.scss @@ -202,3 +244,21 @@ Error: argument `$color` of `grayscale($color)` must be a color >> a {b: grayscale(c)} ------^ + +<===> +================================================================================ +<===> error/with_module/type/options.yml +':ignore_for': + - libsass + +<===> error/with_module/type/input.scss +@use 'sass:color'; +a {b: color.grayscale(var(--c))} + +<===> error/with_module/type/error +Error: $color: var(--c) is not a color. + , +2 | a {b: color.grayscale(var(--c))} + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + ' + input.scss 2:7 root stylesheet diff --git a/spec/core_functions/color/hsl/four_args/alpha.hrx b/spec/core_functions/color/hsl/four_args/alpha.hrx index 0f6c7a7c49..5d80ef0418 100644 --- a/spec/core_functions/color/hsl/four_args/alpha.hrx +++ b/spec/core_functions/color/hsl/four_args/alpha.hrx @@ -10,7 +10,7 @@ a {b: hsl(0, 0%, 0%, -10%)} <===> percent/negative/output.css a { - b: hsla(0deg, 0%, 0%, 0); + b: hsla(0, 0%, 0%, 0); } <===> @@ -20,7 +20,7 @@ a {b: hsl(0, 0%, 0%, 0%)} <===> percent/min/output.css a { - b: hsla(0deg, 0%, 0%, 0); + b: hsla(0, 0%, 0%, 0); } <===> @@ -30,7 +30,7 @@ a {b: hsl(0, 0%, 0%, 45.6%)} <===> percent/positive/output.css a { - b: hsla(0deg, 0%, 0%, 0.456); + b: hsla(0, 0%, 0%, 0.456); } <===> @@ -40,7 +40,7 @@ a {b: hsl(0, 0%, 0%, 100%)} <===> percent/max/output.css a { - b: hsl(0deg, 0%, 0%); + b: hsl(0, 0%, 0%); } <===> @@ -50,7 +50,7 @@ a {b: hsl(0, 0%, 0%, 250%)} <===> percent/above_max/output.css a { - b: hsl(0deg, 0%, 0%); + b: hsl(0, 0%, 0%); } <===> @@ -60,7 +60,7 @@ a {b: hsl(0, 0%, 0%, -10)} <===> unitless/negative/output.css a { - b: hsla(0deg, 0%, 0%, 0); + b: hsla(0, 0%, 0%, 0); } <===> @@ -70,7 +70,7 @@ a {b: hsl(0, 0%, 0%, 0)} <===> unitless/min/output.css a { - b: hsla(0deg, 0%, 0%, 0); + b: hsla(0, 0%, 0%, 0); } <===> @@ -80,7 +80,7 @@ a {b: hsl(0, 0%, 0%, 0.456)} <===> unitless/positive/output.css a { - b: hsla(0deg, 0%, 0%, 0.456); + b: hsla(0, 0%, 0%, 0.456); } <===> @@ -90,7 +90,7 @@ a {b: hsl(0, 0%, 0%, 1)} <===> unitless/max/output.css a { - b: hsl(0deg, 0%, 0%); + b: hsl(0, 0%, 0%); } <===> @@ -100,5 +100,5 @@ a {b: hsl(0, 0%, 0%, 250)} <===> unitless/above_max/output.css a { - b: hsl(0deg, 0%, 0%); + b: hsl(0, 0%, 0%); } diff --git a/spec/core_functions/color/hsl/four_args/clamped.hrx b/spec/core_functions/color/hsl/four_args/clamped.hrx index 725fe6efb2..001049bb69 100644 --- a/spec/core_functions/color/hsl/four_args/clamped.hrx +++ b/spec/core_functions/color/hsl/four_args/clamped.hrx @@ -13,7 +13,7 @@ a {b: hsl(0, -0.1%, 50%, 0.5)} <===> saturation/output.css a { - b: hsla(0deg, 0%, 50%, 0.5); + b: hsla(0, 0%, 50%, 0.5); } <===> @@ -28,7 +28,7 @@ a {b: hsl(0, 100%, 9999%, 0.5)} <===> blue/output.css a { - b: hsla(0deg, 100%, 100%, 0.5); + b: hsla(0, 100%, 100%, 0.5); } <===> @@ -43,7 +43,7 @@ a {b: hsl(0, 100%, 50%, 1.1)} <===> alpha/above/output.css a { - b: hsl(0deg, 100%, 50%); + b: hsl(0, 100%, 50%); } <===> @@ -53,7 +53,7 @@ a {b: hsla(0, 100%, 50%, -0.1)} <===> alpha/below/output.css a { - b: hsla(0deg, 100%, 50%, 0); + b: hsla(0, 100%, 50%, 0); } <===> alpha/below/output-libsass.css diff --git a/spec/core_functions/color/hsl/four_args/in_gamut.hrx b/spec/core_functions/color/hsl/four_args/in_gamut.hrx index 1d5f89f676..57f95cdf5b 100644 --- a/spec/core_functions/color/hsl/four_args/in_gamut.hrx +++ b/spec/core_functions/color/hsl/four_args/in_gamut.hrx @@ -10,7 +10,7 @@ a {b: hsl(180, 60%, 50%, 0)} <===> transparent/output.css a { - b: hsla(180deg, 60%, 50%, 0); + b: hsla(180, 60%, 50%, 0); } <===> @@ -20,7 +20,7 @@ a {b: hsl(180, 60%, 50%, 1)} <===> opaque/output.css a { - b: hsl(180deg, 60%, 50%); + b: hsl(180, 60%, 50%); } <===> @@ -30,7 +30,7 @@ a {b: hsl(180, 60%, 50%, 0.5)} <===> partial/output.css a { - b: hsla(180deg, 60%, 50%, 0.5); + b: hsla(180, 60%, 50%, 0.5); } <===> @@ -40,5 +40,5 @@ a {b: hsl($hue: 180, $saturation: 60%, $lightness: 50%, $alpha: 0.4)} <===> named/output.css a { - b: hsla(180deg, 60%, 50%, 0.4); + b: hsla(180, 60%, 50%, 0.4); } diff --git a/spec/core_functions/color/hsl/one_arg/alpha.hrx b/spec/core_functions/color/hsl/one_arg/alpha.hrx index 542990edca..4df1e93be0 100644 --- a/spec/core_functions/color/hsl/one_arg/alpha.hrx +++ b/spec/core_functions/color/hsl/one_arg/alpha.hrx @@ -3,7 +3,7 @@ a {b: hsl(180 60% 50% / 0)} <===> in_gamut/transparent/output.css a { - b: hsla(180deg, 60%, 50%, 0); + b: hsla(180, 60%, 50%, 0); } <===> @@ -13,7 +13,7 @@ a {b: hsl(180 60% 50% / 1)} <===> in_gamut/opaque/output.css a { - b: hsl(180deg, 60%, 50%); + b: hsl(180, 60%, 50%); } <===> @@ -23,7 +23,7 @@ a {b: hsl(180 60% 50% / 0.5)} <===> in_gamut/partial/output.css a { - b: hsla(180deg, 60%, 50%, 0.5); + b: hsla(180, 60%, 50%, 0.5); } <===> @@ -33,7 +33,7 @@ a {b: hsl($channels: 180 60% 50% / 0.4)} <===> in_gamut/named/output.css a { - b: hsla(180deg, 60%, 50%, 0.4); + b: hsla(180, 60%, 50%, 0.4); } <===> @@ -44,7 +44,7 @@ a {b: (hsl(180 60% 50% / 0.4))} <===> in_gamut/parenthesized/output.css a { - b: hsla(180deg, 60%, 50%, 0.4); + b: hsla(180, 60%, 50%, 0.4); } <===> @@ -54,7 +54,7 @@ a {b: hsl(0 -0.1% 50% / 0.5)} <===> clamped/saturation/output.css a { - b: hsla(0deg, 0%, 50%, 0.5); + b: hsla(0, 0%, 50%, 0.5); } <===> @@ -64,7 +64,7 @@ a {b: hsl(0 100% 9999% / 0.5)} <===> clamped/lightness/output.css a { - b: hsla(0deg, 100%, 100%, 0.5); + b: hsla(0, 100%, 100%, 0.5); } <===> @@ -74,7 +74,7 @@ a {b: hsl(0 100% 50% / 1.1)} <===> clamped/alpha/above/output.css a { - b: hsl(0deg, 100%, 50%); + b: hsl(0, 100%, 50%); } <===> @@ -84,7 +84,7 @@ a {b: hsl(0 100% 50% / -0.1)} <===> clamped/alpha/below/output.css a { - b: hsla(0deg, 100%, 50%, 0); + b: hsla(0, 100%, 50%, 0); } <===> @@ -95,5 +95,5 @@ a {b: hsl(list.slash(180 60% 50%, 0))} <===> slash_list/output.css a { - b: hsla(180deg, 60%, 50%, 0); + b: hsla(180, 60%, 50%, 0); } diff --git a/spec/core_functions/color/hsl/one_arg/no_alpha.hrx b/spec/core_functions/color/hsl/one_arg/no_alpha.hrx index 73c938a984..4363177b55 100644 --- a/spec/core_functions/color/hsl/one_arg/no_alpha.hrx +++ b/spec/core_functions/color/hsl/one_arg/no_alpha.hrx @@ -3,7 +3,7 @@ a {b: hsl(0 100% 50%)} <===> in_gamut/red/output.css a { - b: hsl(0deg, 100%, 50%); + b: hsl(0, 100%, 50%); } <===> @@ -13,7 +13,7 @@ a {b: hsl(240 100% 50%)} <===> in_gamut/blue/output.css a { - b: hsl(240deg, 100%, 50%); + b: hsl(240, 100%, 50%); } <===> @@ -23,7 +23,7 @@ a {b: hsl(60 60% 50%)} <===> in_gamut/grayish/yellow/output.css a { - b: hsl(60deg, 60%, 50%); + b: hsl(60, 60%, 50%); } <===> @@ -33,7 +33,7 @@ a {b: hsl(0 500% 50%)} <===> clamped/saturation/above/output.css a { - b: hsl(0deg, 100%, 50%); + b: hsl(0, 100%, 50%); } <===> @@ -43,7 +43,7 @@ a {b: hsl(0 -100% 50%)} <===> clamped/saturation/below/output.css a { - b: hsl(0deg, 0%, 50%); + b: hsl(0, 0%, 50%); } <===> @@ -53,7 +53,7 @@ a {b: hsl(0 100% 500%)} <===> clamped/lightness/above/output.css a { - b: hsl(0deg, 100%, 100%); + b: hsl(0, 100%, 100%); } <===> @@ -63,7 +63,7 @@ a {b: hsl(0 100% -100%)} <===> clamped/lightness/below/output.css a { - b: hsl(0deg, 100%, 0%); + b: hsl(0, 100%, 0%); } <===> @@ -73,7 +73,7 @@ a {b: hsl(0deg 100% 50%)} <===> units/hue/deg/output.css a { - b: hsl(0deg, 100%, 50%); + b: hsl(0, 100%, 50%); } <===> @@ -83,7 +83,7 @@ a {b: hsl(0 50 50%)} <===> units/saturation/unitless/output.css a { - b: hsl(0deg, 50%, 50%); + b: hsl(0, 50%, 50%); } <===> units/saturation/unitless/warning @@ -106,7 +106,7 @@ a {b: hsl(0 100% 50)} <===> units/lightness/unitless/output.css a { - b: hsl(0deg, 100%, 50%); + b: hsl(0, 100%, 50%); } <===> units/lightness/unitless/warning @@ -129,5 +129,5 @@ a {b: hsl($channels: 0 100% 50%)} <===> named/output.css a { - b: hsl(0deg, 100%, 50%); + b: hsl(0, 100%, 50%); } diff --git a/spec/core_functions/color/hsl/three_args/clamped.hrx b/spec/core_functions/color/hsl/three_args/clamped.hrx index 570e79dc10..f43ba94196 100644 --- a/spec/core_functions/color/hsl/three_args/clamped.hrx +++ b/spec/core_functions/color/hsl/three_args/clamped.hrx @@ -8,7 +8,7 @@ a {b: hsl(0, 500%, 50%)} <===> saturation/above/output.css a { - b: hsl(0deg, 100%, 50%); + b: hsl(0, 100%, 50%); } <===> saturation/above/output-libsass.css @@ -23,7 +23,7 @@ a {b: hsl(0, -100%, 50%)} <===> saturation/below/output.css a { - b: hsl(0deg, 0%, 50%); + b: hsl(0, 0%, 50%); } <===> saturation/below/output-libsass.css @@ -38,7 +38,7 @@ a {b: hsl(0, 100%, 500%)} <===> lightness/above/output.css a { - b: hsl(0deg, 100%, 100%); + b: hsl(0, 100%, 100%); } <===> lightness/above/output-libsass.css @@ -53,7 +53,7 @@ a {b: hsl(0, 100%, -100%)} <===> lightness/below/output.css a { - b: hsl(0deg, 100%, 0%); + b: hsl(0, 100%, 0%); } <===> lightness/below/output-libsass.css diff --git a/spec/core_functions/color/hsl/three_args/named.hrx b/spec/core_functions/color/hsl/three_args/named.hrx index bb80d4db96..d9b8e99c12 100644 --- a/spec/core_functions/color/hsl/three_args/named.hrx +++ b/spec/core_functions/color/hsl/three_args/named.hrx @@ -3,7 +3,7 @@ a {b: hsl($hue: 0, $saturation: 100%, $lightness: 50%)} <===> output.css a { - b: hsl(0deg, 100%, 50%); + b: hsl(0, 100%, 50%); } <===> output-libsass.css diff --git a/spec/core_functions/color/hsl/three_args/units.hrx b/spec/core_functions/color/hsl/three_args/units.hrx index 0e5cbf22b0..ba1c718526 100644 --- a/spec/core_functions/color/hsl/three_args/units.hrx +++ b/spec/core_functions/color/hsl/three_args/units.hrx @@ -10,7 +10,7 @@ a {b: hsl(0deg, 100%, 50%)} <===> hue/deg/output.css a { - b: hsl(0deg, 100%, 50%); + b: hsl(0, 100%, 50%); } <===> hue/deg/output-libsass.css @@ -25,7 +25,7 @@ a {b: hsl(60, 100%, 50%)} <===> hue/unitless/output.css a { - b: hsl(60deg, 100%, 50%); + b: hsl(60, 100%, 50%); } <===> hue/unitless/output-libsass.css @@ -40,7 +40,7 @@ a {b: hsl(60in, 100%, 50%)} <===> hue/unknown/output.css a { - b: hsl(60deg, 100%, 50%); + b: hsl(60, 100%, 50%); } <===> hue/unknown/output-libsass.css @@ -70,7 +70,7 @@ a {b: hsl(60rad, 100%, 50%)} <===> hue/angle/output.css a { - b: hsl(197.7467707849deg, 100%, 50%); + b: hsl(197.7467707849, 100%, 50%); } <===> hue/angle/output-libsass.css @@ -87,7 +87,7 @@ a {b: hsl(0, 50, 50%)} <===> saturation/unitless/output.css a { - b: hsl(0deg, 50%, 50%); + b: hsl(0, 50%, 50%); } <===> saturation/unitless/output-libsass.css @@ -117,7 +117,7 @@ a {b: hsl(0, 50in, 50%)} <===> saturation/unknown/output.css a { - b: hsl(0deg, 50%, 50%); + b: hsl(0, 50%, 50%); } <===> saturation/unknown/output-libsass.css @@ -147,7 +147,7 @@ a {b: hsl(0, 100%, 50)} <===> lightness/unitless/output.css a { - b: hsl(0deg, 100%, 50%); + b: hsl(0, 100%, 50%); } <===> lightness/unitless/output-libsass.css @@ -177,7 +177,7 @@ a {b: hsl(0, 100%, 50in)} <===> lightness/unknown/output.css a { - b: hsl(0deg, 100%, 50%); + b: hsl(0, 100%, 50%); } <===> lightness/unknown/output-libsass.css diff --git a/spec/core_functions/color/hsl/three_args/w3c/black_to_white_through.hrx b/spec/core_functions/color/hsl/three_args/w3c/black_to_white_through.hrx index eed3a5f09e..98a5e91ad7 100644 --- a/spec/core_functions/color/hsl/three_args/w3c/black_to_white_through.hrx +++ b/spec/core_functions/color/hsl/three_args/w3c/black_to_white_through.hrx @@ -15,17 +15,17 @@ a { <===> red/output.css a { - step-1: hsl(0deg, 100%, 0%); - step-2: hsl(0deg, 100%, 10%); - step-3: hsl(0deg, 100%, 20%); - step-4: hsl(0deg, 100%, 30%); - step-5: hsl(0deg, 100%, 40%); - step-6: hsl(0deg, 100%, 50%); - step-7: hsl(0deg, 100%, 60%); - step-8: hsl(0deg, 100%, 70%); - step-9: hsl(0deg, 100%, 80%); - step-10: hsl(0deg, 100%, 90%); - step-11: hsl(0deg, 100%, 100%); + step-1: hsl(0, 100%, 0%); + step-2: hsl(0, 100%, 10%); + step-3: hsl(0, 100%, 20%); + step-4: hsl(0, 100%, 30%); + step-5: hsl(0, 100%, 40%); + step-6: hsl(0, 100%, 50%); + step-7: hsl(0, 100%, 60%); + step-8: hsl(0, 100%, 70%); + step-9: hsl(0, 100%, 80%); + step-10: hsl(0, 100%, 90%); + step-11: hsl(0, 100%, 100%); } <===> red/output-libsass.css @@ -62,17 +62,17 @@ a { <===> yellow/output.css a { - step-1: hsl(60deg, 100%, 0%); - step-2: hsl(60deg, 100%, 10%); - step-3: hsl(60deg, 100%, 20%); - step-4: hsl(60deg, 100%, 30%); - step-5: hsl(60deg, 100%, 40%); - step-6: hsl(60deg, 100%, 50%); - step-7: hsl(60deg, 100%, 60%); - step-8: hsl(60deg, 100%, 70%); - step-9: hsl(60deg, 100%, 80%); - step-10: hsl(60deg, 100%, 90%); - step-11: hsl(60deg, 100%, 100%); + step-1: hsl(60, 100%, 0%); + step-2: hsl(60, 100%, 10%); + step-3: hsl(60, 100%, 20%); + step-4: hsl(60, 100%, 30%); + step-5: hsl(60, 100%, 40%); + step-6: hsl(60, 100%, 50%); + step-7: hsl(60, 100%, 60%); + step-8: hsl(60, 100%, 70%); + step-9: hsl(60, 100%, 80%); + step-10: hsl(60, 100%, 90%); + step-11: hsl(60, 100%, 100%); } <===> yellow/output-libsass.css @@ -109,17 +109,17 @@ a { <===> green/output.css a { - step-1: hsl(120deg, 100%, 0%); - step-2: hsl(120deg, 100%, 10%); - step-3: hsl(120deg, 100%, 20%); - step-4: hsl(120deg, 100%, 30%); - step-5: hsl(120deg, 100%, 40%); - step-6: hsl(120deg, 100%, 50%); - step-7: hsl(120deg, 100%, 60%); - step-8: hsl(120deg, 100%, 70%); - step-9: hsl(120deg, 100%, 80%); - step-10: hsl(120deg, 100%, 90%); - step-11: hsl(120deg, 100%, 100%); + step-1: hsl(120, 100%, 0%); + step-2: hsl(120, 100%, 10%); + step-3: hsl(120, 100%, 20%); + step-4: hsl(120, 100%, 30%); + step-5: hsl(120, 100%, 40%); + step-6: hsl(120, 100%, 50%); + step-7: hsl(120, 100%, 60%); + step-8: hsl(120, 100%, 70%); + step-9: hsl(120, 100%, 80%); + step-10: hsl(120, 100%, 90%); + step-11: hsl(120, 100%, 100%); } <===> green/output-libsass.css @@ -156,17 +156,17 @@ a { <===> cyan/output.css a { - step-1: hsl(180deg, 100%, 0%); - step-2: hsl(180deg, 100%, 10%); - step-3: hsl(180deg, 100%, 20%); - step-4: hsl(180deg, 100%, 30%); - step-5: hsl(180deg, 100%, 40%); - step-6: hsl(180deg, 100%, 50%); - step-7: hsl(180deg, 100%, 60%); - step-8: hsl(180deg, 100%, 70%); - step-9: hsl(180deg, 100%, 80%); - step-10: hsl(180deg, 100%, 90%); - step-11: hsl(180deg, 100%, 100%); + step-1: hsl(180, 100%, 0%); + step-2: hsl(180, 100%, 10%); + step-3: hsl(180, 100%, 20%); + step-4: hsl(180, 100%, 30%); + step-5: hsl(180, 100%, 40%); + step-6: hsl(180, 100%, 50%); + step-7: hsl(180, 100%, 60%); + step-8: hsl(180, 100%, 70%); + step-9: hsl(180, 100%, 80%); + step-10: hsl(180, 100%, 90%); + step-11: hsl(180, 100%, 100%); } <===> cyan/output-libsass.css @@ -203,17 +203,17 @@ a { <===> blue/output.css a { - step-1: hsl(240deg, 100%, 0%); - step-2: hsl(240deg, 100%, 10%); - step-3: hsl(240deg, 100%, 20%); - step-4: hsl(240deg, 100%, 30%); - step-5: hsl(240deg, 100%, 40%); - step-6: hsl(240deg, 100%, 50%); - step-7: hsl(240deg, 100%, 60%); - step-8: hsl(240deg, 100%, 70%); - step-9: hsl(240deg, 100%, 80%); - step-10: hsl(240deg, 100%, 90%); - step-11: hsl(240deg, 100%, 100%); + step-1: hsl(240, 100%, 0%); + step-2: hsl(240, 100%, 10%); + step-3: hsl(240, 100%, 20%); + step-4: hsl(240, 100%, 30%); + step-5: hsl(240, 100%, 40%); + step-6: hsl(240, 100%, 50%); + step-7: hsl(240, 100%, 60%); + step-8: hsl(240, 100%, 70%); + step-9: hsl(240, 100%, 80%); + step-10: hsl(240, 100%, 90%); + step-11: hsl(240, 100%, 100%); } <===> blue/output-libsass.css @@ -250,17 +250,17 @@ a { <===> purple/output.css a { - step-1: hsl(300deg, 100%, 0%); - step-2: hsl(300deg, 100%, 10%); - step-3: hsl(300deg, 100%, 20%); - step-4: hsl(300deg, 100%, 30%); - step-5: hsl(300deg, 100%, 40%); - step-6: hsl(300deg, 100%, 50%); - step-7: hsl(300deg, 100%, 60%); - step-8: hsl(300deg, 100%, 70%); - step-9: hsl(300deg, 100%, 80%); - step-10: hsl(300deg, 100%, 90%); - step-11: hsl(300deg, 100%, 100%); + step-1: hsl(300, 100%, 0%); + step-2: hsl(300, 100%, 10%); + step-3: hsl(300, 100%, 20%); + step-4: hsl(300, 100%, 30%); + step-5: hsl(300, 100%, 40%); + step-6: hsl(300, 100%, 50%); + step-7: hsl(300, 100%, 60%); + step-8: hsl(300, 100%, 70%); + step-9: hsl(300, 100%, 80%); + step-10: hsl(300, 100%, 90%); + step-11: hsl(300, 100%, 100%); } <===> purple/output-libsass.css diff --git a/spec/core_functions/color/hsl/three_args/w3c/blue_to_red.hrx b/spec/core_functions/color/hsl/three_args/w3c/blue_to_red.hrx index 42d72741e6..38ece9797a 100644 --- a/spec/core_functions/color/hsl/three_args/w3c/blue_to_red.hrx +++ b/spec/core_functions/color/hsl/three_args/w3c/blue_to_red.hrx @@ -15,17 +15,17 @@ a { <===> output.css a { - step-1: hsl(240deg, 100%, 50%); - step-2: hsl(252deg, 100%, 50%); - step-3: hsl(264deg, 100%, 50%); - step-4: hsl(276deg, 100%, 50%); - step-5: hsl(288deg, 100%, 50%); - step-6: hsl(300deg, 100%, 50%); - step-7: hsl(312deg, 100%, 50%); - step-8: hsl(324deg, 100%, 50%); - step-9: hsl(336deg, 100%, 50%); - step-10: hsl(348deg, 100%, 50%); - step-11: hsl(0deg, 100%, 50%); + step-1: hsl(240, 100%, 50%); + step-2: hsl(252, 100%, 50%); + step-3: hsl(264, 100%, 50%); + step-4: hsl(276, 100%, 50%); + step-5: hsl(288, 100%, 50%); + step-6: hsl(300, 100%, 50%); + step-7: hsl(312, 100%, 50%); + step-8: hsl(324, 100%, 50%); + step-9: hsl(336, 100%, 50%); + step-10: hsl(348, 100%, 50%); + step-11: hsl(0, 100%, 50%); } <===> output-libsass.css diff --git a/spec/core_functions/color/hsl/three_args/w3c/gray_to.hrx b/spec/core_functions/color/hsl/three_args/w3c/gray_to.hrx index 5ac6dbd791..9dca5e016d 100644 --- a/spec/core_functions/color/hsl/three_args/w3c/gray_to.hrx +++ b/spec/core_functions/color/hsl/three_args/w3c/gray_to.hrx @@ -7,9 +7,9 @@ a { <===> red/output.css a { - step-1: hsl(0deg, 20%, 50%); - step-2: hsl(0deg, 60%, 50%); - step-3: hsl(0deg, 100%, 50%); + step-1: hsl(0, 20%, 50%); + step-2: hsl(0, 60%, 50%); + step-3: hsl(0, 100%, 50%); } <===> red/output-libsass.css @@ -30,9 +30,9 @@ a { <===> yellow/output.css a { - step-1: hsl(60deg, 20%, 50%); - step-2: hsl(60deg, 60%, 50%); - step-3: hsl(60deg, 100%, 50%); + step-1: hsl(60, 20%, 50%); + step-2: hsl(60, 60%, 50%); + step-3: hsl(60, 100%, 50%); } <===> yellow/output-libsass.css @@ -53,9 +53,9 @@ a { <===> green/output.css a { - step-1: hsl(120deg, 20%, 50%); - step-2: hsl(120deg, 60%, 50%); - step-3: hsl(120deg, 100%, 50%); + step-1: hsl(120, 20%, 50%); + step-2: hsl(120, 60%, 50%); + step-3: hsl(120, 100%, 50%); } <===> green/output-libsass.css @@ -76,9 +76,9 @@ a { <===> cyan/output.css a { - step-1: hsl(180deg, 20%, 50%); - step-2: hsl(180deg, 60%, 50%); - step-3: hsl(180deg, 100%, 50%); + step-1: hsl(180, 20%, 50%); + step-2: hsl(180, 60%, 50%); + step-3: hsl(180, 100%, 50%); } <===> cyan/output-libsass.css @@ -99,9 +99,9 @@ a { <===> blue/output.css a { - step-1: hsl(240deg, 20%, 50%); - step-2: hsl(240deg, 60%, 50%); - step-3: hsl(240deg, 100%, 50%); + step-1: hsl(240, 20%, 50%); + step-2: hsl(240, 60%, 50%); + step-3: hsl(240, 100%, 50%); } <===> blue/output-libsass.css @@ -122,9 +122,9 @@ a { <===> purple/output.css a { - step-1: hsl(300deg, 20%, 50%); - step-2: hsl(300deg, 60%, 50%); - step-3: hsl(300deg, 100%, 50%); + step-1: hsl(300, 20%, 50%); + step-2: hsl(300, 60%, 50%); + step-3: hsl(300, 100%, 50%); } <===> purple/output-libsass.css diff --git a/spec/core_functions/color/hsl/three_args/w3c/green_to_blue.hrx b/spec/core_functions/color/hsl/three_args/w3c/green_to_blue.hrx index 15ea802b61..2d597909c0 100644 --- a/spec/core_functions/color/hsl/three_args/w3c/green_to_blue.hrx +++ b/spec/core_functions/color/hsl/three_args/w3c/green_to_blue.hrx @@ -15,17 +15,17 @@ a { <===> output.css a { - step-1: hsl(120deg, 100%, 50%); - step-2: hsl(132deg, 100%, 50%); - step-3: hsl(144deg, 100%, 50%); - step-4: hsl(156deg, 100%, 50%); - step-5: hsl(168deg, 100%, 50%); - step-6: hsl(180deg, 100%, 50%); - step-7: hsl(192deg, 100%, 50%); - step-8: hsl(204deg, 100%, 50%); - step-9: hsl(216deg, 100%, 50%); - step-10: hsl(228deg, 100%, 50%); - step-11: hsl(240deg, 100%, 50%); + step-1: hsl(120, 100%, 50%); + step-2: hsl(132, 100%, 50%); + step-3: hsl(144, 100%, 50%); + step-4: hsl(156, 100%, 50%); + step-5: hsl(168, 100%, 50%); + step-6: hsl(180, 100%, 50%); + step-7: hsl(192, 100%, 50%); + step-8: hsl(204, 100%, 50%); + step-9: hsl(216, 100%, 50%); + step-10: hsl(228, 100%, 50%); + step-11: hsl(240, 100%, 50%); } <===> output-libsass.css diff --git a/spec/core_functions/color/hsl/three_args/w3c/hue.hrx b/spec/core_functions/color/hsl/three_args/w3c/hue.hrx index 7340195e62..56117e6954 100644 --- a/spec/core_functions/color/hsl/three_args/w3c/hue.hrx +++ b/spec/core_functions/color/hsl/three_args/w3c/hue.hrx @@ -16,45 +16,45 @@ <===> output.css red { - hue-0: hsl(0deg, 100%, 50%); - hue--360: hsl(0deg, 100%, 50%); - hue-360: hsl(0deg, 100%, 50%); - hue-6120: hsl(0deg, 100%, 50%); + hue-0: hsl(0, 100%, 50%); + hue--360: hsl(0, 100%, 50%); + hue-360: hsl(0, 100%, 50%); + hue-6120: hsl(0, 100%, 50%); } yellow { - hue-60: hsl(60deg, 100%, 50%); - hue--300: hsl(60deg, 100%, 50%); - hue-420: hsl(60deg, 100%, 50%); - hue--9660: hsl(60deg, 100%, 50%); + hue-60: hsl(60, 100%, 50%); + hue--300: hsl(60, 100%, 50%); + hue-420: hsl(60, 100%, 50%); + hue--9660: hsl(60, 100%, 50%); } green { - hue-120: hsl(120deg, 100%, 50%); - hue--240: hsl(120deg, 100%, 50%); - hue-480: hsl(120deg, 100%, 50%); - hue-99840: hsl(120deg, 100%, 50%); + hue-120: hsl(120, 100%, 50%); + hue--240: hsl(120, 100%, 50%); + hue-480: hsl(120, 100%, 50%); + hue-99840: hsl(120, 100%, 50%); } cyan { - hue-180: hsl(180deg, 100%, 50%); - hue--180: hsl(180deg, 100%, 50%); - hue-540: hsl(180deg, 100%, 50%); - hue--900: hsl(180deg, 100%, 50%); + hue-180: hsl(180, 100%, 50%); + hue--180: hsl(180, 100%, 50%); + hue-540: hsl(180, 100%, 50%); + hue--900: hsl(180, 100%, 50%); } blue { - hue-240: hsl(240deg, 100%, 50%); - hue--120: hsl(240deg, 100%, 50%); - hue-600: hsl(240deg, 100%, 50%); - hue--104880: hsl(240deg, 100%, 50%); + hue-240: hsl(240, 100%, 50%); + hue--120: hsl(240, 100%, 50%); + hue-600: hsl(240, 100%, 50%); + hue--104880: hsl(240, 100%, 50%); } purple { - hue-300: hsl(300deg, 100%, 50%); - hue--60: hsl(300deg, 100%, 50%); - hue-660: hsl(300deg, 100%, 50%); - hue-2820: hsl(300deg, 100%, 50%); + hue-300: hsl(300, 100%, 50%); + hue--60: hsl(300, 100%, 50%); + hue-660: hsl(300, 100%, 50%); + hue-2820: hsl(300, 100%, 50%); } <===> output-libsass.css diff --git a/spec/core_functions/color/hsl/three_args/w3c/red_to_green.hrx b/spec/core_functions/color/hsl/three_args/w3c/red_to_green.hrx index 6b48a20ad2..b7e7fe70c7 100644 --- a/spec/core_functions/color/hsl/three_args/w3c/red_to_green.hrx +++ b/spec/core_functions/color/hsl/three_args/w3c/red_to_green.hrx @@ -15,17 +15,17 @@ a { <===> output.css a { - step-1: hsl(0deg, 100%, 50%); - step-2: hsl(12deg, 100%, 50%); - step-3: hsl(24deg, 100%, 50%); - step-4: hsl(36deg, 100%, 50%); - step-5: hsl(48deg, 100%, 50%); - step-6: hsl(60deg, 100%, 50%); - step-7: hsl(72deg, 100%, 50%); - step-8: hsl(84deg, 100%, 50%); - step-9: hsl(96deg, 100%, 50%); - step-10: hsl(108deg, 100%, 50%); - step-11: hsl(120deg, 100%, 50%); + step-1: hsl(0, 100%, 50%); + step-2: hsl(12, 100%, 50%); + step-3: hsl(24, 100%, 50%); + step-4: hsl(36, 100%, 50%); + step-5: hsl(48, 100%, 50%); + step-6: hsl(60, 100%, 50%); + step-7: hsl(72, 100%, 50%); + step-8: hsl(84, 100%, 50%); + step-9: hsl(96, 100%, 50%); + step-10: hsl(108, 100%, 50%); + step-11: hsl(120, 100%, 50%); } <===> output-libsass.css diff --git a/spec/core_functions/color/hsla.hrx b/spec/core_functions/color/hsla.hrx index 3d90d9731b..474f02b4e5 100644 --- a/spec/core_functions/color/hsla.hrx +++ b/spec/core_functions/color/hsla.hrx @@ -15,7 +15,7 @@ a {b: hsla(180 60% 50%)} <===> one_arg/no_alpha/output.css a { - b: hsl(180deg, 60%, 50%); + b: hsl(180, 60%, 50%); } <===> @@ -25,7 +25,7 @@ a {b: hsla(180 60% 50% / 0.4)} <===> one_arg/alpha/output.css a { - b: hsla(180deg, 60%, 50%, 0.4); + b: hsla(180, 60%, 50%, 0.4); } <===> @@ -39,7 +39,7 @@ a {b: hsla(180, 60%, 50%)} <===> three_args/output.css a { - b: hsl(180deg, 60%, 50%); + b: hsl(180, 60%, 50%); } <===> @@ -49,7 +49,7 @@ a {b: hsla(180, 60%, 50%, 0.4)} <===> four_args/output.css a { - b: hsla(180deg, 60%, 50%, 0.4); + b: hsla(180, 60%, 50%, 0.4); } <===> four_args/output-libsass.css diff --git a/spec/core_functions/color/hwb/four_args.hrx b/spec/core_functions/color/hwb/four_args.hrx index 10ac54f206..897f6f99b4 100644 --- a/spec/core_functions/color/hwb/four_args.hrx +++ b/spec/core_functions/color/hwb/four_args.hrx @@ -4,7 +4,7 @@ a {b: color.hwb(0, 0%, 0%, -10%)} <===> alpha/percent/negative/output.css a { - b: hsla(0deg, 100%, 50%, 0); + b: hsla(0, 100%, 50%, 0); } <===> @@ -15,7 +15,7 @@ a {b: color.hwb(0, 0%, 0%, 0%)} <===> alpha/percent/min/output.css a { - b: hsla(0deg, 100%, 50%, 0); + b: hsla(0, 100%, 50%, 0); } <===> @@ -26,7 +26,7 @@ a {b: color.hwb(0, 0%, 0%, 45.6%)} <===> alpha/percent/positive/output.css a { - b: hsla(0deg, 100%, 50%, 0.456); + b: hsla(0, 100%, 50%, 0.456); } <===> @@ -59,7 +59,7 @@ a {b: color.hwb(0, 0%, 0%, -10)} <===> alpha/unitless/negative/output.css a { - b: hsla(0deg, 100%, 50%, 0); + b: hsla(0, 100%, 50%, 0); } <===> @@ -70,7 +70,7 @@ a {b: color.hwb(0, 0%, 0%, 0)} <===> alpha/unitless/min/output.css a { - b: hsla(0deg, 100%, 50%, 0); + b: hsla(0, 100%, 50%, 0); } <===> @@ -81,7 +81,7 @@ a {b: color.hwb(0, 0%, 0%, 0.456)} <===> alpha/unitless/positive/output.css a { - b: hsla(0deg, 100%, 50%, 0.456); + b: hsla(0, 100%, 50%, 0.456); } <===> @@ -114,5 +114,5 @@ a {b: color.hwb($hue: 180, $whiteness: 30%, $blackness: 40%, $alpha: 0.4)} <===> named/output.css a { - b: hsla(180deg, 33.3333333333%, 45%, 0.4); + b: hsla(180, 33.3333333333%, 45%, 0.4); } diff --git a/spec/core_functions/color/hwb/one_arg.hrx b/spec/core_functions/color/hwb/one_arg.hrx index 180e4b6e5e..b50f23c1e7 100644 --- a/spec/core_functions/color/hwb/one_arg.hrx +++ b/spec/core_functions/color/hwb/one_arg.hrx @@ -4,7 +4,7 @@ a {b: color.hwb(180 30% 40% / 0)} <===> alpha/in_gamut/transparent/output.css a { - b: hsla(180deg, 33.3333333333%, 45%, 0); + b: hsla(180, 33.3333333333%, 45%, 0); } <===> @@ -15,7 +15,7 @@ a {b: color.hwb(180 30% 40% / 1)} <===> alpha/in_gamut/opaque/output.css a { - b: hsl(180deg, 33.3333333333%, 45%); + b: hsl(180, 33.3333333333%, 45%); } <===> @@ -26,7 +26,7 @@ a {b: color.hwb(180 30% 40% / 0.5)} <===> alpha/in_gamut/partial/output.css a { - b: hsla(180deg, 33.3333333333%, 45%, 0.5); + b: hsla(180, 33.3333333333%, 45%, 0.5); } <===> @@ -37,7 +37,7 @@ a {b: color.hwb($channels: 180 30% 40% / 0.4)} <===> alpha/in_gamut/named/output.css a { - b: hsla(180deg, 33.3333333333%, 45%, 0.4); + b: hsla(180, 33.3333333333%, 45%, 0.4); } <===> @@ -50,7 +50,7 @@ a {b: (color.hwb(180 30% 40% / 0.4))} <===> alpha/in_gamut/parenthesized/output.css a { - b: hsla(180deg, 33.3333333333%, 45%, 0.4); + b: hsla(180, 33.3333333333%, 45%, 0.4); } <===> @@ -61,7 +61,7 @@ a {b: color.hwb(0 30% 40% / 1.1)} <===> alpha/clamped/above/output.css a { - b: hsl(0deg, 33.3333333333%, 45%); + b: hsl(0, 33.3333333333%, 45%); } <===> @@ -72,7 +72,7 @@ a {b: color.hwb(0 30% 40% / -0.1)} <===> alpha/clamped/below/output.css a { - b: hsla(0deg, 33.3333333333%, 45%, 0); + b: hsla(0, 33.3333333333%, 45%, 0); } <===> @@ -83,7 +83,7 @@ a {b: color.hwb(180 30% 40%)} <===> no_alpha/output.css a { - b: hsl(180deg, 33.3333333333%, 45%); + b: hsl(180, 33.3333333333%, 45%); } <===> @@ -94,5 +94,5 @@ a {b: color.hwb($channels: 180 30% 40% / 0.4)} <===> named/output.css a { - b: hsla(180deg, 33.3333333333%, 45%, 0.4); + b: hsla(180, 33.3333333333%, 45%, 0.4); } diff --git a/spec/core_functions/color/hwb/three_args/named.hrx b/spec/core_functions/color/hwb/three_args/named.hrx index 2f8eca8a7c..7999c4908f 100644 --- a/spec/core_functions/color/hwb/three_args/named.hrx +++ b/spec/core_functions/color/hwb/three_args/named.hrx @@ -4,5 +4,5 @@ a {b: color.hwb($hue: 0, $whiteness: 30%, $blackness: 40%)} <===> output.css a { - b: hsl(0deg, 33.3333333333%, 45%); + b: hsl(0, 33.3333333333%, 45%); } diff --git a/spec/core_functions/color/hwb/three_args/units.hrx b/spec/core_functions/color/hwb/three_args/units.hrx index 26ff6f60db..d34dca9a6d 100644 --- a/spec/core_functions/color/hwb/three_args/units.hrx +++ b/spec/core_functions/color/hwb/three_args/units.hrx @@ -4,7 +4,7 @@ a {b: color.hwb(0deg, 30%, 40%)} <===> hue/deg/output.css a { - b: hsl(0deg, 33.3333333333%, 45%); + b: hsl(0, 33.3333333333%, 45%); } <===> @@ -15,7 +15,7 @@ a {b: color.hwb(1rad, 30%, 40%)} <===> hue/rad/output.css a { - b: hsl(57.2957795131deg, 33.3333333333%, 45%); + b: hsl(57.2957795131, 33.3333333333%, 45%); } <===> @@ -26,7 +26,7 @@ a {b: color.hwb(1in, 30%, 40%)} <===> hue/non_angle/output.css a { - b: hsl(1deg, 33.3333333333%, 45%); + b: hsl(1, 33.3333333333%, 45%); } <===> hue/non_angle/warning diff --git a/spec/core_functions/color/hwb/three_args/w3c/blue_magentas.hrx b/spec/core_functions/color/hwb/three_args/w3c/blue_magentas.hrx index 1de1809a9f..34e65f76b1 100644 --- a/spec/core_functions/color/hwb/three_args/w3c/blue_magentas.hrx +++ b/spec/core_functions/color/hwb/three_args/w3c/blue_magentas.hrx @@ -4,55 +4,55 @@ <===> output.css whiteness-0 { - blackness-0: hsl(270deg, 100%, 50%); + blackness-0: hsl(270, 100%, 50%); blackness-20: #6600cc; - blackness-40: hsl(270deg, 100%, 30%); + blackness-40: hsl(270, 100%, 30%); blackness-60: #330066; - blackness-80: hsl(270deg, 100%, 10%); + blackness-80: hsl(270, 100%, 10%); blackness-100: black; } whiteness-20 { blackness-0: #9933ff; - blackness-20: hsl(270deg, 60%, 50%); + blackness-20: hsl(270, 60%, 50%); blackness-40: rebeccapurple; - blackness-60: hsl(270deg, 33.3333333333%, 30%); + blackness-60: hsl(270, 33.3333333333%, 30%); blackness-80: #333333; - blackness-100: hsl(0deg, 0%, 16.6666666667%); + blackness-100: hsl(0, 0%, 16.6666666667%); } whiteness-40 { - blackness-0: hsl(270deg, 100%, 70%); + blackness-0: hsl(270, 100%, 70%); blackness-20: #9966cc; - blackness-40: hsl(270deg, 20%, 50%); + blackness-40: hsl(270, 20%, 50%); blackness-60: #666666; blackness-80: #555555; - blackness-100: hsl(0deg, 0%, 28.5714285714%); + blackness-100: hsl(0, 0%, 28.5714285714%); } whiteness-60 { blackness-0: #cc99ff; - blackness-20: hsl(270deg, 33.3333333333%, 70%); + blackness-20: hsl(270, 33.3333333333%, 70%); blackness-40: #999999; - blackness-60: hsl(0deg, 0%, 50%); - blackness-80: hsl(0deg, 0%, 42.8571428571%); - blackness-100: hsl(0deg, 0%, 37.5%); + blackness-60: hsl(0, 0%, 50%); + blackness-80: hsl(0, 0%, 42.8571428571%); + blackness-100: hsl(0, 0%, 37.5%); } whiteness-80 { - blackness-0: hsl(270deg, 100%, 90%); + blackness-0: hsl(270, 100%, 90%); blackness-20: #cccccc; blackness-40: #aaaaaa; - blackness-60: hsl(0deg, 0%, 57.1428571429%); - blackness-80: hsl(0deg, 0%, 50%); - blackness-100: hsl(0deg, 0%, 44.4444444444%); + blackness-60: hsl(0, 0%, 57.1428571429%); + blackness-80: hsl(0, 0%, 50%); + blackness-100: hsl(0, 0%, 44.4444444444%); } whiteness-100 { blackness-0: white; - blackness-20: hsl(0deg, 0%, 83.3333333333%); - blackness-40: hsl(0deg, 0%, 71.4285714286%); - blackness-60: hsl(0deg, 0%, 62.5%); - blackness-80: hsl(0deg, 0%, 55.5555555556%); - blackness-100: hsl(0deg, 0%, 50%); + blackness-20: hsl(0, 0%, 83.3333333333%); + blackness-40: hsl(0, 0%, 71.4285714286%); + blackness-60: hsl(0, 0%, 62.5%); + blackness-80: hsl(0, 0%, 55.5555555556%); + blackness-100: hsl(0, 0%, 50%); } diff --git a/spec/core_functions/color/hwb/three_args/w3c/blues.hrx b/spec/core_functions/color/hwb/three_args/w3c/blues.hrx index 138c196a77..cab1db9697 100644 --- a/spec/core_functions/color/hwb/three_args/w3c/blues.hrx +++ b/spec/core_functions/color/hwb/three_args/w3c/blues.hrx @@ -18,7 +18,7 @@ whiteness-20 { blackness-40: #333399; blackness-60: #333366; blackness-80: #333333; - blackness-100: hsl(0deg, 0%, 16.6666666667%); + blackness-100: hsl(0, 0%, 16.6666666667%); } whiteness-40 { @@ -27,32 +27,32 @@ whiteness-40 { blackness-40: #666699; blackness-60: #666666; blackness-80: #555555; - blackness-100: hsl(0deg, 0%, 28.5714285714%); + blackness-100: hsl(0, 0%, 28.5714285714%); } whiteness-60 { blackness-0: #9999ff; blackness-20: #9999cc; blackness-40: #999999; - blackness-60: hsl(0deg, 0%, 50%); - blackness-80: hsl(0deg, 0%, 42.8571428571%); - blackness-100: hsl(0deg, 0%, 37.5%); + blackness-60: hsl(0, 0%, 50%); + blackness-80: hsl(0, 0%, 42.8571428571%); + blackness-100: hsl(0, 0%, 37.5%); } whiteness-80 { blackness-0: #ccccff; blackness-20: #cccccc; blackness-40: #aaaaaa; - blackness-60: hsl(0deg, 0%, 57.1428571429%); - blackness-80: hsl(0deg, 0%, 50%); - blackness-100: hsl(0deg, 0%, 44.4444444444%); + blackness-60: hsl(0, 0%, 57.1428571429%); + blackness-80: hsl(0, 0%, 50%); + blackness-100: hsl(0, 0%, 44.4444444444%); } whiteness-100 { blackness-0: white; - blackness-20: hsl(0deg, 0%, 83.3333333333%); - blackness-40: hsl(0deg, 0%, 71.4285714286%); - blackness-60: hsl(0deg, 0%, 62.5%); - blackness-80: hsl(0deg, 0%, 55.5555555556%); - blackness-100: hsl(0deg, 0%, 50%); + blackness-20: hsl(0, 0%, 83.3333333333%); + blackness-40: hsl(0, 0%, 71.4285714286%); + blackness-60: hsl(0, 0%, 62.5%); + blackness-80: hsl(0, 0%, 55.5555555556%); + blackness-100: hsl(0, 0%, 50%); } diff --git a/spec/core_functions/color/hwb/three_args/w3c/cyan_blues.hrx b/spec/core_functions/color/hwb/three_args/w3c/cyan_blues.hrx index e37cc4016c..c9edff83d7 100644 --- a/spec/core_functions/color/hwb/three_args/w3c/cyan_blues.hrx +++ b/spec/core_functions/color/hwb/three_args/w3c/cyan_blues.hrx @@ -4,55 +4,55 @@ <===> output.css whiteness-0 { - blackness-0: hsl(210deg, 100%, 50%); + blackness-0: hsl(210, 100%, 50%); blackness-20: #0066cc; - blackness-40: hsl(210deg, 100%, 30%); + blackness-40: hsl(210, 100%, 30%); blackness-60: #003366; - blackness-80: hsl(210deg, 100%, 10%); + blackness-80: hsl(210, 100%, 10%); blackness-100: black; } whiteness-20 { blackness-0: #3399ff; - blackness-20: hsl(210deg, 60%, 50%); + blackness-20: hsl(210, 60%, 50%); blackness-40: #336699; - blackness-60: hsl(210deg, 33.3333333333%, 30%); + blackness-60: hsl(210, 33.3333333333%, 30%); blackness-80: #333333; - blackness-100: hsl(0deg, 0%, 16.6666666667%); + blackness-100: hsl(0, 0%, 16.6666666667%); } whiteness-40 { - blackness-0: hsl(210deg, 100%, 70%); + blackness-0: hsl(210, 100%, 70%); blackness-20: #6699cc; - blackness-40: hsl(210deg, 20%, 50%); + blackness-40: hsl(210, 20%, 50%); blackness-60: #666666; blackness-80: #555555; - blackness-100: hsl(0deg, 0%, 28.5714285714%); + blackness-100: hsl(0, 0%, 28.5714285714%); } whiteness-60 { blackness-0: #99ccff; - blackness-20: hsl(210deg, 33.3333333333%, 70%); + blackness-20: hsl(210, 33.3333333333%, 70%); blackness-40: #999999; - blackness-60: hsl(0deg, 0%, 50%); - blackness-80: hsl(0deg, 0%, 42.8571428571%); - blackness-100: hsl(0deg, 0%, 37.5%); + blackness-60: hsl(0, 0%, 50%); + blackness-80: hsl(0, 0%, 42.8571428571%); + blackness-100: hsl(0, 0%, 37.5%); } whiteness-80 { - blackness-0: hsl(210deg, 100%, 90%); + blackness-0: hsl(210, 100%, 90%); blackness-20: #cccccc; blackness-40: #aaaaaa; - blackness-60: hsl(0deg, 0%, 57.1428571429%); - blackness-80: hsl(0deg, 0%, 50%); - blackness-100: hsl(0deg, 0%, 44.4444444444%); + blackness-60: hsl(0, 0%, 57.1428571429%); + blackness-80: hsl(0, 0%, 50%); + blackness-100: hsl(0, 0%, 44.4444444444%); } whiteness-100 { blackness-0: white; - blackness-20: hsl(0deg, 0%, 83.3333333333%); - blackness-40: hsl(0deg, 0%, 71.4285714286%); - blackness-60: hsl(0deg, 0%, 62.5%); - blackness-80: hsl(0deg, 0%, 55.5555555556%); - blackness-100: hsl(0deg, 0%, 50%); + blackness-20: hsl(0, 0%, 83.3333333333%); + blackness-40: hsl(0, 0%, 71.4285714286%); + blackness-60: hsl(0, 0%, 62.5%); + blackness-80: hsl(0, 0%, 55.5555555556%); + blackness-100: hsl(0, 0%, 50%); } diff --git a/spec/core_functions/color/hwb/three_args/w3c/cyans.hrx b/spec/core_functions/color/hwb/three_args/w3c/cyans.hrx index c98a63e6c6..31731c6f03 100644 --- a/spec/core_functions/color/hwb/three_args/w3c/cyans.hrx +++ b/spec/core_functions/color/hwb/three_args/w3c/cyans.hrx @@ -18,7 +18,7 @@ whiteness-20 { blackness-40: #339999; blackness-60: #336666; blackness-80: #333333; - blackness-100: hsl(0deg, 0%, 16.6666666667%); + blackness-100: hsl(0, 0%, 16.6666666667%); } whiteness-40 { @@ -27,32 +27,32 @@ whiteness-40 { blackness-40: #669999; blackness-60: #666666; blackness-80: #555555; - blackness-100: hsl(0deg, 0%, 28.5714285714%); + blackness-100: hsl(0, 0%, 28.5714285714%); } whiteness-60 { blackness-0: #99ffff; blackness-20: #99cccc; blackness-40: #999999; - blackness-60: hsl(0deg, 0%, 50%); - blackness-80: hsl(0deg, 0%, 42.8571428571%); - blackness-100: hsl(0deg, 0%, 37.5%); + blackness-60: hsl(0, 0%, 50%); + blackness-80: hsl(0, 0%, 42.8571428571%); + blackness-100: hsl(0, 0%, 37.5%); } whiteness-80 { blackness-0: #ccffff; blackness-20: #cccccc; blackness-40: #aaaaaa; - blackness-60: hsl(0deg, 0%, 57.1428571429%); - blackness-80: hsl(0deg, 0%, 50%); - blackness-100: hsl(0deg, 0%, 44.4444444444%); + blackness-60: hsl(0, 0%, 57.1428571429%); + blackness-80: hsl(0, 0%, 50%); + blackness-100: hsl(0, 0%, 44.4444444444%); } whiteness-100 { blackness-0: white; - blackness-20: hsl(0deg, 0%, 83.3333333333%); - blackness-40: hsl(0deg, 0%, 71.4285714286%); - blackness-60: hsl(0deg, 0%, 62.5%); - blackness-80: hsl(0deg, 0%, 55.5555555556%); - blackness-100: hsl(0deg, 0%, 50%); + blackness-20: hsl(0, 0%, 83.3333333333%); + blackness-40: hsl(0, 0%, 71.4285714286%); + blackness-60: hsl(0, 0%, 62.5%); + blackness-80: hsl(0, 0%, 55.5555555556%); + blackness-100: hsl(0, 0%, 50%); } diff --git a/spec/core_functions/color/hwb/three_args/w3c/green_cyans.hrx b/spec/core_functions/color/hwb/three_args/w3c/green_cyans.hrx index f9ba8875ec..ea997a90a7 100644 --- a/spec/core_functions/color/hwb/three_args/w3c/green_cyans.hrx +++ b/spec/core_functions/color/hwb/three_args/w3c/green_cyans.hrx @@ -4,55 +4,55 @@ <===> output.css whiteness-0 { - blackness-0: hsl(150deg, 100%, 50%); + blackness-0: hsl(150, 100%, 50%); blackness-20: #00cc66; - blackness-40: hsl(150deg, 100%, 30%); + blackness-40: hsl(150, 100%, 30%); blackness-60: #006633; - blackness-80: hsl(150deg, 100%, 10%); + blackness-80: hsl(150, 100%, 10%); blackness-100: black; } whiteness-20 { blackness-0: #33ff99; - blackness-20: hsl(150deg, 60%, 50%); + blackness-20: hsl(150, 60%, 50%); blackness-40: #339966; - blackness-60: hsl(150deg, 33.3333333333%, 30%); + blackness-60: hsl(150, 33.3333333333%, 30%); blackness-80: #333333; - blackness-100: hsl(0deg, 0%, 16.6666666667%); + blackness-100: hsl(0, 0%, 16.6666666667%); } whiteness-40 { - blackness-0: hsl(150deg, 100%, 70%); + blackness-0: hsl(150, 100%, 70%); blackness-20: #66cc99; - blackness-40: hsl(150deg, 20%, 50%); + blackness-40: hsl(150, 20%, 50%); blackness-60: #666666; blackness-80: #555555; - blackness-100: hsl(0deg, 0%, 28.5714285714%); + blackness-100: hsl(0, 0%, 28.5714285714%); } whiteness-60 { blackness-0: #99ffcc; - blackness-20: hsl(150deg, 33.3333333333%, 70%); + blackness-20: hsl(150, 33.3333333333%, 70%); blackness-40: #999999; - blackness-60: hsl(0deg, 0%, 50%); - blackness-80: hsl(0deg, 0%, 42.8571428571%); - blackness-100: hsl(0deg, 0%, 37.5%); + blackness-60: hsl(0, 0%, 50%); + blackness-80: hsl(0, 0%, 42.8571428571%); + blackness-100: hsl(0, 0%, 37.5%); } whiteness-80 { - blackness-0: hsl(150deg, 100%, 90%); + blackness-0: hsl(150, 100%, 90%); blackness-20: #cccccc; blackness-40: #aaaaaa; - blackness-60: hsl(0deg, 0%, 57.1428571429%); - blackness-80: hsl(0deg, 0%, 50%); - blackness-100: hsl(0deg, 0%, 44.4444444444%); + blackness-60: hsl(0, 0%, 57.1428571429%); + blackness-80: hsl(0, 0%, 50%); + blackness-100: hsl(0, 0%, 44.4444444444%); } whiteness-100 { blackness-0: white; - blackness-20: hsl(0deg, 0%, 83.3333333333%); - blackness-40: hsl(0deg, 0%, 71.4285714286%); - blackness-60: hsl(0deg, 0%, 62.5%); - blackness-80: hsl(0deg, 0%, 55.5555555556%); - blackness-100: hsl(0deg, 0%, 50%); + blackness-20: hsl(0, 0%, 83.3333333333%); + blackness-40: hsl(0, 0%, 71.4285714286%); + blackness-60: hsl(0, 0%, 62.5%); + blackness-80: hsl(0, 0%, 55.5555555556%); + blackness-100: hsl(0, 0%, 50%); } diff --git a/spec/core_functions/color/hwb/three_args/w3c/greens.hrx b/spec/core_functions/color/hwb/three_args/w3c/greens.hrx index eaa5bd93f2..0433fa1d92 100644 --- a/spec/core_functions/color/hwb/three_args/w3c/greens.hrx +++ b/spec/core_functions/color/hwb/three_args/w3c/greens.hrx @@ -18,7 +18,7 @@ whiteness-20 { blackness-40: #339933; blackness-60: #336633; blackness-80: #333333; - blackness-100: hsl(0deg, 0%, 16.6666666667%); + blackness-100: hsl(0, 0%, 16.6666666667%); } whiteness-40 { @@ -27,32 +27,32 @@ whiteness-40 { blackness-40: #669966; blackness-60: #666666; blackness-80: #555555; - blackness-100: hsl(0deg, 0%, 28.5714285714%); + blackness-100: hsl(0, 0%, 28.5714285714%); } whiteness-60 { blackness-0: #99ff99; blackness-20: #99cc99; blackness-40: #999999; - blackness-60: hsl(0deg, 0%, 50%); - blackness-80: hsl(0deg, 0%, 42.8571428571%); - blackness-100: hsl(0deg, 0%, 37.5%); + blackness-60: hsl(0, 0%, 50%); + blackness-80: hsl(0, 0%, 42.8571428571%); + blackness-100: hsl(0, 0%, 37.5%); } whiteness-80 { blackness-0: #ccffcc; blackness-20: #cccccc; blackness-40: #aaaaaa; - blackness-60: hsl(0deg, 0%, 57.1428571429%); - blackness-80: hsl(0deg, 0%, 50%); - blackness-100: hsl(0deg, 0%, 44.4444444444%); + blackness-60: hsl(0, 0%, 57.1428571429%); + blackness-80: hsl(0, 0%, 50%); + blackness-100: hsl(0, 0%, 44.4444444444%); } whiteness-100 { blackness-0: white; - blackness-20: hsl(0deg, 0%, 83.3333333333%); - blackness-40: hsl(0deg, 0%, 71.4285714286%); - blackness-60: hsl(0deg, 0%, 62.5%); - blackness-80: hsl(0deg, 0%, 55.5555555556%); - blackness-100: hsl(0deg, 0%, 50%); + blackness-20: hsl(0, 0%, 83.3333333333%); + blackness-40: hsl(0, 0%, 71.4285714286%); + blackness-60: hsl(0, 0%, 62.5%); + blackness-80: hsl(0, 0%, 55.5555555556%); + blackness-100: hsl(0, 0%, 50%); } diff --git a/spec/core_functions/color/hwb/three_args/w3c/magenta_reds.hrx b/spec/core_functions/color/hwb/three_args/w3c/magenta_reds.hrx index 0ec6ed2327..b142c620f9 100644 --- a/spec/core_functions/color/hwb/three_args/w3c/magenta_reds.hrx +++ b/spec/core_functions/color/hwb/three_args/w3c/magenta_reds.hrx @@ -4,55 +4,55 @@ <===> output.css whiteness-0 { - blackness-0: hsl(330deg, 100%, 50%); + blackness-0: hsl(330, 100%, 50%); blackness-20: #cc0066; - blackness-40: hsl(330deg, 100%, 30%); + blackness-40: hsl(330, 100%, 30%); blackness-60: #660033; - blackness-80: hsl(330deg, 100%, 10%); + blackness-80: hsl(330, 100%, 10%); blackness-100: black; } whiteness-20 { blackness-0: #ff3399; - blackness-20: hsl(330deg, 60%, 50%); + blackness-20: hsl(330, 60%, 50%); blackness-40: #993366; - blackness-60: hsl(330deg, 33.3333333333%, 30%); + blackness-60: hsl(330, 33.3333333333%, 30%); blackness-80: #333333; - blackness-100: hsl(0deg, 0%, 16.6666666667%); + blackness-100: hsl(0, 0%, 16.6666666667%); } whiteness-40 { - blackness-0: hsl(330deg, 100%, 70%); + blackness-0: hsl(330, 100%, 70%); blackness-20: #cc6699; - blackness-40: hsl(330deg, 20%, 50%); + blackness-40: hsl(330, 20%, 50%); blackness-60: #666666; blackness-80: #555555; - blackness-100: hsl(0deg, 0%, 28.5714285714%); + blackness-100: hsl(0, 0%, 28.5714285714%); } whiteness-60 { blackness-0: #ff99cc; - blackness-20: hsl(330deg, 33.3333333333%, 70%); + blackness-20: hsl(330, 33.3333333333%, 70%); blackness-40: #999999; - blackness-60: hsl(0deg, 0%, 50%); - blackness-80: hsl(0deg, 0%, 42.8571428571%); - blackness-100: hsl(0deg, 0%, 37.5%); + blackness-60: hsl(0, 0%, 50%); + blackness-80: hsl(0, 0%, 42.8571428571%); + blackness-100: hsl(0, 0%, 37.5%); } whiteness-80 { - blackness-0: hsl(330deg, 100%, 90%); + blackness-0: hsl(330, 100%, 90%); blackness-20: #cccccc; blackness-40: #aaaaaa; - blackness-60: hsl(0deg, 0%, 57.1428571429%); - blackness-80: hsl(0deg, 0%, 50%); - blackness-100: hsl(0deg, 0%, 44.4444444444%); + blackness-60: hsl(0, 0%, 57.1428571429%); + blackness-80: hsl(0, 0%, 50%); + blackness-100: hsl(0, 0%, 44.4444444444%); } whiteness-100 { blackness-0: white; - blackness-20: hsl(0deg, 0%, 83.3333333333%); - blackness-40: hsl(0deg, 0%, 71.4285714286%); - blackness-60: hsl(0deg, 0%, 62.5%); - blackness-80: hsl(0deg, 0%, 55.5555555556%); - blackness-100: hsl(0deg, 0%, 50%); + blackness-20: hsl(0, 0%, 83.3333333333%); + blackness-40: hsl(0, 0%, 71.4285714286%); + blackness-60: hsl(0, 0%, 62.5%); + blackness-80: hsl(0, 0%, 55.5555555556%); + blackness-100: hsl(0, 0%, 50%); } diff --git a/spec/core_functions/color/hwb/three_args/w3c/magentas.hrx b/spec/core_functions/color/hwb/three_args/w3c/magentas.hrx index ff59010e3a..dfc330a2f8 100644 --- a/spec/core_functions/color/hwb/three_args/w3c/magentas.hrx +++ b/spec/core_functions/color/hwb/three_args/w3c/magentas.hrx @@ -18,7 +18,7 @@ whiteness-20 { blackness-40: #993399; blackness-60: #663366; blackness-80: #333333; - blackness-100: hsl(0deg, 0%, 16.6666666667%); + blackness-100: hsl(0, 0%, 16.6666666667%); } whiteness-40 { @@ -27,32 +27,32 @@ whiteness-40 { blackness-40: #996699; blackness-60: #666666; blackness-80: #555555; - blackness-100: hsl(0deg, 0%, 28.5714285714%); + blackness-100: hsl(0, 0%, 28.5714285714%); } whiteness-60 { blackness-0: #ff99ff; blackness-20: #cc99cc; blackness-40: #999999; - blackness-60: hsl(0deg, 0%, 50%); - blackness-80: hsl(0deg, 0%, 42.8571428571%); - blackness-100: hsl(0deg, 0%, 37.5%); + blackness-60: hsl(0, 0%, 50%); + blackness-80: hsl(0, 0%, 42.8571428571%); + blackness-100: hsl(0, 0%, 37.5%); } whiteness-80 { blackness-0: #ffccff; blackness-20: #cccccc; blackness-40: #aaaaaa; - blackness-60: hsl(0deg, 0%, 57.1428571429%); - blackness-80: hsl(0deg, 0%, 50%); - blackness-100: hsl(0deg, 0%, 44.4444444444%); + blackness-60: hsl(0, 0%, 57.1428571429%); + blackness-80: hsl(0, 0%, 50%); + blackness-100: hsl(0, 0%, 44.4444444444%); } whiteness-100 { blackness-0: white; - blackness-20: hsl(0deg, 0%, 83.3333333333%); - blackness-40: hsl(0deg, 0%, 71.4285714286%); - blackness-60: hsl(0deg, 0%, 62.5%); - blackness-80: hsl(0deg, 0%, 55.5555555556%); - blackness-100: hsl(0deg, 0%, 50%); + blackness-20: hsl(0, 0%, 83.3333333333%); + blackness-40: hsl(0, 0%, 71.4285714286%); + blackness-60: hsl(0, 0%, 62.5%); + blackness-80: hsl(0, 0%, 55.5555555556%); + blackness-100: hsl(0, 0%, 50%); } diff --git a/spec/core_functions/color/hwb/three_args/w3c/oranges.hrx b/spec/core_functions/color/hwb/three_args/w3c/oranges.hrx index 2653728396..735649a77e 100644 --- a/spec/core_functions/color/hwb/three_args/w3c/oranges.hrx +++ b/spec/core_functions/color/hwb/three_args/w3c/oranges.hrx @@ -4,55 +4,55 @@ <===> output.css whiteness-0 { - blackness-0: hsl(30deg, 100%, 50%); + blackness-0: hsl(30, 100%, 50%); blackness-20: #cc6600; - blackness-40: hsl(30deg, 100%, 30%); + blackness-40: hsl(30, 100%, 30%); blackness-60: #663300; - blackness-80: hsl(30deg, 100%, 10%); + blackness-80: hsl(30, 100%, 10%); blackness-100: black; } whiteness-20 { blackness-0: #ff9933; - blackness-20: hsl(30deg, 60%, 50%); + blackness-20: hsl(30, 60%, 50%); blackness-40: #996633; - blackness-60: hsl(30deg, 33.3333333333%, 30%); + blackness-60: hsl(30, 33.3333333333%, 30%); blackness-80: #333333; - blackness-100: hsl(0deg, 0%, 16.6666666667%); + blackness-100: hsl(0, 0%, 16.6666666667%); } whiteness-40 { - blackness-0: hsl(30deg, 100%, 70%); + blackness-0: hsl(30, 100%, 70%); blackness-20: #cc9966; - blackness-40: hsl(30deg, 20%, 50%); + blackness-40: hsl(30, 20%, 50%); blackness-60: #666666; blackness-80: #555555; - blackness-100: hsl(0deg, 0%, 28.5714285714%); + blackness-100: hsl(0, 0%, 28.5714285714%); } whiteness-60 { blackness-0: #ffcc99; - blackness-20: hsl(30deg, 33.3333333333%, 70%); + blackness-20: hsl(30, 33.3333333333%, 70%); blackness-40: #999999; - blackness-60: hsl(0deg, 0%, 50%); - blackness-80: hsl(0deg, 0%, 42.8571428571%); - blackness-100: hsl(0deg, 0%, 37.5%); + blackness-60: hsl(0, 0%, 50%); + blackness-80: hsl(0, 0%, 42.8571428571%); + blackness-100: hsl(0, 0%, 37.5%); } whiteness-80 { - blackness-0: hsl(30deg, 100%, 90%); + blackness-0: hsl(30, 100%, 90%); blackness-20: #cccccc; blackness-40: #aaaaaa; - blackness-60: hsl(0deg, 0%, 57.1428571429%); - blackness-80: hsl(0deg, 0%, 50%); - blackness-100: hsl(0deg, 0%, 44.4444444444%); + blackness-60: hsl(0, 0%, 57.1428571429%); + blackness-80: hsl(0, 0%, 50%); + blackness-100: hsl(0, 0%, 44.4444444444%); } whiteness-100 { blackness-0: white; - blackness-20: hsl(0deg, 0%, 83.3333333333%); - blackness-40: hsl(0deg, 0%, 71.4285714286%); - blackness-60: hsl(0deg, 0%, 62.5%); - blackness-80: hsl(0deg, 0%, 55.5555555556%); - blackness-100: hsl(0deg, 0%, 50%); + blackness-20: hsl(0, 0%, 83.3333333333%); + blackness-40: hsl(0, 0%, 71.4285714286%); + blackness-60: hsl(0, 0%, 62.5%); + blackness-80: hsl(0, 0%, 55.5555555556%); + blackness-100: hsl(0, 0%, 50%); } diff --git a/spec/core_functions/color/hwb/three_args/w3c/reds.hrx b/spec/core_functions/color/hwb/three_args/w3c/reds.hrx index 20bd6a78bc..6fe9f6d314 100644 --- a/spec/core_functions/color/hwb/three_args/w3c/reds.hrx +++ b/spec/core_functions/color/hwb/three_args/w3c/reds.hrx @@ -18,7 +18,7 @@ whiteness-20 { blackness-40: #993333; blackness-60: #663333; blackness-80: #333333; - blackness-100: hsl(0deg, 0%, 16.6666666667%); + blackness-100: hsl(0, 0%, 16.6666666667%); } whiteness-40 { @@ -27,32 +27,32 @@ whiteness-40 { blackness-40: #996666; blackness-60: #666666; blackness-80: #555555; - blackness-100: hsl(0deg, 0%, 28.5714285714%); + blackness-100: hsl(0, 0%, 28.5714285714%); } whiteness-60 { blackness-0: #ff9999; blackness-20: #cc9999; blackness-40: #999999; - blackness-60: hsl(0deg, 0%, 50%); - blackness-80: hsl(0deg, 0%, 42.8571428571%); - blackness-100: hsl(0deg, 0%, 37.5%); + blackness-60: hsl(0, 0%, 50%); + blackness-80: hsl(0, 0%, 42.8571428571%); + blackness-100: hsl(0, 0%, 37.5%); } whiteness-80 { blackness-0: #ffcccc; blackness-20: #cccccc; blackness-40: #aaaaaa; - blackness-60: hsl(0deg, 0%, 57.1428571429%); - blackness-80: hsl(0deg, 0%, 50%); - blackness-100: hsl(0deg, 0%, 44.4444444444%); + blackness-60: hsl(0, 0%, 57.1428571429%); + blackness-80: hsl(0, 0%, 50%); + blackness-100: hsl(0, 0%, 44.4444444444%); } whiteness-100 { blackness-0: white; - blackness-20: hsl(0deg, 0%, 83.3333333333%); - blackness-40: hsl(0deg, 0%, 71.4285714286%); - blackness-60: hsl(0deg, 0%, 62.5%); - blackness-80: hsl(0deg, 0%, 55.5555555556%); - blackness-100: hsl(0deg, 0%, 50%); + blackness-20: hsl(0, 0%, 83.3333333333%); + blackness-40: hsl(0, 0%, 71.4285714286%); + blackness-60: hsl(0, 0%, 62.5%); + blackness-80: hsl(0, 0%, 55.5555555556%); + blackness-100: hsl(0, 0%, 50%); } diff --git a/spec/core_functions/color/hwb/three_args/w3c/yellow_greens.hrx b/spec/core_functions/color/hwb/three_args/w3c/yellow_greens.hrx index 0e478a1356..0019525ed6 100644 --- a/spec/core_functions/color/hwb/three_args/w3c/yellow_greens.hrx +++ b/spec/core_functions/color/hwb/three_args/w3c/yellow_greens.hrx @@ -4,55 +4,55 @@ <===> output.css whiteness-0 { - blackness-0: hsl(90deg, 100%, 50%); + blackness-0: hsl(90, 100%, 50%); blackness-20: #66cc00; - blackness-40: hsl(90deg, 100%, 30%); + blackness-40: hsl(90, 100%, 30%); blackness-60: #336600; - blackness-80: hsl(90deg, 100%, 10%); + blackness-80: hsl(90, 100%, 10%); blackness-100: black; } whiteness-20 { blackness-0: #99ff33; - blackness-20: hsl(90deg, 60%, 50%); + blackness-20: hsl(90, 60%, 50%); blackness-40: #669933; - blackness-60: hsl(90deg, 33.3333333333%, 30%); + blackness-60: hsl(90, 33.3333333333%, 30%); blackness-80: #333333; - blackness-100: hsl(0deg, 0%, 16.6666666667%); + blackness-100: hsl(0, 0%, 16.6666666667%); } whiteness-40 { - blackness-0: hsl(90deg, 100%, 70%); + blackness-0: hsl(90, 100%, 70%); blackness-20: #99cc66; - blackness-40: hsl(90deg, 20%, 50%); + blackness-40: hsl(90, 20%, 50%); blackness-60: #666666; blackness-80: #555555; - blackness-100: hsl(0deg, 0%, 28.5714285714%); + blackness-100: hsl(0, 0%, 28.5714285714%); } whiteness-60 { blackness-0: #ccff99; - blackness-20: hsl(90deg, 33.3333333333%, 70%); + blackness-20: hsl(90, 33.3333333333%, 70%); blackness-40: #999999; - blackness-60: hsl(0deg, 0%, 50%); - blackness-80: hsl(0deg, 0%, 42.8571428571%); - blackness-100: hsl(0deg, 0%, 37.5%); + blackness-60: hsl(0, 0%, 50%); + blackness-80: hsl(0, 0%, 42.8571428571%); + blackness-100: hsl(0, 0%, 37.5%); } whiteness-80 { - blackness-0: hsl(90deg, 100%, 90%); + blackness-0: hsl(90, 100%, 90%); blackness-20: #cccccc; blackness-40: #aaaaaa; - blackness-60: hsl(0deg, 0%, 57.1428571429%); - blackness-80: hsl(0deg, 0%, 50%); - blackness-100: hsl(0deg, 0%, 44.4444444444%); + blackness-60: hsl(0, 0%, 57.1428571429%); + blackness-80: hsl(0, 0%, 50%); + blackness-100: hsl(0, 0%, 44.4444444444%); } whiteness-100 { blackness-0: white; - blackness-20: hsl(0deg, 0%, 83.3333333333%); - blackness-40: hsl(0deg, 0%, 71.4285714286%); - blackness-60: hsl(0deg, 0%, 62.5%); - blackness-80: hsl(0deg, 0%, 55.5555555556%); - blackness-100: hsl(0deg, 0%, 50%); + blackness-20: hsl(0, 0%, 83.3333333333%); + blackness-40: hsl(0, 0%, 71.4285714286%); + blackness-60: hsl(0, 0%, 62.5%); + blackness-80: hsl(0, 0%, 55.5555555556%); + blackness-100: hsl(0, 0%, 50%); } diff --git a/spec/core_functions/color/hwb/three_args/w3c/yellows.hrx b/spec/core_functions/color/hwb/three_args/w3c/yellows.hrx index ebdbed7039..267c529b0b 100644 --- a/spec/core_functions/color/hwb/three_args/w3c/yellows.hrx +++ b/spec/core_functions/color/hwb/three_args/w3c/yellows.hrx @@ -18,7 +18,7 @@ whiteness-20 { blackness-40: #999933; blackness-60: #666633; blackness-80: #333333; - blackness-100: hsl(0deg, 0%, 16.6666666667%); + blackness-100: hsl(0, 0%, 16.6666666667%); } whiteness-40 { @@ -27,32 +27,32 @@ whiteness-40 { blackness-40: #999966; blackness-60: #666666; blackness-80: #555555; - blackness-100: hsl(0deg, 0%, 28.5714285714%); + blackness-100: hsl(0, 0%, 28.5714285714%); } whiteness-60 { blackness-0: #ffff99; blackness-20: #cccc99; blackness-40: #999999; - blackness-60: hsl(0deg, 0%, 50%); - blackness-80: hsl(0deg, 0%, 42.8571428571%); - blackness-100: hsl(0deg, 0%, 37.5%); + blackness-60: hsl(0, 0%, 50%); + blackness-80: hsl(0, 0%, 42.8571428571%); + blackness-100: hsl(0, 0%, 37.5%); } whiteness-80 { blackness-0: #ffffcc; blackness-20: #cccccc; blackness-40: #aaaaaa; - blackness-60: hsl(0deg, 0%, 57.1428571429%); - blackness-80: hsl(0deg, 0%, 50%); - blackness-100: hsl(0deg, 0%, 44.4444444444%); + blackness-60: hsl(0, 0%, 57.1428571429%); + blackness-80: hsl(0, 0%, 50%); + blackness-100: hsl(0, 0%, 44.4444444444%); } whiteness-100 { blackness-0: white; - blackness-20: hsl(0deg, 0%, 83.3333333333%); - blackness-40: hsl(0deg, 0%, 71.4285714286%); - blackness-60: hsl(0deg, 0%, 62.5%); - blackness-80: hsl(0deg, 0%, 55.5555555556%); - blackness-100: hsl(0deg, 0%, 50%); + blackness-20: hsl(0, 0%, 83.3333333333%); + blackness-40: hsl(0, 0%, 71.4285714286%); + blackness-60: hsl(0, 0%, 62.5%); + blackness-80: hsl(0, 0%, 55.5555555556%); + blackness-100: hsl(0, 0%, 50%); } diff --git a/spec/core_functions/color/invert.hrx b/spec/core_functions/color/invert.hrx index 0f85750e29..5fb0e25d7f 100644 --- a/spec/core_functions/color/invert.hrx +++ b/spec/core_functions/color/invert.hrx @@ -170,6 +170,48 @@ More info: https://sass-lang.com/d/function-units ' input.scss 1:7 root stylesheet +<===> +================================================================================ +<===> with_css_var/options.yml +':ignore_for': + - libsass + +<===> with_css_var/input.scss +a {b: invert(var(--c))} + +<===> with_css_var/output.css +a { + b: invert(var(--c)); +} + +<===> +================================================================================ +<===> with_calc/options.yml +:ignore_for: + - libsass + +<===> with_calc/input.scss +a {b: invert(calc(1 + 2))} + +<===> with_calc/output.css +a { + b: invert(3); +} + +<===> +================================================================================ +<===> with_unquoted_calc/options.yml +:ignore_for: + - libsass + +<===> with_unquoted_calc/input.scss +a {b: invert(unquote('calc(1)'))} + +<===> with_unquoted_calc/output.css +a { + b: invert(calc(1)); +} + <===> ================================================================================ <===> error/too_few_args/input.scss @@ -257,6 +299,24 @@ Error: argument `$color` of `invert($color, $weight: 100%)` must be a color ------^ +<===> +================================================================================ +<===> error/type/with_module/options.yml +':ignore_for': + - libsass + +<===> error/type/with_module/input.scss +@use 'sass:color'; +a {b: color.invert(var(--c))} + +<===> error/type/with_module/error +Error: $color: var(--c) is not a color. + , +2 | a {b: color.invert(var(--c))} + | ^^^^^^^^^^^^^^^^^^^^^^ + ' + input.scss 2:7 root stylesheet + <===> ================================================================================ <===> error/type/weight/input.scss diff --git a/spec/core_functions/color/mix/mixed_spaces.hrx b/spec/core_functions/color/mix/mixed_spaces.hrx index 4fff0860e9..db6581f8bd 100644 --- a/spec/core_functions/color/mix/mixed_spaces.hrx +++ b/spec/core_functions/color/mix/mixed_spaces.hrx @@ -7,5 +7,5 @@ a {b: mix(hsl(0 100% 50%), green, $method: lch)} <===> output.css a { - b: hsl(49.4586711601deg, 100%, 27.8089044382%); + b: hsl(49.4586711601, 100%, 27.8089044382%); } diff --git a/spec/core_functions/color/saturate.hrx b/spec/core_functions/color/saturate.hrx index ac19cf5a78..1f2bc40d12 100644 --- a/spec/core_functions/color/saturate.hrx +++ b/spec/core_functions/color/saturate.hrx @@ -29,6 +29,55 @@ a { b: saturate(1); } +<===> +================================================================================ +<===> one_arg/with_sass_var/input.scss +$c: 1; +a {b: saturate($c)} + +<===> one_arg/with_sass_var/output.css +a { + b: saturate(1); +} + +<===> +================================================================================ +<===> one_arg/with_css_var/input.scss +a {b: saturate(var(--c))} + +<===> one_arg/with_css_var/output.css +a { + b: saturate(var(--c)); +} + +<===> +================================================================================ +<===> one_arg/with_calc/options.yml +:ignore_for: + - libsass + +<===> one_arg/with_calc/input.scss +a {b: saturate(calc(1 + 2))} + +<===> one_arg/with_calc/output.css +a { + b: saturate(3); +} + +<===> +================================================================================ +<===> one_arg/with_unquoted_calc/options.yml +:ignore_for: + - libsass + +<===> one_arg/with_unquoted_calc/input.scss +a {b: saturate(unquote('calc(1)'))} + +<===> one_arg/with_unquoted_calc/output.css +a { + b: saturate(calc(1)); +} + <===> ================================================================================ <===> one_arg/named/options.yml @@ -263,6 +312,29 @@ Error: $amount: red is not a number. ' input.scss 1:7 root stylesheet + +<===> +================================================================================ +<===> error/with_module/one_arg/type/options.yml +':ignore_for': + - libsass + +<===> error/with_module/one_arg/type/input.scss +@use 'sass:color'; +a {b: color.saturate(var(--c))} + +<===> error/with_module/one_arg/type/error +Error: Missing argument $amount. + ,--> input.scss +2 | a {b: color.saturate(var(--c))} + | ^^^^^^^^^^^^^^^^^^^^^^^^ invocation + ' + ,--> sass:color +1 | @function saturate($color, $amount) { + | ========================= declaration + ' + input.scss 2:7 root stylesheet + <===> ================================================================================ <===> error/two_args/type/color/input.scss diff --git a/spec/core_functions/math/acos.hrx b/spec/core_functions/math/acos.hrx index 375d29bce0..5117c4d10f 100644 --- a/spec/core_functions/math/acos.hrx +++ b/spec/core_functions/math/acos.hrx @@ -6,18 +6,18 @@ <===> ================================================================================ <===> less_than_negative_one/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.acos(-2)} <===> less_than_negative_one/output.css a { - b: NaNdeg; + b: calc(NaN * 1deg); } <===> ================================================================================ <===> negative_decimal/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.acos(-0.5)} <===> negative_decimal/output.css @@ -28,7 +28,7 @@ a { <===> ================================================================================ <===> decimal/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.acos(0.5)} <===> decimal/output.css @@ -39,7 +39,7 @@ a { <===> ================================================================================ <===> one/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.acos(1)} <===> one/output.css @@ -50,29 +50,29 @@ a { <===> ================================================================================ <===> one_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.acos(1.000000000001)} <===> one_fuzzy/output.css a { - b: NaNdeg; + b: calc(NaN * 1deg); } <===> ================================================================================ <===> greater_than_one/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.acos(2)} <===> greater_than_one/output.css a { - b: NaNdeg; + b: calc(NaN * 1deg); } <===> ================================================================================ <===> error/type/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.acos("0")} <===> error/type/error @@ -86,7 +86,7 @@ Error: $number: "0" is not a number. <===> ================================================================================ <===> error/units/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.acos(1px)} <===> error/units/error @@ -100,7 +100,7 @@ Error: $number: Expected 1px to have no units. <===> ================================================================================ <===> error/zero_args/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.acos()} <===> error/zero_args/error @@ -118,7 +118,7 @@ Error: Missing argument $number. <===> ================================================================================ <===> error/too_many_args/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.acos(0, 0)} <===> error/too_many_args/error diff --git a/spec/core_functions/math/asin.hrx b/spec/core_functions/math/asin.hrx index 1eda918129..9c53b79340 100644 --- a/spec/core_functions/math/asin.hrx +++ b/spec/core_functions/math/asin.hrx @@ -6,18 +6,18 @@ <===> ================================================================================ <===> less_than_negative_one/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.asin(-2)} <===> less_than_negative_one/output.css a { - b: NaNdeg; + b: calc(NaN * 1deg); } <===> ================================================================================ <===> negative_decimal/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.asin(-0.5)} <===> negative_decimal/output.css @@ -28,7 +28,7 @@ a { <===> ================================================================================ <===> negative_zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.asin(-0.0)} <===> negative_zero/output.css @@ -39,7 +39,7 @@ a { <===> ================================================================================ <===> negative_zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.asin(-0.000000000001)} <===> negative_zero_fuzzy/output.css @@ -50,7 +50,7 @@ a { <===> ================================================================================ <===> zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.asin(0)} <===> zero/output.css @@ -61,7 +61,7 @@ a { <===> ================================================================================ <===> zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.asin(0.000000000001)} <===> zero_fuzzy/output.css @@ -72,7 +72,7 @@ a { <===> ================================================================================ <===> decimal/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.asin(0.5)} <===> decimal/output.css @@ -83,7 +83,7 @@ a { <===> ================================================================================ <===> one/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.asin(1)} <===> one/output.css @@ -94,29 +94,29 @@ a { <===> ================================================================================ <===> one_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.asin(1.000000000001)} <===> one_fuzzy/output.css a { - b: NaNdeg; + b: calc(NaN * 1deg); } <===> ================================================================================ <===> greater_than_one/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.asin(2)} <===> greater_than_one/output.css a { - b: NaNdeg; + b: calc(NaN * 1deg); } <===> ================================================================================ <===> error/type/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.asin("0")} <===> error/type/error @@ -130,7 +130,7 @@ Error: $number: "0" is not a number. <===> ================================================================================ <===> error/units/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.asin(1px)} <===> error/units/error @@ -144,7 +144,7 @@ Error: $number: Expected 1px to have no units. <===> ================================================================================ <===> error/zero_args/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.asin()} <===> error/zero_args/error @@ -162,7 +162,7 @@ Error: Missing argument $number. <===> ================================================================================ <===> error/too_many_args/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.asin(0, 0)} <===> error/too_many_args/error diff --git a/spec/core_functions/math/atan.hrx b/spec/core_functions/math/atan.hrx index ffea2e2d5f..7d70796225 100644 --- a/spec/core_functions/math/atan.hrx +++ b/spec/core_functions/math/atan.hrx @@ -6,7 +6,7 @@ <===> ================================================================================ <===> negative_infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan(math.div(-1, 0))} <===> negative_infinity/output.css @@ -17,7 +17,7 @@ a { <===> ================================================================================ <===> negative/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan(-1)} <===> negative/output.css @@ -28,7 +28,7 @@ a { <===> ================================================================================ <===> negative_zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan(-0.0)} <===> negative_zero/output.css @@ -39,7 +39,7 @@ a { <===> ================================================================================ <===> negative_zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan(-0.000000000001)} <===> negative_zero_fuzzy/output.css @@ -50,7 +50,7 @@ a { <===> ================================================================================ <===> zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan(0)} <===> zero/output.css @@ -61,7 +61,7 @@ a { <===> ================================================================================ <===> zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan(0.000000000001)} <===> zero_fuzzy/output.css @@ -72,7 +72,7 @@ a { <===> ================================================================================ <===> positive/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan(1)} <===> positive/output.css @@ -83,7 +83,7 @@ a { <===> ================================================================================ <===> infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan(math.div(1, 0))} <===> infinity/output.css @@ -94,7 +94,7 @@ a { <===> ================================================================================ <===> error/type/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan("0")} <===> error/type/error @@ -108,7 +108,7 @@ Error: $number: "0" is not a number. <===> ================================================================================ <===> error/units/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan(1px)} <===> error/units/error @@ -122,7 +122,7 @@ Error: $number: Expected 1px to have no units. <===> ================================================================================ <===> error/zero_args/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan()} <===> error/zero_args/error @@ -140,7 +140,7 @@ Error: Missing argument $number. <===> ================================================================================ <===> error/too_many_args/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan(0, 0)} <===> error/too_many_args/error diff --git a/spec/core_functions/math/atan2/arguments.hrx b/spec/core_functions/math/atan2/arguments.hrx index 9e7ccc93ad..fefe10542e 100644 --- a/spec/core_functions/math/atan2/arguments.hrx +++ b/spec/core_functions/math/atan2/arguments.hrx @@ -1,5 +1,5 @@ <===> named_args/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2($y: 1, $x: -1)} <===> named_args/output.css @@ -10,7 +10,7 @@ a { <===> ================================================================================ <===> compatible_units/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(1cm, -10mm)} <===> compatible_units/output.css @@ -21,7 +21,7 @@ a { <===> ================================================================================ <===> error/y_type/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2("0", 0)} <===> error/y_type/error @@ -35,7 +35,7 @@ Error: $y: "0" is not a number. <===> ================================================================================ <===> error/x_type/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(0, "0")} <===> error/x_type/error @@ -49,7 +49,7 @@ Error: $x: "0" is not a number. <===> ================================================================================ <===> error/incompatible_units/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(1px, 1deg)} <===> error/incompatible_units/error @@ -63,7 +63,7 @@ Error: $x: 1deg and $y: 1px have incompatible units. <===> ================================================================================ <===> error/unitless_y/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(1, 1px)} <===> error/unitless_y/error @@ -77,7 +77,7 @@ Error: $x: 1px and $y: 1 have incompatible units (one has units and the other do <===> ================================================================================ <===> error/unitless_x/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(1px, 1)} <===> error/unitless_x/error @@ -91,7 +91,7 @@ Error: $x: 1 and $y: 1px have incompatible units (one has units and the other do <===> ================================================================================ <===> error/zero_args/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2()} <===> error/zero_args/error @@ -109,7 +109,7 @@ Error: Missing argument $y. <===> ================================================================================ <===> error/one_arg/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(0)} <===> error/one_arg/error @@ -127,7 +127,7 @@ Error: Missing argument $x. <===> ================================================================================ <===> error/too_many_args/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(0, 0, 0)} <===> error/too_many_args/error diff --git a/spec/core_functions/math/atan2/y_infinite.hrx b/spec/core_functions/math/atan2/y_infinite.hrx index a721c1d8eb..d02f3d8844 100644 --- a/spec/core_functions/math/atan2/y_infinite.hrx +++ b/spec/core_functions/math/atan2/y_infinite.hrx @@ -1,5 +1,5 @@ <===> negative/with_x/negative_infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(math.div(-1, 0), math.div(-1, 0))} <===> negative/with_x/negative_infinity/output.css @@ -10,7 +10,7 @@ a { <===> ================================================================================ <===> negative/with_x/negative_finite/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(math.div(-1, 0), -1)} <===> negative/with_x/negative_finite/output.css @@ -21,7 +21,7 @@ a { <===> ================================================================================ <===> negative/with_x/negative_zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(math.div(-1, 0), -0.0)} <===> negative/with_x/negative_zero/output.css @@ -32,7 +32,7 @@ a { <===> ================================================================================ <===> negative/with_x/zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(math.div(-1, 0), 0)} <===> negative/with_x/zero/output.css @@ -43,7 +43,7 @@ a { <===> ================================================================================ <===> negative/with_x/finite/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(math.div(-1, 0), 1)} <===> negative/with_x/finite/output.css @@ -54,7 +54,7 @@ a { <===> ================================================================================ <===> negative/with_x/infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(math.div(-1, 0), math.div(1, 0))} <===> negative/with_x/infinity/output.css @@ -65,7 +65,7 @@ a { <===> ================================================================================ <===> positive/with_x/negative_infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(math.div(1, 0), math.div(-1, 0))} <===> positive/with_x/negative_infinity/output.css @@ -76,7 +76,7 @@ a { <===> ================================================================================ <===> positive/with_x/negative_finite/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(math.div(1, 0), -1)} <===> positive/with_x/negative_finite/output.css @@ -87,7 +87,7 @@ a { <===> ================================================================================ <===> positive/with_x/negative_zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(math.div(1, 0), -0.0)} <===> positive/with_x/negative_zero/output.css @@ -98,7 +98,7 @@ a { <===> ================================================================================ <===> positive/with_x/negative_zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(math.div(1, 0), -0.000000000001)} <===> positive/with_x/negative_zero_fuzzy/output.css @@ -109,7 +109,7 @@ a { <===> ================================================================================ <===> positive/with_x/zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(math.div(1, 0), 0)} <===> positive/with_x/zero/output.css @@ -120,7 +120,7 @@ a { <===> ================================================================================ <===> positive/with_x/zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(math.div(1, 0), 0.000000000001)} <===> positive/with_x/zero_fuzzy/output.css @@ -131,7 +131,7 @@ a { <===> ================================================================================ <===> positive/with_x/finite/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(math.div(1, 0), 1)} <===> positive/with_x/finite/output.css @@ -142,7 +142,7 @@ a { <===> ================================================================================ <===> positive/with_x/infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(math.div(1, 0), math.div(1, 0))} <===> positive/with_x/infinity/output.css diff --git a/spec/core_functions/math/atan2/y_non_zero_finite.hrx b/spec/core_functions/math/atan2/y_non_zero_finite.hrx index 761f524954..b28f31313f 100644 --- a/spec/core_functions/math/atan2/y_non_zero_finite.hrx +++ b/spec/core_functions/math/atan2/y_non_zero_finite.hrx @@ -1,5 +1,5 @@ <===> negative/with_x/negative_infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(-1, math.div(-1, 0))} <===> negative/with_x/negative_infinity/output.css @@ -10,7 +10,7 @@ a { <===> ================================================================================ <===> negative/with_x/negative_finite/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(-1, -1)} <===> negative/with_x/negative_finite/output.css @@ -21,7 +21,7 @@ a { <===> ================================================================================ <===> negative/with_x/negative_zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(-1, -0.0)} <===> negative/with_x/negative_zero/output.css @@ -32,7 +32,7 @@ a { <===> ================================================================================ <===> negative/with_x/negative_zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(-1, -0.000000000001)} <===> negative/with_x/negative_zero_fuzzy/output.css @@ -43,7 +43,7 @@ a { <===> ================================================================================ <===> negative/with_x/zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(-1, 0)} <===> negative/with_x/zero/output.css @@ -54,7 +54,7 @@ a { <===> ================================================================================ <===> negative/with_x/zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(-1, 0.000000000001)} <===> negative/with_x/zero_fuzzy/output.css @@ -65,7 +65,7 @@ a { <===> ================================================================================ <===> negative/with_x/finite/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(-1, 1)} <===> negative/with_x/finite/output.css @@ -76,7 +76,7 @@ a { <===> ================================================================================ <===> negative/with_x/infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(-1, math.div(1, 0))} <===> negative/with_x/infinity/output.css @@ -87,7 +87,7 @@ a { <===> ================================================================================ <===> positive/with_x/negative_infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(1, math.div(-1, 0))} <===> positive/with_x/negative_infinity/output.css @@ -98,7 +98,7 @@ a { <===> ================================================================================ <===> positive/with_x/negative_finite/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(1, -1)} <===> positive/with_x/negative_finite/output.css @@ -109,7 +109,7 @@ a { <===> ================================================================================ <===> positive/with_x/negative_zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(1, -0.0)} <===> positive/with_x/negative_zero/output.css @@ -120,7 +120,7 @@ a { <===> ================================================================================ <===> positive/with_x/negative_zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(1, -0.000000000001)} <===> positive/with_x/negative_zero_fuzzy/output.css @@ -131,7 +131,7 @@ a { <===> ================================================================================ <===> positive/with_x/zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(1, 0)} <===> positive/with_x/zero/output.css @@ -142,7 +142,7 @@ a { <===> ================================================================================ <===> positive/with_x/zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(1, 0.000000000001)} <===> positive/with_x/zero_fuzzy/output.css @@ -153,7 +153,7 @@ a { <===> ================================================================================ <===> positive/with_x/finite/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(1, 1)} <===> positive/with_x/finite/output.css @@ -164,7 +164,7 @@ a { <===> ================================================================================ <===> positive/with_x/infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(1, math.div(1, 0))} <===> positive/with_x/infinity/output.css diff --git a/spec/core_functions/math/atan2/y_zero.hrx b/spec/core_functions/math/atan2/y_zero.hrx index afe0dc9706..92f6a23c37 100644 --- a/spec/core_functions/math/atan2/y_zero.hrx +++ b/spec/core_functions/math/atan2/y_zero.hrx @@ -1,5 +1,5 @@ <===> negative/with_x/negative_infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(-0.0, math.div(-1, 0))} <===> negative/with_x/negative_infinity/output.css @@ -10,7 +10,7 @@ a { <===> ================================================================================ <===> negative/with_x/negative_finite/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(-0.0, -1)} <===> negative/with_x/negative_finite/output.css @@ -21,7 +21,7 @@ a { <===> ================================================================================ <===> negative/with_x/negative_zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(-0.0, -0.0)} <===> negative/with_x/negative_zero/output.css @@ -32,7 +32,7 @@ a { <===> ================================================================================ <===> negative/with_x/negative_zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(-0.0, -0.000000000001)} <===> negative/with_x/negative_zero_fuzzy/output.css @@ -43,7 +43,7 @@ a { <===> ================================================================================ <===> negative/with_x/zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(-0.0, 0)} <===> negative/with_x/zero/output.css @@ -54,7 +54,7 @@ a { <===> ================================================================================ <===> negative/with_x/zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(-0.0, 0.000000000001)} <===> negative/with_x/zero_fuzzy/output.css @@ -65,7 +65,7 @@ a { <===> ================================================================================ <===> negative/with_x/finite/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(-0.0, 1)} <===> negative/with_x/finite/output.css @@ -76,7 +76,7 @@ a { <===> ================================================================================ <===> negative/with_x/infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(-0.0, math.div(1, 0))} <===> negative/with_x/infinity/output.css @@ -87,7 +87,7 @@ a { <===> ================================================================================ <===> negative_fuzzy/with_x/negative_infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(-0.000000000001, math.div(-1, 0))} <===> negative_fuzzy/with_x/negative_infinity/output.css @@ -98,7 +98,7 @@ a { <===> ================================================================================ <===> negative_fuzzy/with_x/negative_finite/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(-0.000000000001, -1)} <===> negative_fuzzy/with_x/negative_finite/output.css @@ -109,7 +109,7 @@ a { <===> ================================================================================ <===> negative_fuzzy/with_x/negative_zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(-0.000000000001, -0.0)} <===> negative_fuzzy/with_x/negative_zero/output.css @@ -120,7 +120,7 @@ a { <===> ================================================================================ <===> negative_fuzzy/with_x/zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(-0.000000000001, 0)} <===> negative_fuzzy/with_x/zero/output.css @@ -131,7 +131,7 @@ a { <===> ================================================================================ <===> negative_fuzzy/with_x/finite/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(-0.000000000001, 1)} <===> negative_fuzzy/with_x/finite/output.css @@ -142,7 +142,7 @@ a { <===> ================================================================================ <===> negative_fuzzy/with_x/infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(-0.000000000001, math.div(1, 0))} <===> negative_fuzzy/with_x/infinity/output.css @@ -153,7 +153,7 @@ a { <===> ================================================================================ <===> positive/with_x/negative_infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(0, math.div(-1, 0))} <===> positive/with_x/negative_infinity/output.css @@ -164,7 +164,7 @@ a { <===> ================================================================================ <===> positive/with_x/negative_finite/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(0, -1)} <===> positive/with_x/negative_finite/output.css @@ -175,7 +175,7 @@ a { <===> ================================================================================ <===> positive/with_x/negative_zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(0, -0.0)} <===> positive/with_x/negative_zero/output.css @@ -186,7 +186,7 @@ a { <===> ================================================================================ <===> positive/with_x/negative_zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(0, -0.000000000001)} <===> positive/with_x/negative_zero_fuzzy/output.css @@ -197,7 +197,7 @@ a { <===> ================================================================================ <===> positive/with_x/zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(0, 0)} <===> positive/with_x/zero/output.css @@ -208,7 +208,7 @@ a { <===> ================================================================================ <===> positive/with_x/zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(0, 0.000000000001)} <===> positive/with_x/zero_fuzzy/output.css @@ -219,7 +219,7 @@ a { <===> ================================================================================ <===> positive/with_x/finite/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(0, 1)} <===> positive/with_x/finite/output.css @@ -230,7 +230,7 @@ a { <===> ================================================================================ <===> positive/with_x/infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(0, math.div(1, 0))} <===> positive/with_x/infinity/output.css @@ -241,7 +241,7 @@ a { <===> ================================================================================ <===> positive_fuzzy/with_x/negative_infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(0.000000000001, math.div(-1, 0))} <===> positive_fuzzy/with_x/negative_infinity/output.css @@ -252,7 +252,7 @@ a { <===> ================================================================================ <===> positive_fuzzy/with_x/negative_finite/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(0.000000000001, -1)} <===> positive_fuzzy/with_x/negative_finite/output.css @@ -263,7 +263,7 @@ a { <===> ================================================================================ <===> positive_fuzzy/with_x/negative_zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(0.000000000001, -0.0)} <===> positive_fuzzy/with_x/negative_zero/output.css @@ -274,7 +274,7 @@ a { <===> ================================================================================ <===> positive_fuzzy/with_x/zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(0.000000000001, 0)} <===> positive_fuzzy/with_x/zero/output.css @@ -285,7 +285,7 @@ a { <===> ================================================================================ <===> positive_fuzzy/with_x/finite/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(0.000000000001, 1)} <===> positive_fuzzy/with_x/finite/output.css @@ -296,7 +296,7 @@ a { <===> ================================================================================ <===> positive_fuzzy/with_x/infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.atan2(0.000000000001, math.div(1, 0))} <===> positive_fuzzy/with_x/infinity/output.css diff --git a/spec/core_functions/math/clamp.hrx b/spec/core_functions/math/clamp.hrx index 3af6ec3ea6..8b1cdc6254 100644 --- a/spec/core_functions/math/clamp.hrx +++ b/spec/core_functions/math/clamp.hrx @@ -6,7 +6,7 @@ <===> ================================================================================ <===> chooses_min/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.clamp(1, 0, 2)} <===> chooses_min/output.css @@ -17,7 +17,7 @@ a { <===> ================================================================================ <===> chooses_number/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.clamp(0, 1, 2)} <===> chooses_number/output.css @@ -28,7 +28,7 @@ a { <===> ================================================================================ <===> chooses_max/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.clamp(0, 2, 1)} <===> chooses_max/output.css @@ -39,7 +39,7 @@ a { <===> ================================================================================ <===> min_equals_max/input.scss -@use "sass:math" as math; +@use "sass:math"; a { b: math.clamp(1, 2, 1); } @@ -52,7 +52,7 @@ a { <===> ================================================================================ <===> min_greater_than_max/input.scss -@use "sass:math" as math; +@use "sass:math"; a { b: math.clamp(1, 2, 0); } @@ -65,7 +65,7 @@ a { <===> ================================================================================ <===> preserves_units/min/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.clamp(180deg, 0.5turn, 360deg)} <===> preserves_units/min/output.css @@ -76,7 +76,7 @@ a { <===> ================================================================================ <===> preserves_units/number/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.clamp(180deg, 0.75turn, 360deg)} <===> preserves_units/number/output.css @@ -87,7 +87,7 @@ a { <===> ================================================================================ <===> preserves_units/max/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.clamp(180deg, 1turn, 360deg)} <===> preserves_units/max/output.css @@ -98,7 +98,7 @@ a { <===> ================================================================================ <===> named_args/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.clamp($min: 0, $number: 1, $max: 2)} <===> named_args/output.css @@ -109,7 +109,7 @@ a { <===> ================================================================================ <===> error/type/min/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.clamp("0", 1, 2)} <===> error/type/min/error @@ -123,7 +123,7 @@ Error: $min: "0" is not a number. <===> ================================================================================ <===> error/type/number/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.clamp(1, "0", 2)} <===> error/type/number/error @@ -137,7 +137,7 @@ Error: $number: "0" is not a number. <===> ================================================================================ <===> error/type/max/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.clamp(1, 2, "0")} <===> error/type/max/error @@ -151,7 +151,7 @@ Error: $max: "0" is not a number. <===> ================================================================================ <===> error/incompatible_units/min_and_number/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.clamp(1deg, 1px, 1turn)} <===> error/incompatible_units/min_and_number/error @@ -165,7 +165,7 @@ Error: $number: 1px and $min: 1deg have incompatible units. <===> ================================================================================ <===> error/incompatible_units/min_and_max/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.clamp(1deg, 1turn, 1px)} <===> error/incompatible_units/min_and_max/error @@ -179,7 +179,7 @@ Error: $max: 1px and $min: 1deg have incompatible units. <===> ================================================================================ <===> error/incompatible_units/number_and_max/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.clamp(1turn, 1deg, 1px)} <===> error/incompatible_units/number_and_max/error @@ -193,7 +193,7 @@ Error: $max: 1px and $min: 1turn have incompatible units. <===> ================================================================================ <===> error/incompatible_units/all/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.clamp(1deg, 1px, 1s)} <===> error/incompatible_units/all/error @@ -207,7 +207,7 @@ Error: $number: 1px and $min: 1deg have incompatible units. <===> ================================================================================ <===> error/some_unitless/min/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.clamp(0, 1px, 2px)} <===> error/some_unitless/min/error @@ -221,7 +221,7 @@ Error: $number: 1px and $min: 0 have incompatible units (one has units and the o <===> ================================================================================ <===> error/some_unitless/number/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.clamp(0px, 1, 2px)} <===> error/some_unitless/number/error @@ -235,7 +235,7 @@ Error: $number: 1 and $min: 0px have incompatible units (one has units and the o <===> ================================================================================ <===> error/some_unitless/max/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.clamp(0px, 1px, 2)} <===> error/some_unitless/max/error @@ -249,7 +249,7 @@ Error: $max: 2 and $min: 0px have incompatible units (one has units and the othe <===> ================================================================================ <===> error/some_unitless/min_and_number/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.clamp(0, 1, 2px)} <===> error/some_unitless/min_and_number/error @@ -263,7 +263,7 @@ Error: $max: 2px and $min: 0 have incompatible units (one has units and the othe <===> ================================================================================ <===> error/some_unitless/min_and_max/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.clamp(0, 1px, 2)} <===> error/some_unitless/min_and_max/error @@ -277,7 +277,7 @@ Error: $number: 1px and $min: 0 have incompatible units (one has units and the o <===> ================================================================================ <===> error/some_unitless/number_and_max/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.clamp(0px, 1, 2)} <===> error/some_unitless/number_and_max/error @@ -291,7 +291,7 @@ Error: $number: 1 and $min: 0px have incompatible units (one has units and the o <===> ================================================================================ <===> error/zero_args/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.clamp()} <===> error/zero_args/error @@ -309,7 +309,7 @@ Error: Missing argument $min. <===> ================================================================================ <===> error/one_arg/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.clamp(0)} <===> error/one_arg/error @@ -327,7 +327,7 @@ Error: Missing argument $number. <===> ================================================================================ <===> error/two_args/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.clamp(0, 0)} <===> error/two_args/error @@ -345,7 +345,7 @@ Error: Missing argument $max. <===> ================================================================================ <===> error/too_many_args/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.clamp(0, 0, 0, 0)} <===> error/too_many_args/error diff --git a/spec/core_functions/math/cos.hrx b/spec/core_functions/math/cos.hrx index ed01923e45..2438a7582c 100644 --- a/spec/core_functions/math/cos.hrx +++ b/spec/core_functions/math/cos.hrx @@ -6,29 +6,29 @@ <===> ================================================================================ <===> negative_infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.cos(math.div(-1, 0))} <===> negative_infinity/output.css a { - b: NaN; + b: calc(NaN); } <===> ================================================================================ <===> infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.cos(math.div(1, 0))} <===> infinity/output.css a { - b: NaN; + b: calc(NaN); } <===> ================================================================================ <===> deg/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.cos(1deg)} <===> deg/output.css @@ -39,7 +39,7 @@ a { <===> ================================================================================ <===> grad/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.cos(1grad)} <===> grad/output.css @@ -50,7 +50,7 @@ a { <===> ================================================================================ <===> rad/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.cos(1rad)} <===> rad/output.css @@ -61,7 +61,7 @@ a { <===> ================================================================================ <===> turn/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.cos(1turn)} <===> turn/output.css @@ -72,7 +72,7 @@ a { <===> ================================================================================ <===> unitless/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.cos(1)} <===> unitless/output.css @@ -83,7 +83,7 @@ a { <===> ================================================================================ <===> named_arg/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.cos($number: 1)} <===> named_arg/output.css @@ -94,7 +94,7 @@ a { <===> ================================================================================ <===> error/type/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.cos("0")} <===> error/type/error @@ -108,7 +108,7 @@ Error: $number: "0" is not a number. <===> ================================================================================ <===> error/unit/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.cos(1px)} <===> error/unit/error @@ -122,7 +122,7 @@ Error: $number: Expected 1px to have an angle unit (deg, grad, rad, turn). <===> ================================================================================ <===> error/zero_args/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.cos()} <===> error/zero_args/error @@ -140,7 +140,7 @@ Error: Missing argument $number. <===> ================================================================================ <===> error/too_many_args/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.cos(0, 0)} <===> error/too_many_args/error diff --git a/spec/core_functions/math/hypot.hrx b/spec/core_functions/math/hypot.hrx index a08d3bc97d..293d388c16 100644 --- a/spec/core_functions/math/hypot.hrx +++ b/spec/core_functions/math/hypot.hrx @@ -6,7 +6,7 @@ <===> ================================================================================ <===> unitless/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.hypot(3, 4, 5, 6, 7)} <===> unitless/output.css @@ -17,7 +17,7 @@ a { <===> ================================================================================ <===> compatible_units/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.hypot(3cm, 4mm * 10, 5q * 40, math.div(6in, 2.54), 7px * math.div(96, 2.54))} <===> compatible_units/output.css @@ -28,40 +28,40 @@ a { <===> ================================================================================ <===> infinity/first/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.hypot(math.div(1, 0), 1, 1)} <===> infinity/first/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> infinity/second/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.hypot(1, math.div(1, 0), 1)} <===> infinity/second/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> infinity/third/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.hypot(1, 1, math.div(1, 0))} <===> infinity/third/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> error/type/first/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.hypot("0", 1px, 1px)} <===> error/type/first/error @@ -75,7 +75,7 @@ Error: "0" is not a number. <===> ================================================================================ <===> error/type/second/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.hypot(1px, "0", 1px)} <===> error/type/second/error @@ -89,7 +89,7 @@ Error: "0" is not a number. <===> ================================================================================ <===> error/type/third/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.hypot(1px, 1px, "0")} <===> error/type/third/error @@ -103,7 +103,7 @@ Error: "0" is not a number. <===> ================================================================================ <===> error/incompatible_units/first_and_second/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.hypot(1deg, 1px, 1turn)} <===> error/incompatible_units/first_and_second/error @@ -117,7 +117,7 @@ Error: $numbers[2]: 1px and $numbers[1]: 1deg have incompatible units. <===> ================================================================================ <===> error/incompatible_units/first_and_third/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.hypot(1deg, 1turn, 1px)} <===> error/incompatible_units/first_and_third/error @@ -131,7 +131,7 @@ Error: $numbers[3]: 1px and $numbers[1]: 1deg have incompatible units. <===> ================================================================================ <===> error/incompatible_units/second_and_third/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.hypot(1turn, 1deg, 1px)} <===> error/incompatible_units/second_and_third/error @@ -145,7 +145,7 @@ Error: $numbers[3]: 1px and $numbers[1]: 1turn have incompatible units. <===> ================================================================================ <===> error/incompatible_units/all/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.hypot(1turn, 1px, 1s)} <===> error/incompatible_units/all/error @@ -159,7 +159,7 @@ Error: $numbers[2]: 1px and $numbers[1]: 1turn have incompatible units. <===> ================================================================================ <===> error/some_unitless/first/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.hypot(0, 1px, 2px)} <===> error/some_unitless/first/error @@ -173,7 +173,7 @@ Error: $numbers[2]: 1px and $numbers[1]: 0 have incompatible units (one has unit <===> ================================================================================ <===> error/some_unitless/second/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.hypot(0px, 1, 2px)} <===> error/some_unitless/second/error @@ -187,7 +187,7 @@ Error: $numbers[2]: 1 and $numbers[1]: 0px have incompatible units (one has unit <===> ================================================================================ <===> error/some_unitless/third/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.hypot(0px, 1px, 2)} <===> error/some_unitless/third/error @@ -201,7 +201,7 @@ Error: $numbers[3]: 2 and $numbers[1]: 0px have incompatible units (one has unit <===> ================================================================================ <===> error/some_unitless/first_and_second/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.hypot(0, 1, 2px)} <===> error/some_unitless/first_and_second/error @@ -215,7 +215,7 @@ Error: $numbers[3]: 2px and $numbers[1]: 0 have incompatible units (one has unit <===> ================================================================================ <===> error/some_unitless/first_and_third/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.hypot(0, 1px, 2)} <===> error/some_unitless/first_and_third/error @@ -229,7 +229,7 @@ Error: $numbers[2]: 1px and $numbers[1]: 0 have incompatible units (one has unit <===> ================================================================================ <===> error/some_unitless/second_and_third/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.hypot(0px, 1, 2)} <===> error/some_unitless/second_and_third/error @@ -243,7 +243,7 @@ Error: $numbers[2]: 1 and $numbers[1]: 0px have incompatible units (one has unit <===> ================================================================================ <===> error/zero_args/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.hypot()} <===> error/zero_args/error diff --git a/spec/core_functions/math/log.hrx b/spec/core_functions/math/log.hrx index 57b3354495..716414ac83 100644 --- a/spec/core_functions/math/log.hrx +++ b/spec/core_functions/math/log.hrx @@ -6,29 +6,29 @@ <===> ================================================================================ <===> negative/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.log(-1)} <===> negative/output.css a { - b: NaN; + b: calc(NaN); } <===> ================================================================================ <===> zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.log(0)} <===> zero/output.css a { - b: -Infinity; + b: calc(-infinity); } <===> ================================================================================ <===> zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.log(0.000000000001)} <===> zero_fuzzy/output.css @@ -39,7 +39,7 @@ a { <===> ================================================================================ <===> positive/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.log(2)} <===> positive/output.css @@ -50,18 +50,18 @@ a { <===> ================================================================================ <===> infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.log(math.div(1, 0))} <===> infinity/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> base/null/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.log(2, null)} <===> base/null/output.css @@ -72,18 +72,18 @@ a { <===> ================================================================================ <===> base/negative/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.log(2, -1)} <===> base/negative/output.css a { - b: NaN; + b: calc(NaN); } <===> ================================================================================ <===> base/zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.log(2, 0)} <===> base/zero/output.css @@ -94,7 +94,7 @@ a { <===> ================================================================================ <===> base/zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.log(2, 0.000000000001)} <===> base/zero_fuzzy/output.css @@ -105,7 +105,7 @@ a { <===> ================================================================================ <===> base/between_zero_and_one/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.log(2, 0.5)} <===> base/between_zero_and_one/output.css @@ -116,18 +116,18 @@ a { <===> ================================================================================ <===> base/one/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.log(2, 1)} <===> base/one/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> base/one_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.log(2, 1.000000000001)} <===> base/one_fuzzy/output.css @@ -138,7 +138,7 @@ a { <===> ================================================================================ <===> base/positive/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.log(2, 10)} <===> base/positive/output.css @@ -149,7 +149,7 @@ a { <===> ================================================================================ <===> named_arg/number/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.log($number: 2)} <===> named_arg/number/output.css @@ -160,7 +160,7 @@ a { <===> ================================================================================ <===> named_args/number_with_base/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.log($number: 2, $base: 10)} <===> named_args/number_with_base/output.css @@ -171,7 +171,7 @@ a { <===> ================================================================================ <===> error/type/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.log("0")} <===> error/type/error @@ -185,7 +185,7 @@ Error: $number: "0" is not a number. <===> ================================================================================ <===> error/number_has_units/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.log(1px)} <===> error/number_has_units/error @@ -199,7 +199,7 @@ Error: $number: Expected 1px to have no units. <===> ================================================================================ <===> error/base_has_units/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.log(1, 1px)} <===> error/base_has_units/error @@ -213,7 +213,7 @@ Error: $base: Expected 1px to have no units. <===> ================================================================================ <===> error/zero_args/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.log()} <===> error/zero_args/error @@ -231,7 +231,7 @@ Error: Missing argument $number. <===> ================================================================================ <===> error/too_many_args/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.log(0, 0, 0)} <===> error/too_many_args/error diff --git a/spec/core_functions/math/pow/arguments.hrx b/spec/core_functions/math/pow/arguments.hrx index 6183e185c5..39e542f503 100644 --- a/spec/core_functions/math/pow/arguments.hrx +++ b/spec/core_functions/math/pow/arguments.hrx @@ -1,5 +1,5 @@ <===> named_args/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow($base: 2, $exponent: 3)} <===> named_args/output.css @@ -10,7 +10,7 @@ a { <===> ================================================================================ <===> error/base_type/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow("0", 0)} <===> error/base_type/error @@ -24,7 +24,7 @@ Error: $base: "0" is not a number. <===> ================================================================================ <===> error/exponent_type/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0, "0")} <===> error/exponent_type/error @@ -38,7 +38,7 @@ Error: $exponent: "0" is not a number. <===> ================================================================================ <===> error/base_has_units/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(1px, 0)} <===> error/base_has_units/error @@ -52,7 +52,7 @@ Error: $base: Expected 1px to have no units. <===> ================================================================================ <===> error/exponent_has_units/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0, 1px)} <===> error/exponent_has_units/error @@ -66,7 +66,7 @@ Error: $exponent: Expected 1px to have no units. <===> ================================================================================ <===> error/zero_args/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow()} <===> error/zero_args/error @@ -85,7 +85,7 @@ Error: Missing argument $base. <===> ================================================================================ <===> error/one_arg/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0)} <===> error/one_arg/error @@ -103,7 +103,7 @@ Error: Missing argument $exponent. <===> ================================================================================ <===> error/too_many_args/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0, 0, 0)} <===> error/too_many_args/error diff --git a/spec/core_functions/math/pow/base_greater_than_zero.hrx b/spec/core_functions/math/pow/base_greater_than_zero.hrx index 9bd54c5b88..16ecb145a4 100644 --- a/spec/core_functions/math/pow/base_greater_than_zero.hrx +++ b/spec/core_functions/math/pow/base_greater_than_zero.hrx @@ -1,16 +1,16 @@ <===> base/less_than_one/with_exponent/negative_infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0.5, math.div(-1, 0))} <===> base/less_than_one/with_exponent/negative_infinity/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> base/less_than_one/with_exponent/infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-0.5, math.div(1, 0))} <===> base/less_than_one/with_exponent/infinity/output.css @@ -21,7 +21,7 @@ a { <===> ================================================================================ <===> base/one/with_exponent/negative_infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(1, math.div(-1, 0))} <===> base/one/with_exponent/negative_infinity/output.css @@ -32,7 +32,7 @@ a { <===> ================================================================================ <===> base/one/with_exponent/infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(1, math.div(1, 0))} <===> base/one/with_exponent/infinity/output.css @@ -43,7 +43,7 @@ a { <===> ================================================================================ <===> base/one_fuzzy/with_exponent/negative_infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(1.000000000001, math.div(-1, 0))} <===> base/one_fuzzy/with_exponent/negative_infinity/output.css @@ -54,18 +54,18 @@ a { <===> ================================================================================ <===> base/one_fuzzy/with_exponent/infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(1.000000000001, math.div(1, 0))} <===> base/one_fuzzy/with_exponent/infinity/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> base/greater_than_one/with_exponent/negative_infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(2, math.div(-1, 0))} <===> base/greater_than_one/with_exponent/negative_infinity/output.css @@ -76,7 +76,7 @@ a { <===> ================================================================================ <===> base/greater_than_one/with_exponent/zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(2, 0)} <===> base/greater_than_one/with_exponent/zero/output.css @@ -87,7 +87,7 @@ a { <===> ================================================================================ <===> base/greater_than_one/with_exponent/zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(2, 0.000000000001)} <===> base/greater_than_one/with_exponent/zero_fuzzy/output.css @@ -98,7 +98,7 @@ a { <===> ================================================================================ <===> base/greater_than_one/with_exponent/integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(2, 3)} <===> base/greater_than_one/with_exponent/integer/output.css @@ -109,7 +109,7 @@ a { <===> ================================================================================ <===> base/greater_than_one/with_exponent/integer_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(2, 3.000000000001)} <===> base/greater_than_one/with_exponent/integer_fuzzy/output.css @@ -120,7 +120,7 @@ a { <===> ================================================================================ <===> base/greater_than_one/with_exponent/decimal/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(2, 0.5)} <===> base/greater_than_one/with_exponent/decimal/output.css @@ -131,11 +131,10 @@ a { <===> ================================================================================ <===> base/greater_than_one/with_exponent/infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(2, math.div(1, 0))} <===> base/greater_than_one/with_exponent/infinity/output.css a { - b: Infinity; + b: calc(infinity); } - diff --git a/spec/core_functions/math/pow/base_less_than_zero.hrx b/spec/core_functions/math/pow/base_less_than_zero.hrx index 10d7a4ca96..641cdacfc9 100644 --- a/spec/core_functions/math/pow/base_less_than_zero.hrx +++ b/spec/core_functions/math/pow/base_less_than_zero.hrx @@ -1,16 +1,16 @@ <===> base/greater_than_negative_one/with_exponent/negative_infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-0.5, math.div(-1, 0))} <===> base/greater_than_negative_one/with_exponent/negative_infinity/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> base/greater_than_negative_one/with_exponent/infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-0.5, math.div(1, 0))} <===> base/greater_than_negative_one/with_exponent/infinity/output.css @@ -21,7 +21,7 @@ a { <===> ================================================================================ <===> base/negative_one/with_exponent/negative_infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-1, math.div(-1, 0))} <===> base/negative_one/with_exponent/negative_infinity/output.css @@ -32,7 +32,7 @@ a { <===> ================================================================================ <===> base/negative_one/with_exponent/infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-1, math.div(1, 0))} <===> base/negative_one/with_exponent/infinity/output.css @@ -43,7 +43,7 @@ a { <===> ================================================================================ <===> base/negative_one_fuzzy/with_exponent/negative_infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-1.000000000001, math.div(-1, 0))} <===> base/negative_one_fuzzy/with_exponent/negative_infinity/output.css @@ -54,18 +54,18 @@ a { <===> ================================================================================ <===> base/negative_one_fuzzy/with_exponent/infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-1.000000000001, math.div(1, 0))} <===> base/negative_one_fuzzy/with_exponent/infinity/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> base/less_than_negative_one/with_exponent/negative_infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-2, math.div(-1, 0))} <===> base/less_than_negative_one/with_exponent/negative_infinity/output.css @@ -76,7 +76,7 @@ a { <===> ================================================================================ <===> base/less_than_negative_one/with_exponent/zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-2, 0)} <===> base/less_than_negative_one/with_exponent/zero/output.css @@ -87,18 +87,18 @@ a { <===> ================================================================================ <===> base/less_than_negative_one/with_exponent/zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-2, 0.000000000001)} <===> base/less_than_negative_one/with_exponent/zero_fuzzy/output.css a { - b: NaN; + b: calc(NaN); } <===> ================================================================================ <===> base/less_than_negative_one/with_exponent/integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-2, 2)} <===> base/less_than_negative_one/with_exponent/integer/output.css @@ -109,32 +109,32 @@ a { <===> ================================================================================ <===> base/less_than_negative_one/with_exponent/integer_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-2, 2.000000000001)} <===> base/less_than_negative_one/with_exponent/integer_fuzzy/output.css a { - b: NaN; + b: calc(NaN); } <===> ================================================================================ <===> base/less_than_negative_one/with_exponent/decimal/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-2, 0.5)} <===> base/less_than_negative_one/with_exponent/decimal/output.css a { - b: NaN; + b: calc(NaN); } <===> ================================================================================ <===> base/less_than_negative_one/with_exponent/infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-2, math.div(1, 0))} <===> base/less_than_negative_one/with_exponent/infinity/output.css a { - b: Infinity; + b: calc(infinity); } diff --git a/spec/core_functions/math/pow/base_negative_infinity.hrx b/spec/core_functions/math/pow/base_negative_infinity.hrx index 110adc84db..e1b21ca93f 100644 --- a/spec/core_functions/math/pow/base_negative_infinity.hrx +++ b/spec/core_functions/math/pow/base_negative_infinity.hrx @@ -1,5 +1,5 @@ <===> with_exponent/negative_infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(-1, 0), math.div(-1, 0))} <===> with_exponent/negative_infinity/output.css @@ -10,7 +10,7 @@ a { <===> ================================================================================ <===> with_exponent/negative_even_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(-1, 0), -2)} <===> with_exponent/negative_even_integer/output.css @@ -21,7 +21,7 @@ a { <===> ================================================================================ <===> with_exponent/negative_even_integer_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(-1, 0), -2.000000000001)} <===> with_exponent/negative_even_integer_fuzzy/output.css @@ -32,7 +32,7 @@ a { <===> ================================================================================ <===> with_exponent/negative_odd_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(-1, 0), -3)} <===> with_exponent/negative_odd_integer/output.css @@ -43,7 +43,7 @@ a { <===> ================================================================================ <===> with_exponent/negative_odd_integer_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(-1, 0), -3.000000000001)} <===> with_exponent/negative_odd_integer_fuzzy/output.css @@ -54,7 +54,7 @@ a { <===> ================================================================================ <===> with_exponent/negative_decimal/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(-1, 0), -2.5)} <===> with_exponent/negative_decimal/output.css @@ -65,7 +65,7 @@ a { <===> ================================================================================ <===> with_exponent/zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(-1, 0), 0)} <===> with_exponent/zero/output.css @@ -76,76 +76,76 @@ a { <===> ================================================================================ <===> with_exponent/zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(-1, 0), 0.000000000001)} <===> with_exponent/zero_fuzzy/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> with_exponent/even_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(-1, 0), 2)} <===> with_exponent/even_integer/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> with_exponent/even_integer_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(-1, 0), 2.000000000001)} <===> with_exponent/even_integer_fuzzy/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> with_exponent/odd_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(-1, 0), 3)} <===> with_exponent/odd_integer/output.css a { - b: -Infinity; + b: calc(-infinity); } <===> ================================================================================ <===> with_exponent/odd_integer_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(-1, 0), 3.000000000001)} <===> with_exponent/odd_integer_fuzzy/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> with_exponent/decimal/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(-1, 0), 2.5)} <===> with_exponent/decimal/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> with_exponent/infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(-1, 0), math.div(1, 0))} <===> with_exponent/infinity/output.css a { - b: Infinity; + b: calc(infinity); } diff --git a/spec/core_functions/math/pow/base_negative_zero.hrx b/spec/core_functions/math/pow/base_negative_zero.hrx index 2c9d8a7166..b32a5f849d 100644 --- a/spec/core_functions/math/pow/base_negative_zero.hrx +++ b/spec/core_functions/math/pow/base_negative_zero.hrx @@ -1,71 +1,71 @@ <===> with_exponent/negative_infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-0.0, math.div(-1, 0))} <===> with_exponent/negative_infinity/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> with_exponent/negative_even_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-0.0, -2)} <===> with_exponent/negative_even_integer/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> with_exponent/negative_even_integer_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-0.0, -2.000000000001)} <===> with_exponent/negative_even_integer_fuzzy/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> with_exponent/negative_odd_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-0.0, -3)} <===> with_exponent/negative_odd_integer/output.css a { - b: -Infinity; + b: calc(-infinity); } <===> ================================================================================ <===> with_exponent/negative_odd_integer_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-0.0, -3.000000000001)} <===> with_exponent/negative_odd_integer_fuzzy/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> with_exponent/negative_decimal/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-0.0, -0.5)} <===> with_exponent/negative_decimal/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> with_exponent/zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-0.0, 0)} <===> with_exponent/zero/output.css @@ -76,7 +76,7 @@ a { <===> ================================================================================ <===> with_exponent/zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-0.0, 0.000000000001)} <===> with_exponent/zero_fuzzy/output.css @@ -87,7 +87,7 @@ a { <===> ================================================================================ <===> with_exponent/even_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-0.0, 2)} <===> with_exponent/even_integer/output.css @@ -98,7 +98,7 @@ a { <===> ================================================================================ <===> with_exponent/even_integer_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-0.0, 2.000000000001)} <===> with_exponent/even_integer_fuzzy/output.css @@ -109,7 +109,7 @@ a { <===> ================================================================================ <===> with_exponent/odd_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-0.0, 3)} <===> with_exponent/odd_integer/output.css @@ -120,7 +120,7 @@ a { <===> ================================================================================ <===> with_exponent/odd_integer_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-0.0, 3.000000000001)} <===> with_exponent/odd_integer_fuzzy/output.css @@ -131,7 +131,7 @@ a { <===> ================================================================================ <===> with_exponent/decimal/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-0.0, 0.5)} <===> with_exponent/decimal/output.css @@ -142,7 +142,7 @@ a { <===> ================================================================================ <===> with_exponent/infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-0.0, math.div(1, 0))} <===> with_exponent/infinity/output.css @@ -153,18 +153,18 @@ a { <===> ================================================================================ <===> fuzzy/with_exponent/negative_infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-0.000000000001, math.div(-1, 0))} <===> fuzzy/with_exponent/negative_infinity/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> fuzzy/with_exponent/negative_even_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-0.000000000001, -2)} <===> fuzzy/with_exponent/negative_even_integer/output.css @@ -175,7 +175,7 @@ a { <===> ================================================================================ <===> fuzzy/with_exponent/negative_odd_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-0.000000000001, -3)} <===> fuzzy/with_exponent/negative_odd_integer/output.css @@ -186,18 +186,18 @@ a { <===> ================================================================================ <===> fuzzy/with_exponent/negative_decimal/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-0.000000000001, -0.5)} <===> fuzzy/with_exponent/negative_decimal/output.css a { - b: NaN; + b: calc(NaN); } <===> ================================================================================ <===> fuzzy/with_exponent/zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-0.000000000001, 0)} <===> fuzzy/with_exponent/zero/output.css @@ -208,7 +208,7 @@ a { <===> ================================================================================ <===> fuzzy/with_exponent/even_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-0.000000000001, 2)} <===> fuzzy/with_exponent/even_integer/output.css @@ -219,7 +219,7 @@ a { <===> ================================================================================ <===> fuzzy/with_exponent/odd_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-0.000000000001, 3)} <===> fuzzy/with_exponent/odd_integer/output.css @@ -230,18 +230,18 @@ a { <===> ================================================================================ <===> fuzzy/with_exponent/decimal/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-0.000000000001, 0.5)} <===> fuzzy/with_exponent/decimal/output.css a { - b: NaN; + b: calc(NaN); } <===> ================================================================================ <===> fuzzy/with_exponent/infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(-0.000000000001, math.div(1, 0))} <===> fuzzy/with_exponent/infinity/output.css diff --git a/spec/core_functions/math/pow/base_positive_infinity.hrx b/spec/core_functions/math/pow/base_positive_infinity.hrx index 09a5dfdf8f..8974a33a5d 100644 --- a/spec/core_functions/math/pow/base_positive_infinity.hrx +++ b/spec/core_functions/math/pow/base_positive_infinity.hrx @@ -1,5 +1,5 @@ <===> with_exponent/negative_infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(1, 0), math.div(-1, 0))} <===> with_exponent/negative_infinity/output.css @@ -10,7 +10,7 @@ a { <===> ================================================================================ <===> with_exponent/negative_even_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(1, 0), -2)} <===> with_exponent/negative_even_integer/output.css @@ -21,7 +21,7 @@ a { <===> ================================================================================ <===> with_exponent/negative_even_integer_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(1, 0), -2.000000000001)} <===> with_exponent/negative_even_integer_fuzzy/output.css @@ -32,7 +32,7 @@ a { <===> ================================================================================ <===> with_exponent/negative_odd_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(1, 0), -3)} <===> with_exponent/negative_odd_integer/output.css @@ -43,7 +43,7 @@ a { <===> ================================================================================ <===> with_exponent/negative_odd_integer_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(1, 0), -3.000000000001)} <===> with_exponent/negative_odd_integer_fuzzy/output.css @@ -54,7 +54,7 @@ a { <===> ================================================================================ <===> with_exponent/negative_decimal/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(1, 0), -0.5)} <===> with_exponent/negative_decimal/output.css @@ -65,7 +65,7 @@ a { <===> ================================================================================ <===> with_exponent/zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(1, 0), 0)} <===> with_exponent/zero/output.css @@ -76,76 +76,76 @@ a { <===> ================================================================================ <===> with_exponent/zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(1, 0), 0.000000000001)} <===> with_exponent/zero_fuzzy/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> with_exponent/even_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(1, 0), 2)} <===> with_exponent/even_integer/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> with_exponent/even_integer_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(1, 0), 2.000000000001)} <===> with_exponent/even_integer_fuzzy/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> with_exponent/odd_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(1, 0), 3)} <===> with_exponent/odd_integer/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> with_exponent/odd_integer_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(1, 0), 3.000000000001)} <===> with_exponent/odd_integer_fuzzy/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> with_exponent/decimal/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(1, 0), 0.5)} <===> with_exponent/decimal/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> with_exponent/infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(math.div(1, 0), math.div(1, 0))} <===> with_exponent/infinity/output.css a { - b: Infinity; + b: calc(infinity); } diff --git a/spec/core_functions/math/pow/base_positive_zero.hrx b/spec/core_functions/math/pow/base_positive_zero.hrx index 08210519d3..3fce209a98 100644 --- a/spec/core_functions/math/pow/base_positive_zero.hrx +++ b/spec/core_functions/math/pow/base_positive_zero.hrx @@ -1,71 +1,71 @@ <===> with_exponent/negative_infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0, math.div(-1, 0))} <===> with_exponent/negative_infinity/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> with_exponent/negative_even_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0, -2)} <===> with_exponent/negative_even_integer/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> with_exponent/negative_even_integer_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0, -2.000000000001)} <===> with_exponent/negative_even_integer_fuzzy/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> with_exponent/negative_odd_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0, -3)} <===> with_exponent/negative_odd_integer/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> with_exponent/negative_odd_integer_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0, -3.000000000001)} <===> with_exponent/negative_odd_integer_fuzzy/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> with_exponent/negative_decimal/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0, -0.5)} <===> with_exponent/negative_decimal/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> with_exponent/zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0, 0)} <===> with_exponent/zero/output.css @@ -76,7 +76,7 @@ a { <===> ================================================================================ <===> with_exponent/zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0, 0.000000000001)} <===> with_exponent/zero_fuzzy/output.css @@ -87,7 +87,7 @@ a { <===> ================================================================================ <===> with_exponent/even_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0, 2)} <===> with_exponent/even_integer/output.css @@ -98,7 +98,7 @@ a { <===> ================================================================================ <===> with_exponent/even_integer_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0, 2.000000000001)} <===> with_exponent/even_integer_fuzzy/output.css @@ -109,7 +109,7 @@ a { <===> ================================================================================ <===> with_exponent/odd_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0, 3)} <===> with_exponent/odd_integer/output.css @@ -120,7 +120,7 @@ a { <===> ================================================================================ <===> with_exponent/odd_integer_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0, 3.000000000001)} <===> with_exponent/odd_integer_fuzzy/output.css @@ -131,7 +131,7 @@ a { <===> ================================================================================ <===> with_exponent/decimal/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0, 0.5)} <===> with_exponent/decimal/output.css @@ -142,7 +142,7 @@ a { <===> ================================================================================ <===> with_exponent/infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0, math.div(1, 0))} <===> with_exponent/infinity/output.css @@ -153,18 +153,18 @@ a { <===> ================================================================================ <===> fuzzy/with_exponent/negative_infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0.000000000001, math.div(-1, 0))} <===> fuzzy/with_exponent/negative_infinity/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> fuzzy/with_exponent/negative_even_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0.000000000001, -2)} <===> fuzzy/with_exponent/negative_even_integer/output.css @@ -175,7 +175,7 @@ a { <===> ================================================================================ <===> fuzzy/with_exponent/negative_odd_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0.000000000001, -3)} <===> fuzzy/with_exponent/negative_odd_integer/output.css @@ -186,7 +186,7 @@ a { <===> ================================================================================ <===> fuzzy/with_exponent/negative_decimal/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0.000000000001, -0.5)} <===> fuzzy/with_exponent/negative_decimal/output.css @@ -197,7 +197,7 @@ a { <===> ================================================================================ <===> fuzzy/with_exponent/zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0.000000000001, 0)} <===> fuzzy/with_exponent/zero/output.css @@ -208,7 +208,7 @@ a { <===> ================================================================================ <===> fuzzy/with_exponent/even_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0.000000000001, 2)} <===> fuzzy/with_exponent/even_integer/output.css @@ -219,7 +219,7 @@ a { <===> ================================================================================ <===> fuzzy/with_exponent/odd_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0.000000000001, 3)} <===> fuzzy/with_exponent/odd_integer/output.css @@ -230,7 +230,7 @@ a { <===> ================================================================================ <===> fuzzy/with_exponent/decimal/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0.000000000001, 0.5)} <===> fuzzy/with_exponent/decimal/output.css @@ -241,7 +241,7 @@ a { <===> ================================================================================ <===> fuzzy/with_exponent/infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.pow(0.000000000001, math.div(1, 0))} <===> fuzzy/with_exponent/infinity/output.css diff --git a/spec/core_functions/math/sin.hrx b/spec/core_functions/math/sin.hrx index ee0c83695a..edbac03391 100644 --- a/spec/core_functions/math/sin.hrx +++ b/spec/core_functions/math/sin.hrx @@ -6,29 +6,29 @@ <===> ================================================================================ <===> negative_infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sin(math.div(-1, 0))} <===> negative_infinity/output.css a { - b: NaN; + b: calc(NaN); } <===> ================================================================================ <===> infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sin(math.div(1, 0))} <===> infinity/output.css a { - b: NaN; + b: calc(NaN); } <===> ================================================================================ <===> negative_zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sin(-0.0)} <===> negative_zero/output.css @@ -39,7 +39,7 @@ a { <===> ================================================================================ <===> negative_zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sin(-0.000000000001)} <===> negative_zero_fuzzy/output.css @@ -50,7 +50,7 @@ a { <===> ================================================================================ <===> zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sin(0)} <===> zero/output.css @@ -61,7 +61,7 @@ a { <===> ================================================================================ <===> zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sin(0.000000000001)} <===> zero_fuzzy/output.css @@ -72,7 +72,7 @@ a { <===> ================================================================================ <===> deg/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sin(1deg)} <===> deg/output.css @@ -83,7 +83,7 @@ a { <===> ================================================================================ <===> grad/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sin(1grad)} <===> grad/output.css @@ -94,7 +94,7 @@ a { <===> ================================================================================ <===> rad/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sin(1rad)} <===> rad/output.css @@ -105,7 +105,7 @@ a { <===> ================================================================================ <===> turn/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sin(1turn)} <===> turn/output.css @@ -116,7 +116,7 @@ a { <===> ================================================================================ <===> unitless/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sin(1)} <===> unitless/output.css @@ -127,7 +127,7 @@ a { <===> ================================================================================ <===> named_arg/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sin($number: 1)} <===> named_arg/output.css @@ -138,7 +138,7 @@ a { <===> ================================================================================ <===> error/type/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sin("0")} <===> error/type/error @@ -152,7 +152,7 @@ Error: $number: "0" is not a number. <===> ================================================================================ <===> error/unit/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sin(1px)} <===> error/unit/error @@ -166,7 +166,7 @@ Error: $number: Expected 1px to have an angle unit (deg, grad, rad, turn). <===> ================================================================================ <===> error/zero_args/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sin()} <===> error/zero_args/error @@ -184,7 +184,7 @@ Error: Missing argument $number. <===> ================================================================================ <===> error/too_many_args/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sin(0, 0)} <===> error/too_many_args/error diff --git a/spec/core_functions/math/sqrt.hrx b/spec/core_functions/math/sqrt.hrx index 4fdd6efe49..f6574c62c2 100644 --- a/spec/core_functions/math/sqrt.hrx +++ b/spec/core_functions/math/sqrt.hrx @@ -6,18 +6,18 @@ <===> ================================================================================ <===> negative/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sqrt(-1)} <===> negative/output.css a { - b: NaN; + b: calc(NaN); } <===> ================================================================================ <===> negative_zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sqrt(-0.0)} <===> negative_zero/output.css @@ -28,18 +28,18 @@ a { <===> ================================================================================ <===> negative_zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sqrt(-0.000000000001)} <===> negative_zero_fuzzy/output.css a { - b: NaN; + b: calc(NaN); } <===> ================================================================================ <===> zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sqrt(0)} <===> zero/output.css @@ -50,7 +50,7 @@ a { <===> ================================================================================ <===> zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sqrt(0.000000000001)} <===> zero_fuzzy/output.css @@ -61,7 +61,7 @@ a { <===> ================================================================================ <===> positive/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sqrt(2)} <===> positive/output.css @@ -72,18 +72,18 @@ a { <===> ================================================================================ <===> infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sqrt(math.div(1, 0))} <===> infinity/output.css a { - b: Infinity; + b: calc(infinity); } <===> ================================================================================ <===> named_arg/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sqrt($number: 2)} <===> named_arg/output.css @@ -94,7 +94,7 @@ a { <===> ================================================================================ <===> error/type/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sqrt("0")} <===> error/type/error @@ -108,7 +108,7 @@ Error: $number: "0" is not a number. <===> ================================================================================ <===> error/units/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sqrt(1px)} <===> error/units/error @@ -122,7 +122,7 @@ Error: $number: Expected 1px to have no units. <===> ================================================================================ <===> error/zero_args/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sqrt()} <===> error/zero_args/error @@ -140,7 +140,7 @@ Error: Missing argument $number. <===> ================================================================================ <===> error/too_many_args/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.sqrt(0, 0)} <===> error/too_many_args/error diff --git a/spec/core_functions/math/tan.hrx b/spec/core_functions/math/tan.hrx index ad5cc65174..294e134ba0 100644 --- a/spec/core_functions/math/tan.hrx +++ b/spec/core_functions/math/tan.hrx @@ -6,29 +6,29 @@ <===> ================================================================================ <===> negative_infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.tan(math.div(-1, 0))} <===> negative_infinity/output.css a { - b: NaN; + b: calc(NaN); } <===> ================================================================================ <===> infinity/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.tan(math.div(1, 0))} <===> infinity/output.css a { - b: NaN; + b: calc(NaN); } <===> ================================================================================ <===> negative_asymptote/radian/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.tan(-0.5rad * math.$pi)} <===> negative_asymptote/radian/output.css @@ -39,7 +39,7 @@ a { <===> ================================================================================ <===> asymptote/radian/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.tan(0.5rad * math.$pi)} <===> asymptote/radian/output.css @@ -50,7 +50,7 @@ a { <===> ================================================================================ <===> negative_zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.tan(-0.0)} <===> negative_zero/output.css @@ -61,7 +61,7 @@ a { <===> ================================================================================ <===> negative_zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.tan(-0.000000000001)} <===> negative_zero_fuzzy/output.css @@ -72,7 +72,7 @@ a { <===> ================================================================================ <===> zero/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.tan(0)} <===> zero/output.css @@ -83,7 +83,7 @@ a { <===> ================================================================================ <===> zero_fuzzy/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.tan(0.000000000001)} <===> zero_fuzzy/output.css @@ -94,7 +94,7 @@ a { <===> ================================================================================ <===> deg/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.tan(1deg)} <===> deg/output.css @@ -105,7 +105,7 @@ a { <===> ================================================================================ <===> grad/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.tan(1grad)} <===> grad/output.css @@ -116,7 +116,7 @@ a { <===> ================================================================================ <===> rad/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.tan(1rad)} <===> rad/output.css @@ -127,7 +127,7 @@ a { <===> ================================================================================ <===> turn/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.tan(1turn)} <===> turn/output.css @@ -138,7 +138,7 @@ a { <===> ================================================================================ <===> unitless/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.tan(1)} <===> unitless/output.css @@ -149,7 +149,7 @@ a { <===> ================================================================================ <===> named_arg/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.tan($number: 1)} <===> named_arg/output.css @@ -160,7 +160,7 @@ a { <===> ================================================================================ <===> error/type/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.tan("0")} <===> error/type/error @@ -174,7 +174,7 @@ Error: $number: "0" is not a number. <===> ================================================================================ <===> error/unit/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.tan(1px)} <===> error/unit/error @@ -188,7 +188,7 @@ Error: $number: Expected 1px to have an angle unit (deg, grad, rad, turn). <===> ================================================================================ <===> error/zero_args/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.tan()} <===> error/zero_args/error @@ -206,7 +206,7 @@ Error: Missing argument $number. <===> ================================================================================ <===> error/too_many_args/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.tan(0, 0)} <===> error/too_many_args/error diff --git a/spec/core_functions/math/variables.hrx b/spec/core_functions/math/variables.hrx index 07e3cdb871..bc4e04c774 100644 --- a/spec/core_functions/math/variables.hrx +++ b/spec/core_functions/math/variables.hrx @@ -6,7 +6,7 @@ <===> ================================================================================ <===> e/input.scss -@use "sass:math" as math; +@use "sass:math"; // Multiplied by 1e15 so Sass's serialization doesn't remove the precision a {b: math.$e * 1e15} @@ -18,7 +18,7 @@ a { <===> ================================================================================ <===> pi/input.scss -@use "sass:math" as math; +@use "sass:math"; // Multiplied by 1e15 so Sass's serialization doesn't remove the precision a {b: math.$pi * 1e15} @@ -30,7 +30,7 @@ a { <===> ================================================================================ <===> epsilon/input.scss -@use "sass:math" as math; +@use "sass:math"; // Multiplied by 1e31 so Sass's serialization doesn't remove the precision a {b: math.$epsilon * 1e31} @@ -42,7 +42,7 @@ a { <===> ================================================================================ <===> max_safe_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.$max-safe-integer} <===> max_safe_integer/output.css @@ -53,7 +53,7 @@ a { <===> ================================================================================ <===> min_safe_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.$min-safe-integer} <===> min_safe_integer/output.css @@ -64,7 +64,7 @@ a { <===> ================================================================================ <===> max_number/input.scss -@use "sass:math" as math; +@use "sass:math"; a {b: math.$max-number} <===> max_number/output.css @@ -75,7 +75,7 @@ a { <===> ================================================================================ <===> min_number/input.scss -@use "sass:math" as math; +@use "sass:math"; // Multiplied by 1e339 so Sass's serialization doesn't remove the precision. // But 1e339 is too big for a double, so we multiply it multiple times. a {b: math.$min-number * 1e300 * 1e39} @@ -88,7 +88,7 @@ a { <===> ================================================================================ <===> error/assignment/e/input.scss -@use "sass:math" as math; +@use "sass:math"; math.$e: 0; <===> error/assignment/e/error @@ -102,7 +102,7 @@ Error: Cannot modify built-in variable. <===> ================================================================================ <===> error/assignment/pi/input.scss -@use "sass:math" as math; +@use "sass:math"; math.$pi: 0; <===> error/assignment/pi/error @@ -116,7 +116,7 @@ Error: Cannot modify built-in variable. <===> ================================================================================ <===> error/assignment/epsilon/input.scss -@use "sass:math" as math; +@use "sass:math"; math.$epsilon: 0; <===> error/assignment/epsilon/error @@ -130,7 +130,7 @@ Error: Cannot modify built-in variable. <===> ================================================================================ <===> error/assignment/max_safe_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; math.$max-safe-integer: 0; <===> error/assignment/max_safe_integer/error @@ -144,7 +144,7 @@ Error: Cannot modify built-in variable. <===> ================================================================================ <===> error/assignment/min_safe_integer/input.scss -@use "sass:math" as math; +@use "sass:math"; math.$min-safe-integer: 0; <===> error/assignment/min_safe_integer/error @@ -158,7 +158,7 @@ Error: Cannot modify built-in variable. <===> ================================================================================ <===> error/assignment/max_number/input.scss -@use "sass:math" as math; +@use "sass:math"; math.$max-number: 0; <===> error/assignment/max_number/error @@ -172,7 +172,7 @@ Error: Cannot modify built-in variable. <===> ================================================================================ <===> error/assignment/min_number/input.scss -@use "sass:math" as math; +@use "sass:math"; math.$min-number: 0; <===> error/assignment/min_number/error diff --git a/spec/core_functions/selector/append.hrx b/spec/core_functions/selector/append.hrx index cc1d339799..3e9e262c78 100644 --- a/spec/core_functions/selector/append.hrx +++ b/spec/core_functions/selector/append.hrx @@ -214,12 +214,16 @@ Error: Can't append "> .d" to ".c" for `selector-append' a {b: selector-append(".c ~", ".d")} <===> error/combinator/trailing/error -Error: Parent ".c ~" is incompatible with this selector. +Error: Selector ".c ~" can't be used as a parent in a compound selector. , +1 | .c ~ + | ^^^^ outer selector + ' + ,--> input.scss 1 | a {b: selector-append(".c ~", ".d")} - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ============================= parent selector ' - input.scss 1:7 root stylesheet + - 1:1 root stylesheet <===> error/combinator/trailing/error-libsass Error: Invalid parent selector for "&.d": "&.c ~" diff --git a/spec/core_functions/selector/unify/complex/combinators/multiple.hrx b/spec/core_functions/selector/unify/complex/combinators/multiple.hrx index 76fee1534d..8cc4f6b3ed 100644 --- a/spec/core_functions/selector/unify/complex/combinators/multiple.hrx +++ b/spec/core_functions/selector/unify/complex/combinators/multiple.hrx @@ -2,6 +2,11 @@ a {b: selector-unify(".c > .d + .e", ".f .g ~ .h")} <===> isolated/output.css +a { + b: .f .c > .g ~ .d + .e.h, .f .c > .d.g + .e.h; +} + +<===> isolated/output-libsass.css a { b: .f .c > .g ~ .d + .e.h, .f .c > .g.d + .e.h; } diff --git a/spec/core_functions/selector/unify/complex/combinators/next_sibling.hrx b/spec/core_functions/selector/unify/complex/combinators/next_sibling.hrx index 52c6e19cf3..60d11733b0 100644 --- a/spec/core_functions/selector/unify/complex/combinators/next_sibling.hrx +++ b/spec/core_functions/selector/unify/complex/combinators/next_sibling.hrx @@ -22,6 +22,11 @@ a { a {b: selector-unify(".c + .d", ".e ~ .f")} <===> and_sibling/distinct/output.css +a { + b: .e ~ .c + .d.f, .c.e + .d.f; +} + +<===> and_sibling/distinct/output-libsass.css a { b: .e ~ .c + .d.f, .e.c + .d.f; } @@ -52,6 +57,11 @@ a { a {b: selector-unify(".c.s1-1 + .s1-2", ".c.s2-1 ~ .s2-2")} <===> and_sibling/overlap/output.css +a { + b: .c.s2-1 ~ .c.s1-1 + .s1-2.s2-2, .c.s1-1.s2-1 + .s1-2.s2-2; +} + +<===> and_sibling/overlap/output-libsass.css a { b: .c.s2-1 ~ .c.s1-1 + .s1-2.s2-2, .c.s2-1.s1-1 + .s1-2.s2-2; } diff --git a/spec/css/custom_properties/name_interpolation.hrx b/spec/css/custom_properties/name_interpolation.hrx index 63a811a989..afc74e07e6 100644 --- a/spec/css/custom_properties/name_interpolation.hrx +++ b/spec/css/custom_properties/name_interpolation.hrx @@ -45,3 +45,24 @@ a { a { --b-c: d; } + +<===> +================================================================================ +<===> import_nesting_use/options.yml +:ignore_for: +- libsass + +<===> import_nesting_use/input.scss +// Regression test for sass/dart-sass#2023 +@import 'foo'; + +<===> import_nesting_use/foo.scss +@use 'bar'; + +<===> import_nesting_use/bar.scss +a { #{--}: b c } + +<===> import_nesting_use/output.css +a { + --: b c; +} diff --git a/spec/css/font-face.hrx b/spec/css/font-face.hrx new file mode 100644 index 0000000000..266e6e4d24 --- /dev/null +++ b/spec/css/font-face.hrx @@ -0,0 +1,102 @@ +<===> options.yml + +:ignore_for: +- libsass + +<===> +================================================================================ +<===> bubble/rules/input.scss +a { + b: c; + @font-face { d: e } +} + +<===> bubble/rules/output.css +a { + b: c; +} +@font-face { + d: e; +} + +<===> +================================================================================ +<===> bubble/empty/input.scss +a { + @font-face {/**/} +} + +<===> bubble/empty/output.css +@font-face { /**/ } + +<===> +================================================================================ +<===> bubble/in-mixin/input.scss +@mixin a { + @font-face { b: c } +} +d { + e: f; + @include a; +} + +<===> bubble/in-mixin/output.css +d { + e: f; +} +@font-face { + b: c; +} + +<===> +================================================================================ +<===> bubble/deeply-nested/input.scss +a { b { c { @font-face { e: f } g: h; } } } + +<===> bubble/deeply-nested/output.css +a b c { + g: h; +} +@font-face { + e: f; +} + +<===> +================================================================================ +<===> bubble/loaded/import/input.scss +c { + @import 'upstream'; + d: e; +} + +<===> bubble/loaded/import/upstream.scss +@font-face { a: b } + +<===> bubble/loaded/import/output.css +c { + d: e; +} +@font-face { + a: b; +} + +<===> +================================================================================ +<===> bubble/loaded/meta-load-css/input.scss +@use 'sass:meta'; + +c { + @include meta.load-css('upstream'); + d: e; +} + +<===> bubble/loaded/meta-load-css/upstream.scss +@font-face { a: b } + +<===> bubble/loaded/meta-load-css/output.css +c { + d: e; +} +@font-face { + a: b; +} diff --git a/spec/css/keyframes.hrx b/spec/css/keyframes.hrx index 7773865def..6aa24dfa16 100644 --- a/spec/css/keyframes.hrx +++ b/spec/css/keyframes.hrx @@ -35,6 +35,30 @@ a { /**/ } +<===> +================================================================================ +<===> bubble/in-mixin/input.scss +@mixin a { + @keyframes b { + to { c: d } + } +} +e { + f: g; + @include a; +} + + +<===> bubble/in-mixin/output.css +e { + f: g; +} +@keyframes b { + to { + c: d; + } +} + <===> ================================================================================ <===> name/variable_like/input.scss diff --git a/spec/css/media/bubbling.hrx b/spec/css/media/bubbling.hrx index a2203de649..14afe78578 100644 --- a/spec/css/media/bubbling.hrx +++ b/spec/css/media/bubbling.hrx @@ -23,3 +23,31 @@ } } } + +<===> +================================================================================ +<===> preserve_merge_after_bubble/input.scss +// Regression test for sass/dart-sass#777 +@media (a: b) { + @media (c: d) { + e {f: g} + } + + h {i: j} + k {l: m} +} + +<===> preserve_merge_after_bubble/output.css +@media (a: b) and (c: d) { + e { + f: g; + } +} +@media (a: b) { + h { + i: j; + } + k { + l: m; + } +} diff --git a/spec/css/plain/error/statement.hrx b/spec/css/plain/error/statement.hrx index 2927f22b12..a2d07dada5 100644 --- a/spec/css/plain/error/statement.hrx +++ b/spec/css/plain/error/statement.hrx @@ -362,7 +362,7 @@ Error: Nested declarations aren't allowed in plain CSS. <===> style_rule/parent_selector/error Error: Parent selectors aren't allowed here. , -1 | &.foo{ +1 | &.foo { | ^ ' plain.css 1:1 @import @@ -380,7 +380,7 @@ Error: Parent selectors aren't allowed here. <===> style_rule/placeholder_selector/error Error: Placeholder selectors aren't allowed here. , -1 | %foo{ +1 | %foo { | ^^^^ ' plain.css 1:1 @import diff --git a/spec/css/propset.hrx b/spec/css/propset.hrx new file mode 100644 index 0000000000..7cba868e5e --- /dev/null +++ b/spec/css/propset.hrx @@ -0,0 +1,107 @@ +<===> options.yml +:ignore_for: +- libsass + +<===> +================================================================================ +<===> simple/input.scss +a { b: { c: d } } + +<===> simple/output.css +a { + b-c: d; +} + +<===> +================================================================================ +<===> complex/input.scss +a { b: c { d: e } } + +<===> complex/output.css +a { + b: c; + b-d: e; +} + +<===> +================================================================================ +<===> with_dash_prefix/input.scss +a { b: { -c: d } } + +<===> with_dash_prefix/output.css +a { + b--c: d; +} + +<===> +================================================================================ +<===> nested/input.scss +a { b: { c: { d: e }; f: g } } + +<===> nested/output.css +a { + b-c-d: e; + b-f: g; +} + +<===> +================================================================================ +<===> custom_property_value/input.scss +a { b: { c: --d } } + +<===> custom_property_value/output.css +a { + b-c: --d; +} + +<===> +================================================================================ +<===> error/value_after_propset/input.scss +a { b: { d: e } f } + +<===> error/value_after_propset/error +Error: expected "{". + , +1 | a { b: { d: e } f } + | ^ + ' + input.scss 1:19 root stylesheet + +<===> +================================================================================ +<===> error/custom_property/simple/input.scss +a { b: { --d: e } } + +<===> error/custom_property/simple/error +Error: Declarations whose names begin with "--" may not be nested. + , +1 | a { b: { --d: e } } + | ^^^^^^^ + ' + input.scss 1:10 root stylesheet + +<===> +================================================================================ +<===> error/custom_property/nested/simple/input.scss +a { b: { --d: {e: f} } } + +<===> error/custom_property/nested/simple/error +Error: Declarations whose names begin with "--" may not be nested. + , +1 | a { b: { --d: {e: f} } } + | ^^^^^^^^^^^ + ' + input.scss 1:10 root stylesheet + +<===> +================================================================================ +<===> error/custom_property/nested/complex/input.scss +a { b: { --d: e {--f: g} } } + +<===> error/custom_property/nested/complex/error +Error: Declarations whose names begin with "--" may not be nested. + , +1 | a { b: { --d: e {--f: g} } } + | ^^^^^^^^^^^^^^^ + ' + input.scss 1:10 root stylesheet diff --git a/spec/css/selector/attribute.hrx b/spec/css/selector/attribute.hrx index b45886f9e4..a5babcb334 100644 --- a/spec/css/selector/attribute.hrx +++ b/spec/css/selector/attribute.hrx @@ -96,7 +96,7 @@ <===> error/modifier/no_operator/error Error: Expected "]". , -1 | [a b]{c: d} +1 | [a b] {c: d} | ^ ' input.scss 1:4 root stylesheet @@ -117,7 +117,7 @@ Error: invalid operator in attribute selector for a <===> error/modifier/too_long/error Error: expected "]". , -2 | [a=b cd]{e: f} +2 | [a=b cd] {e: f} | ^ ' input.scss 2:7 root stylesheet @@ -138,7 +138,7 @@ Error: unterminated attribute selector for a <===> error/modifier/underscore/error Error: expected "]". , -2 | [a=b _]{c: d} +2 | [a=b _] {c: d} | ^ ' input.scss 2:6 root stylesheet @@ -159,7 +159,7 @@ Error: unterminated attribute selector for a <===> error/modifier/digit/error Error: expected "]". , -2 | [a=b 1]{c: d} +2 | [a=b 1] {c: d} | ^ ' input.scss 2:6 root stylesheet @@ -180,7 +180,7 @@ Error: unterminated attribute selector for a <===> error/modifier/unicode/error Error: expected "]". , -2 | [a=b ï]{c: d} +2 | [a=b ï] {c: d} | ^ ' input.scss 2:6 root stylesheet diff --git a/spec/css/selector/combinator/has.hrx b/spec/css/selector/combinator/has.hrx index 72180f3c57..93ee2d4df1 100644 --- a/spec/css/selector/combinator/has.hrx +++ b/spec/css/selector/combinator/has.hrx @@ -1,89 +1,86 @@ -<===> leading/single/child/options.yml -:ignore_for: - - libsass - <===> leading/single/child/input.scss -:is(> a) {b: c} +:has(> a) {b: c} <===> leading/single/child/output.css - -<===> leading/single/child/warning -DEPRECATION WARNING: The selector ":is(> a)" is invalid CSS. It will be omitted from the generated CSS. -This will be an error in Dart Sass 2.0.0. - -More info: https://sass-lang.com/d/bogus-combinators - - , -1 | :is(> a) {b: c} - | ^^^^^^^^^ - ' - input.scss 1:1 root stylesheet +:has(> a) { + b: c; +} <===> ================================================================================ -<===> leading/single/next_sibling/options.yml -:ignore_for: - - libsass - <===> leading/single/next_sibling/input.scss -:is(+ a) {b: c} +:has(+ a) {b: c} <===> leading/single/next_sibling/output.css +:has(+ a) { + b: c; +} -<===> leading/single/next_sibling/warning -DEPRECATION WARNING: The selector ":is(+ a)" is invalid CSS. It will be omitted from the generated CSS. -This will be an error in Dart Sass 2.0.0. +<===> +================================================================================ +<===> leading/single/sibling/input.scss +:has(~ a) {b: c} -More info: https://sass-lang.com/d/bogus-combinators +<===> leading/single/sibling/output.css +:has(~ a) { + b: c; +} - , -1 | :is(+ a) {b: c} - | ^^^^^^^^^ - ' - input.scss 1:1 root stylesheet +<===> +================================================================================ +<===> leading/single/parent/input.scss +// Regression test for sass/sass#3546 +a { + :has(~ &) {b: c} +} + +<===> leading/single/parent/output.css +:has(~ a) { + b: c; +} <===> ================================================================================ -<===> leading/single/sibling/options.yml +<===> leading/multiple/options.yml :ignore_for: - libsass -<===> leading/single/sibling/input.scss -:is(~ a) {b: c} +<===> +================================================================================ +<===> leading/multiple/direct/input.scss +:has(+ ~ a) {b: c} -<===> leading/single/sibling/output.css +<===> leading/multiple/direct/output.css -<===> leading/single/sibling/warning -DEPRECATION WARNING: The selector ":is(~ a)" is invalid CSS. It will be omitted from the generated CSS. +<===> leading/multiple/direct/warning +DEPRECATION WARNING: The selector ":has(+ ~ a)" is invalid CSS. It will be omitted from the generated CSS. This will be an error in Dart Sass 2.0.0. More info: https://sass-lang.com/d/bogus-combinators , -1 | :is(~ a) {b: c} - | ^^^^^^^^^ +1 | :has(+ ~ a) {b: c} + | ^^^^^^^^^^^ ' input.scss 1:1 root stylesheet <===> ================================================================================ -<===> leading/multiple/options.yml -:ignore_for: - - libsass - -<===> leading/multiple/input.scss -:is(+ ~ a) {b: c} +<===> leading/multiple/parent/input.scss +~ a { + :has(+ &) {b: c} +} -<===> leading/multiple/output.css +<===> leading/multiple/parent/output.css -<===> leading/multiple/warning -DEPRECATION WARNING: The selector ":is(+ ~ a)" is invalid CSS. It will be omitted from the generated CSS. +<===> leading/multiple/parent/warning +DEPRECATION WARNING: The selector ":has(+ ~ a)" is invalid CSS. It will be omitted from the generated CSS. This will be an error in Dart Sass 2.0.0. More info: https://sass-lang.com/d/bogus-combinators , -1 | :is(+ ~ a) {b: c} - | ^^^^^^^^^^^ +2 | :has(+ &) {b: c} + | ^^^^^^^^^ ' - input.scss 1:1 root stylesheet + input.scss 2:3 root stylesheet diff --git a/spec/css/selector/combinator/is.hrx b/spec/css/selector/combinator/is.hrx new file mode 100644 index 0000000000..0bccac5ca7 --- /dev/null +++ b/spec/css/selector/combinator/is.hrx @@ -0,0 +1,89 @@ +<===> leading/single/child/options.yml +:ignore_for: + - libsass + +<===> leading/single/child/input.scss +:is(> a) {b: c} + +<===> leading/single/child/output.css + +<===> leading/single/child/warning +DEPRECATION WARNING: The selector ":is(> a)" is invalid CSS. It will be omitted from the generated CSS. +This will be an error in Dart Sass 2.0.0. + +More info: https://sass-lang.com/d/bogus-combinators + + , +1 | :is(> a) {b: c} + | ^^^^^^^^ + ' + input.scss 1:1 root stylesheet + +<===> +================================================================================ +<===> leading/single/next_sibling/options.yml +:ignore_for: + - libsass + +<===> leading/single/next_sibling/input.scss +:is(+ a) {b: c} + +<===> leading/single/next_sibling/output.css + +<===> leading/single/next_sibling/warning +DEPRECATION WARNING: The selector ":is(+ a)" is invalid CSS. It will be omitted from the generated CSS. +This will be an error in Dart Sass 2.0.0. + +More info: https://sass-lang.com/d/bogus-combinators + + , +1 | :is(+ a) {b: c} + | ^^^^^^^^ + ' + input.scss 1:1 root stylesheet + +<===> +================================================================================ +<===> leading/single/sibling/options.yml +:ignore_for: + - libsass + +<===> leading/single/sibling/input.scss +:is(~ a) {b: c} + +<===> leading/single/sibling/output.css + +<===> leading/single/sibling/warning +DEPRECATION WARNING: The selector ":is(~ a)" is invalid CSS. It will be omitted from the generated CSS. +This will be an error in Dart Sass 2.0.0. + +More info: https://sass-lang.com/d/bogus-combinators + + , +1 | :is(~ a) {b: c} + | ^^^^^^^^ + ' + input.scss 1:1 root stylesheet + +<===> +================================================================================ +<===> leading/multiple/options.yml +:ignore_for: + - libsass + +<===> leading/multiple/input.scss +:is(+ ~ a) {b: c} + +<===> leading/multiple/output.css + +<===> leading/multiple/warning +DEPRECATION WARNING: The selector ":is(+ ~ a)" is invalid CSS. It will be omitted from the generated CSS. +This will be an error in Dart Sass 2.0.0. + +More info: https://sass-lang.com/d/bogus-combinators + + , +1 | :is(+ ~ a) {b: c} + | ^^^^^^^^^^ + ' + input.scss 1:1 root stylesheet diff --git a/spec/css/selector/combinator/leading.hrx b/spec/css/selector/combinator/leading.hrx index 895dd87619..5ed2ba1e3f 100644 --- a/spec/css/selector/combinator/leading.hrx +++ b/spec/css/selector/combinator/leading.hrx @@ -14,7 +14,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | > a {b: c} - | ^^^^ + | ^^^ ' input.scss 1:1 root stylesheet @@ -38,7 +38,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | + a {b: c} - | ^^^^ + | ^^^ ' input.scss 1:1 root stylesheet @@ -62,7 +62,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | ~ a {b: c} - | ^^^^ + | ^^^ ' input.scss 1:1 root stylesheet @@ -87,7 +87,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | + ~ a {b: c} - | ^^^^^^ + | ^^^^^ ' input.scss 1:1 root stylesheet @@ -110,6 +110,6 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | > > a {b: c} - | ^^^^^^ + | ^^^^^ ' input.scss 1:1 root stylesheet diff --git a/spec/css/selector/combinator/middle.hrx b/spec/css/selector/combinator/middle.hrx index 6b13a0cc24..ce8a350fb0 100644 --- a/spec/css/selector/combinator/middle.hrx +++ b/spec/css/selector/combinator/middle.hrx @@ -45,7 +45,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | a > + b {c: d} - | ^^^^^^^^ + | ^^^^^^^ ' input.scss 1:1 root stylesheet @@ -68,6 +68,6 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | a~>b {c: d} - | ^^^^^ + | ^^^^ ' input.scss 1:1 root stylesheet diff --git a/spec/css/selector/combinator/only_one_bogus.hrx b/spec/css/selector/combinator/only_one_bogus.hrx index 45aadf4779..656f7faf22 100644 --- a/spec/css/selector/combinator/only_one_bogus.hrx +++ b/spec/css/selector/combinator/only_one_bogus.hrx @@ -14,8 +14,8 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | a, + b {c: d} - | ^^^^^^^ + | ^^^ ' - input.scss 1:1 root stylesheet + input.scss 1:4 root stylesheet <===> warning-libsass diff --git a/spec/css/selector/combinator/selector_pseudo.hrx b/spec/css/selector/combinator/selector_pseudo.hrx index 1fde47873e..dbdca4939e 100644 --- a/spec/css/selector/combinator/selector_pseudo.hrx +++ b/spec/css/selector/combinator/selector_pseudo.hrx @@ -45,7 +45,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | :is(a > + b) {c: d} - | ^^^^^^^^^^^^^ + | ^^^^^^^^^^^^ ' input.scss 1:1 root stylesheet @@ -68,7 +68,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | :is(> a) {b: c} - | ^^^^^^^^^ + | ^^^^^^^^ ' input.scss 1:1 root stylesheet @@ -91,7 +91,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | :is(+ a) {b: c} - | ^^^^^^^^^ + | ^^^^^^^^ ' input.scss 1:1 root stylesheet @@ -114,7 +114,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | :is(~ a) {b: c} - | ^^^^^^^^^ + | ^^^^^^^^ ' input.scss 1:1 root stylesheet @@ -137,7 +137,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | :is(+ ~ a) {b: c} - | ^^^^^^^^^^^ + | ^^^^^^^^^^ ' input.scss 1:1 root stylesheet @@ -160,7 +160,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | :is(a >) {b: c} - | ^^^^^^^^^ + | ^^^^^^^^ ' input.scss 1:1 root stylesheet @@ -183,7 +183,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | :is(a +) {b: c} - | ^^^^^^^^^ + | ^^^^^^^^ ' input.scss 1:1 root stylesheet @@ -206,7 +206,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | :is(a ~) {b: c} - | ^^^^^^^^^ + | ^^^^^^^^ ' input.scss 1:1 root stylesheet @@ -229,6 +229,6 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | :is(a +) {b: c} - | ^^^^^^^^^ + | ^^^^^^^^ ' input.scss 1:1 root stylesheet diff --git a/spec/css/selector/combinator/trailing.hrx b/spec/css/selector/combinator/trailing.hrx index 5172ba0b14..08f3d0e39b 100644 --- a/spec/css/selector/combinator/trailing.hrx +++ b/spec/css/selector/combinator/trailing.hrx @@ -16,7 +16,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | a > {b: c} - | ^^^^ invalid selector + | ^^^ invalid selector | ==== this is not a style rule ' input.scss 1:1 root stylesheet @@ -41,7 +41,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | a + {b: c} - | ^^^^ invalid selector + | ^^^ invalid selector | ==== this is not a style rule ' input.scss 1:1 root stylesheet @@ -66,7 +66,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | a ~ {b: c} - | ^^^^ invalid selector + | ^^^ invalid selector | ==== this is not a style rule ' input.scss 1:1 root stylesheet @@ -90,7 +90,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | a + ~ {b: c} - | ^^^^^^ + | ^^^^^ ' input.scss 1:1 root stylesheet @@ -113,6 +113,6 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | a > > {b: c} - | ^^^^^^ + | ^^^^^ ' input.scss 1:1 root stylesheet diff --git a/spec/css/selector/reference_combinator.hrx b/spec/css/selector/reference_combinator.hrx index 081101ce8e..d71782f9bf 100644 --- a/spec/css/selector/reference_combinator.hrx +++ b/spec/css/selector/reference_combinator.hrx @@ -13,7 +13,7 @@ <===> error Error: expected selector. , -3 | .foo /bar/ .baz{ +3 | .foo /bar/ .baz { | ^ ' input.scss 3:6 root stylesheet diff --git a/spec/directives/extend/bogus.hrx b/spec/directives/extend/bogus.hrx index 52344ecc4d..579d13742f 100644 --- a/spec/directives/extend/bogus.hrx +++ b/spec/directives/extend/bogus.hrx @@ -15,7 +15,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 2 | > d {@extend a} - | ^^^^ invalid selector + | ^^^ invalid selector | ========= @extend rule ' input.scss 2:1 root stylesheet @@ -45,7 +45,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 2 | d + {@extend a} - | ^^^^ invalid selector + | ^^^ invalid selector | ========= @extend rule ' input.scss 2:1 root stylesheet @@ -73,7 +73,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 2 | + ~ d {@extend a} - | ^^^^^^ invalid selector + | ^^^^^ invalid selector | ========= @extend rule ' input.scss 2:1 root stylesheet @@ -101,7 +101,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 2 | d > + {@extend a} - | ^^^^^^ invalid selector + | ^^^^^ invalid selector | ========= @extend rule ' input.scss 2:1 root stylesheet @@ -129,7 +129,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 2 | d ~ > c {@extend a} - | ^^^^^^^^ invalid selector + | ^^^^^^^ invalid selector | ========= @extend rule ' input.scss 2:1 root stylesheet @@ -157,7 +157,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 2 | + {@extend a} - | ^^ invalid selector + | ^ invalid selector | ========= @extend rule ' input.scss 2:1 root stylesheet diff --git a/spec/directives/extend/trims_super_selector_without_combinator.hrx b/spec/directives/extend/trims_super_selector_without_combinator.hrx new file mode 100644 index 0000000000..585ac379f2 --- /dev/null +++ b/spec/directives/extend/trims_super_selector_without_combinator.hrx @@ -0,0 +1,21 @@ +<===> options.yml +:todo: + - dart-sass + +<===> input.scss +a b { + @extend %c; +} + +a > b { + @extend %c; +} + +%c { + color: red; +} + +<===> output.css +a b { + color: red; +} diff --git a/spec/directives/use/css/order.hrx b/spec/directives/use/css/order.hrx deleted file mode 100644 index 668a0cdaa0..0000000000 --- a/spec/directives/use/css/order.hrx +++ /dev/null @@ -1,500 +0,0 @@ -<===> once/input.scss -@use "other" as o1; -@use "other" as o2; -@use "other" as o3; - -<===> once/_other.scss -a {b: c} - -<===> once/output.css -a { - b: c; -} - -<===> -================================================================================ -<===> use_into_use/input.scss -@use "midstream"; - -a {file: input} - -<===> use_into_use/midstream.scss -@use "upstream"; - -a {file: midstream} - -<===> use_into_use/upstream.scss -a {file: upstream} - -<===> use_into_use/output.css -a { - file: upstream; -} - -a { - file: midstream; -} - -a { - file: input; -} - -<===> -================================================================================ -<===> use_order/input.scss -@use "other1"; -@use "other2"; -@use "other3"; - -a {file: input} - -<===> use_order/other1.scss -a {file: other1} - -<===> use_order/other2.scss -a {file: other2} - -<===> use_order/other3.scss -a {file: other3} - -<===> use_order/output.css -a { - file: other1; -} - -a { - file: other2; -} - -a { - file: other3; -} - -a { - file: input; -} - -<===> -================================================================================ -<===> diamond/input.scss -@use "left"; -@use "right"; - -a {file: input} - -<===> diamond/left.scss -@use "shared"; - -a {file: left} - -<===> diamond/right.scss -@use "shared"; - -a {file: right} - -<===> diamond/shared.scss -a {file: shared} - -<===> diamond/output.css -a { - file: shared; -} - -a { - file: left; -} - -a { - file: right; -} - -a { - file: input; -} - -<===> -================================================================================ -<===> triangle/input.scss -@use "midstream"; -@use "upstream"; - -a {file: input} - -<===> triangle/midstream.scss -@use "upstream"; - -a {file: midstream} - -<===> triangle/upstream.scss -a {file: upstream} - -<===> triangle/output.css -a { - file: upstream; -} - -a { - file: midstream; -} - -a { - file: input; -} - -<===> -================================================================================ -<===> unrelated_branches/input.scss -@use "left_midstream"; -@use "right_midstream"; - -a {file: input} - -<===> unrelated_branches/left_midstream.scss -@use "left_upstream"; - -a {file: left midstream} - -<===> unrelated_branches/left_upstream.scss -a {file: left upstream} - -<===> unrelated_branches/right_midstream.scss -@use "right_upstream"; - -a {file: right midstream} - -<===> unrelated_branches/right_upstream.scss -a {file: right upstream} - -<===> unrelated_branches/output.css -a { - file: left upstream; -} - -a { - file: left midstream; -} - -a { - file: right upstream; -} - -a { - file: right midstream; -} - -a { - file: input; -} - -<===> -================================================================================ -<===> import_order/use_into_use/import_above_rule/input.scss -@use "midstream"; - -@import "input.css"; - -<===> import_order/use_into_use/import_above_rule/_midstream.scss -@use "upstream"; - -@import "midstream.css"; - -a {file: midstream} - -<===> import_order/use_into_use/import_above_rule/_upstream.scss -@import "upstream.css"; - -a {file: upstream} - -<===> import_order/use_into_use/import_above_rule/output.css -@import "upstream.css"; -@import "midstream.css"; -@import "input.css"; - -a { - file: upstream; -} - -a { - file: midstream; -} - -<===> -================================================================================ -<===> import_order/use_into_use/import_below_rule/input.scss -@use "midstream"; - -@import "input.css"; - -<===> import_order/use_into_use/import_below_rule/_midstream.scss -@use "upstream"; - -a {file: midstream} - -@import "midstream.css"; - -<===> import_order/use_into_use/import_below_rule/_upstream.scss -a {file: upstream} - -@import "upstream.css"; - -<===> import_order/use_into_use/import_below_rule/output.css -@import "upstream.css"; -@import "midstream.css"; -@import "input.css"; - -a { - file: upstream; -} - -a { - file: midstream; -} - -<===> -================================================================================ -<===> import_order/use_into_import/css_import_above_rule/input.scss -@use "used"; - -@import "input.css"; - -<===> import_order/use_into_import/css_import_above_rule/_used.scss -@import "imported"; - -@import "used.css"; - -a {file: used} - -<===> import_order/use_into_import/css_import_above_rule/_imported.scss -@import "imported.css"; - -a {file: imported} - -<===> import_order/use_into_import/css_import_above_rule/output.css -@import "imported.css"; -@import "used.css"; -@import "input.css"; - -a { - file: imported; -} - -a { - file: used; -} - -<===> -================================================================================ -<===> import_order/use_into_import/css_import_below_rule/input.scss -@use "used"; - -@import "input.css"; - -<===> import_order/use_into_import/css_import_below_rule/_used.scss -@import "imported"; - -a {file: used} - -@import "used.css"; - -<===> import_order/use_into_import/css_import_below_rule/_imported.scss -a {file: imported} - -@import "imported.css"; - -<===> import_order/use_into_import/css_import_below_rule/output.css -@import "imported.css"; -@import "used.css"; -@import "input.css"; - -a { - file: imported; -} - -a { - file: used; -} - -<===> -================================================================================ -<===> import_order/use_into_import/sass_import_below_css_import/input.scss -@use "used"; - -@import "input.css"; - -<===> import_order/use_into_import/sass_import_below_css_import/_used.scss -@import "used.css"; - -@import "imported"; - -<===> import_order/use_into_import/sass_import_below_css_import/_imported.scss -@import "imported.css"; - -<===> import_order/use_into_import/sass_import_below_css_import/output.css -@import "used.css"; -@import "imported.css"; -@import "input.css"; - -<===> -================================================================================ -<===> import_order/import_into_use/css_import_above_rule/input.scss -@import "imported"; - -@import "input.css"; - -<===> import_order/import_into_use/css_import_above_rule/_imported.scss -@use "used"; - -@import "imported.css"; - -a {file: imported} - -<===> import_order/import_into_use/css_import_above_rule/_used.scss -@import "used.css"; - -a {file: used} - -<===> import_order/import_into_use/css_import_above_rule/output.css -@import "used.css"; -@import "imported.css"; -@import "input.css"; - -a { - file: used; -} - -a { - file: imported; -} - -<===> -================================================================================ -<===> import_order/import_into_use/css_import_below_rule/input.scss -@import "imported"; - -@import "input.css"; - -<===> import_order/import_into_use/css_import_below_rule/_imported.scss -@use "used"; - -a {file: imported} - -@import "imported.css"; - -<===> import_order/import_into_use/css_import_below_rule/_used.scss -a {file: used} - -@import "used.css"; - -<===> import_order/import_into_use/css_import_below_rule/output.css -@import "used.css"; -@import "imported.css"; -@import "input.css"; - -a { - file: used; -} - -a { - file: imported; -} - -<===> -================================================================================ -<===> import_order/import_into_use/sass_import_below_css_import/input.scss -@import "input.css"; - -@import "imported"; - -<===> import_order/import_into_use/sass_import_below_css_import/_imported.scss -@use "used"; - -@import "imported.css"; - -<===> import_order/import_into_use/sass_import_below_css_import/_used.scss -@import "used.css"; - -<===> import_order/import_into_use/sass_import_below_css_import/output.css -@import "input.css"; -@import "used.css"; -@import "imported.css"; - -<===> -================================================================================ -<===> import_order/comments_and_imports/input.scss -/* input comment before use */ -@use "midstream"; - -/* input comment before import */ -@import "input.css"; - -/* input comment after import */ - -<===> import_order/comments_and_imports/midstream.scss -/* midstream comment before use */ -@use "upstream"; - -/* midstream comment before first import */ -@import "midstream1.css"; - -/* midstream comment before second import */ -@import "midstream2.css"; - -/* midstream comment after imports */ - -a {file: midstream} - -<===> import_order/comments_and_imports/upstream.scss -/* upstream comment before import */ -@import "upstream.css"; - -/* upstream comment after import */ - -<===> import_order/comments_and_imports/output.css -/* upstream comment before import */ -@import "upstream.css"; -/* midstream comment before use */ -/* midstream comment before first import */ -@import "midstream1.css"; -/* midstream comment before second import */ -@import "midstream2.css"; -/* input comment before use */ -/* input comment before import */ -@import "input.css"; -/* upstream comment after import */ -/* midstream comment after imports */ -a { - file: midstream; -} - -/* input comment after import */ - -<===> import_order/comments_and_imports/output-libsass.css -/* upstream comment before import */ - -@import "upstream.css"; - -/* midstream comment before use */ - -/* midstream comment before first import */ - -@import "midstream1.css"; - -/* midstream comment before second import */ - -@import "midstream2.css"; - -/* input comment before use */ - -/* input comment before import */ - -@import "input.css"; - -/* upstream comment after import */ - -/* midstream comment after imports */ - -a { - file: midstream; -} - -/* input comment after import */ diff --git a/spec/directives/use/css/order/use_and_import.hrx b/spec/directives/use/css/order/use_and_import.hrx new file mode 100644 index 0000000000..c903841805 --- /dev/null +++ b/spec/directives/use/css/order/use_and_import.hrx @@ -0,0 +1,310 @@ +<===> use_into_use/import_above_rule/input.scss +@use "midstream"; + +@import "input.css"; + +<===> use_into_use/import_above_rule/_midstream.scss +@use "upstream"; + +@import "midstream.css"; + +a {file: midstream} + +<===> use_into_use/import_above_rule/_upstream.scss +@import "upstream.css"; + +a {file: upstream} + +<===> use_into_use/import_above_rule/output.css +@import "upstream.css"; +@import "midstream.css"; +@import "input.css"; + +a { + file: upstream; +} + +a { + file: midstream; +} + +<===> +================================================================================ +<===> use_into_use/import_below_rule/input.scss +@use "midstream"; + +@import "input.css"; + +<===> use_into_use/import_below_rule/_midstream.scss +@use "upstream"; + +a {file: midstream} + +@import "midstream.css"; + +<===> use_into_use/import_below_rule/_upstream.scss +a {file: upstream} + +@import "upstream.css"; + +<===> use_into_use/import_below_rule/output.css +@import "upstream.css"; +@import "midstream.css"; +@import "input.css"; + +a { + file: upstream; +} + +a { + file: midstream; +} + +<===> +================================================================================ +<===> use_into_import/css_import_above_rule/input.scss +@use "used"; + +@import "input.css"; + +<===> use_into_import/css_import_above_rule/_used.scss +@import "imported"; + +@import "used.css"; + +a {file: used} + +<===> use_into_import/css_import_above_rule/_imported.scss +@import "imported.css"; + +a {file: imported} + +<===> use_into_import/css_import_above_rule/output.css +@import "imported.css"; +@import "used.css"; +@import "input.css"; + +a { + file: imported; +} + +a { + file: used; +} + +<===> +================================================================================ +<===> use_into_import/css_import_below_rule/input.scss +@use "used"; + +@import "input.css"; + +<===> use_into_import/css_import_below_rule/_used.scss +@import "imported"; + +a {file: used} + +@import "used.css"; + +<===> use_into_import/css_import_below_rule/_imported.scss +a {file: imported} + +@import "imported.css"; + +<===> use_into_import/css_import_below_rule/output.css +@import "imported.css"; +@import "used.css"; +@import "input.css"; + +a { + file: imported; +} + +a { + file: used; +} + +<===> +================================================================================ +<===> use_into_import/sass_import_below_css_import/input.scss +@use "used"; + +@import "input.css"; + +<===> use_into_import/sass_import_below_css_import/_used.scss +@import "used.css"; + +@import "imported"; + +<===> use_into_import/sass_import_below_css_import/_imported.scss +@import "imported.css"; + +<===> use_into_import/sass_import_below_css_import/output.css +@import "used.css"; +@import "imported.css"; +@import "input.css"; + +<===> +================================================================================ +<===> import_into_use/css_import_above_rule/input.scss +@import "imported"; + +@import "input.css"; + +<===> import_into_use/css_import_above_rule/_imported.scss +@use "used"; + +@import "imported.css"; + +a {file: imported} + +<===> import_into_use/css_import_above_rule/_used.scss +@import "used.css"; + +a {file: used} + +<===> import_into_use/css_import_above_rule/output.css +@import "used.css"; +@import "imported.css"; +@import "input.css"; + +a { + file: used; +} + +a { + file: imported; +} + +<===> +================================================================================ +<===> import_into_use/css_import_below_rule/input.scss +@import "imported"; + +@import "input.css"; + +<===> import_into_use/css_import_below_rule/_imported.scss +@use "used"; + +a {file: imported} + +@import "imported.css"; + +<===> import_into_use/css_import_below_rule/_used.scss +a {file: used} + +@import "used.css"; + +<===> import_into_use/css_import_below_rule/output.css +@import "used.css"; +@import "imported.css"; +@import "input.css"; + +a { + file: used; +} + +a { + file: imported; +} + +<===> +================================================================================ +<===> import_into_use/sass_import_below_css_import/input.scss +@import "input.css"; + +@import "imported"; + +<===> import_into_use/sass_import_below_css_import/_imported.scss +@use "used"; + +@import "imported.css"; + +<===> import_into_use/sass_import_below_css_import/_used.scss +@import "used.css"; + +<===> import_into_use/sass_import_below_css_import/output.css +@import "input.css"; +@import "used.css"; +@import "imported.css"; + +<===> +================================================================================ +<===> comments_and_imports/input.scss +/* input comment before use */ +@use "midstream"; + +/* input comment before import */ +@import "input.css"; + +/* input comment after import */ + +<===> comments_and_imports/midstream.scss +/* midstream comment before use */ +@use "upstream"; + +/* midstream comment before first import */ +@import "midstream1.css"; + +/* midstream comment before second import */ +@import "midstream2.css"; + +/* midstream comment after imports */ + +a {file: midstream} + +<===> comments_and_imports/upstream.scss +/* upstream comment before import */ +@import "upstream.css"; + +/* upstream comment after import */ + +<===> comments_and_imports/output.css +/* input comment before use */ +/* midstream comment before use */ +/* upstream comment before import */ +@import "upstream.css"; +/* midstream comment before first import */ +@import "midstream1.css"; +/* midstream comment before second import */ +@import "midstream2.css"; +/* input comment before import */ +@import "input.css"; +/* upstream comment after import */ +/* midstream comment after imports */ +a { + file: midstream; +} + +/* input comment after import */ + +<===> comments_and_imports/output-libsass.css +/* upstream comment before import */ + +@import "upstream.css"; + +/* midstream comment before use */ + +/* midstream comment before first import */ + +@import "midstream1.css"; + +/* midstream comment before second import */ + +@import "midstream2.css"; + +/* input comment before use */ + +/* input comment before import */ + +@import "input.css"; + +/* upstream comment after import */ + +/* midstream comment after imports */ + +a { + file: midstream; +} + +/* input comment after import */ diff --git a/spec/directives/use/css/order/use_only.hrx b/spec/directives/use/css/order/use_only.hrx new file mode 100644 index 0000000000..b3681d8c54 --- /dev/null +++ b/spec/directives/use/css/order/use_only.hrx @@ -0,0 +1,339 @@ +<===> once/input.scss +@use "other" as o1; +@use "other" as o2; +@use "other" as o3; + +<===> once/_other.scss +a {b: c} + +<===> once/output.css +a { + b: c; +} + +<===> +================================================================================ +<===> use_into_use/input.scss +@use "midstream"; + +a {file: input} + +<===> use_into_use/midstream.scss +@use "upstream"; + +a {file: midstream} + +<===> use_into_use/upstream.scss +a {file: upstream} + +<===> use_into_use/output.css +a { + file: upstream; +} + +a { + file: midstream; +} + +a { + file: input; +} + +<===> +================================================================================ +<===> use_order/input.scss +@use "other1"; +@use "other2"; +@use "other3"; + +a {file: input} + +<===> use_order/other1.scss +a {file: other1} + +<===> use_order/other2.scss +a {file: other2} + +<===> use_order/other3.scss +a {file: other3} + +<===> use_order/output.css +a { + file: other1; +} + +a { + file: other2; +} + +a { + file: other3; +} + +a { + file: input; +} + +<===> +================================================================================ +<===> diamond/input.scss +@use "left"; +@use "right"; + +a {file: input} + +<===> diamond/left.scss +@use "shared"; + +a {file: left} + +<===> diamond/right.scss +@use "shared"; + +a {file: right} + +<===> diamond/shared.scss +a {file: shared} + +<===> diamond/output.css +a { + file: shared; +} + +a { + file: left; +} + +a { + file: right; +} + +a { + file: input; +} + +<===> +================================================================================ +<===> triangle/input.scss +@use "midstream"; +@use "upstream"; + +a {file: input} + +<===> triangle/midstream.scss +@use "upstream"; + +a {file: midstream} + +<===> triangle/upstream.scss +a {file: upstream} + +<===> triangle/output.css +a { + file: upstream; +} + +a { + file: midstream; +} + +a { + file: input; +} + +<===> +================================================================================ +<===> unrelated_branches/input.scss +@use "left_midstream"; +@use "right_midstream"; + +a {file: input} + +<===> unrelated_branches/left_midstream.scss +@use "left_upstream"; + +a {file: left midstream} + +<===> unrelated_branches/left_upstream.scss +a {file: left upstream} + +<===> unrelated_branches/right_midstream.scss +@use "right_upstream"; + +a {file: right midstream} + +<===> unrelated_branches/right_upstream.scss +a {file: right upstream} + +<===> unrelated_branches/output.css +a { + file: left upstream; +} + +a { + file: left midstream; +} + +a { + file: right upstream; +} + +a { + file: right midstream; +} + +a { + file: input; +} + +<===> +================================================================================ +<===> comment_order/sequence/comment_only/input.scss +/* before use in input */ +@use "midstream"; +/* after use in input */ + +<===> comment_order/sequence/comment_only/_midstream.scss +/* before use in midstream */ +@use "upstream"; +/* after use in midstream */ + +<===> comment_order/sequence/comment_only/_upstream.scss +/* in upstream */ + +<===> comment_order/sequence/comment_only/output.css +/* before use in input */ +/* before use in midstream */ +/* in upstream */ +/* after use in midstream */ +/* after use in input */ + +<===> +================================================================================ +<===> comment_order/sequence/comment_and_css/input.scss +/* before use in input */ +@use "midstream"; +/* after use in input */ +a {in: input} +/* after css in input */ + +<===> comment_order/sequence/comment_and_css/_midstream.scss +/* before use in midstream */ +@use "upstream"; +/* after use in midstream */ +a {in: midstream} +/* after css in midstream */ + +<===> comment_order/sequence/comment_and_css/_upstream.scss +/* before css in upstream */ +a {in: upstream} +/* after css in upstream */ + +<===> comment_order/sequence/comment_and_css/output.css +/* before use in input */ +/* before use in midstream */ +/* before css in upstream */ +a { + in: upstream; +} + +/* after css in upstream */ +/* after use in midstream */ +a { + in: midstream; +} + +/* after css in midstream */ +/* after use in input */ +a { + in: input; +} + +/* after css in input */ + +<===> +================================================================================ +<===> comment_order/sequence/comment_css_and_plain_import/input.scss +/* before use in input */ +@use "midstream"; +/* after use in input */ +@import "input.css"; +/* after import in input */ +a {in: input} +/* after css in input */ + +<===> comment_order/sequence/comment_css_and_plain_import/_midstream.scss +/* before use in midstream */ +@use "upstream"; +/* after use in midstream */ +@import "midstream.css"; +/* after import in input */ +a {in: midstream} +/* after css in midstream */ + +<===> comment_order/sequence/comment_css_and_plain_import/_upstream.scss +/* before css in upstream */ +@import "upstream.css"; +/* after import in upstream */ +a {in: upstream} +/* after css in upstream */ + +<===> comment_order/sequence/comment_css_and_plain_import/output.css +/* before use in input */ +/* before use in midstream */ +/* before css in upstream */ +@import "upstream.css"; +/* after use in midstream */ +@import "midstream.css"; +/* after use in input */ +@import "input.css"; +/* after import in upstream */ +a { + in: upstream; +} + +/* after css in upstream */ +/* after import in input */ +a { + in: midstream; +} + +/* after css in midstream */ +/* after import in input */ +a { + in: input; +} + +/* after css in input */ + +<===> +================================================================================ +<===> comment_order/diamond/comment_only/input.scss +/* before use in input */ +@use "left"; +/* between use in input */ +@use "right"; +/* after use in input */ + +<===> comment_order/diamond/comment_only/_left.scss +/* before use in left */ +@use "shared"; +/* after use in left */ + +<===> comment_order/diamond/comment_only/_right.scss +/* before use in right */ +@use "shared"; +/* after use in right */ + +<===> comment_order/diamond/comment_only/_shared.scss +/* in shared */ + +<===> comment_order/diamond/comment_only/output.css +/* before use in input */ +/* before use in left */ +/* in shared */ +/* after use in left */ +/* between use in input */ +/* before use in right */ +/* after use in right */ +/* after use in input */ diff --git a/spec/libsass-closed-issues/issue_1079.hrx b/spec/libsass-closed-issues/issue_1079.hrx index 72125730f0..8946c1e177 100644 --- a/spec/libsass-closed-issues/issue_1079.hrx +++ b/spec/libsass-closed-issues/issue_1079.hrx @@ -3,10 +3,10 @@ <===> error Error: expected selector. , -1 | hdr(2, 5){ color: #08c; } - | ^ +1 | #{hdr(2,5)} { color: #08c; } + | ^^^^^^^^ ' - input.scss 1:4 root stylesheet + input.scss 1:3 root stylesheet <===> error-libsass Error: Invalid CSS after "hdr": expected selector, was "(2, 5)" diff --git a/spec/libsass-closed-issues/issue_1452.hrx b/spec/libsass-closed-issues/issue_1452.hrx index a25ad7d47a..39358bf5af 100644 --- a/spec/libsass-closed-issues/issue_1452.hrx +++ b/spec/libsass-closed-issues/issue_1452.hrx @@ -7,7 +7,8 @@ foo { Error: () isn't a valid CSS value. , 2 | foo: foo(()); - | ^^ + | ^^ value + | ======= unknown function treated as plain CSS ' input.scss 2:12 root stylesheet diff --git a/spec/libsass-closed-issues/issue_1527/selector/first.hrx b/spec/libsass-closed-issues/issue_1527/selector/first.hrx index d6ad0f363d..2e816efd36 100644 --- a/spec/libsass-closed-issues/issue_1527/selector/first.hrx +++ b/spec/libsass-closed-issues/issue_1527/selector/first.hrx @@ -7,7 +7,7 @@ Error: Top-level selectors may not contain the parent selector "&". , 1 | & foo { - | ^^^^^^ + | ^ ' input.scss 1:1 root stylesheet diff --git a/spec/libsass-closed-issues/issue_1527/selector/last.hrx b/spec/libsass-closed-issues/issue_1527/selector/last.hrx index f2b50c5e09..d60e798b9b 100644 --- a/spec/libsass-closed-issues/issue_1527/selector/last.hrx +++ b/spec/libsass-closed-issues/issue_1527/selector/last.hrx @@ -7,9 +7,9 @@ foo & { Error: Top-level selectors may not contain the parent selector "&". , 1 | foo & { - | ^^^^^^ + | ^ ' - input.scss 1:1 root stylesheet + input.scss 1:5 root stylesheet <===> error-libsass Error: Top-level selectors may not contain the parent selector "&". diff --git a/spec/libsass-closed-issues/issue_1527/selector/only.hrx b/spec/libsass-closed-issues/issue_1527/selector/only.hrx index b620ffd119..ff34aec006 100644 --- a/spec/libsass-closed-issues/issue_1527/selector/only.hrx +++ b/spec/libsass-closed-issues/issue_1527/selector/only.hrx @@ -5,7 +5,7 @@ Error: Top-level selectors may not contain the parent selector "&". , 1 | & {} - | ^^ + | ^ ' input.scss 1:1 root stylesheet diff --git a/spec/libsass-closed-issues/issue_1569.hrx b/spec/libsass-closed-issues/issue_1569.hrx index 3b3c2ac052..0d3d1e7280 100644 --- a/spec/libsass-closed-issues/issue_1569.hrx +++ b/spec/libsass-closed-issues/issue_1569.hrx @@ -13,9 +13,9 @@ $common-border: "foo"; Error: Top-level selectors may not contain the parent selector "&". , 2 | .nihilo & { - | ^^^^^^^^^^ + | ^ ' - input.scss 2:1 root stylesheet + input.scss 2:9 root stylesheet <===> error-libsass Error: Top-level selectors may not contain the parent selector "&". diff --git a/spec/libsass-closed-issues/issue_1601.hrx b/spec/libsass-closed-issues/issue_1601.hrx index e6304c90ab..fa90e31fe2 100644 --- a/spec/libsass-closed-issues/issue_1601.hrx +++ b/spec/libsass-closed-issues/issue_1601.hrx @@ -5,12 +5,14 @@ } } <===> error -Error: Parent ".code.ruby >" is incompatible with this selector. +Error: Selector ".code.ruby >" can't be used as a parent in a compound selector. , +1 | .code.ruby > { + | ^^^^^^^^^^^^ outer selector 2 | &.ruby { - | ^^^^^^^ + | = parent selector ' - input.scss 2:5 root stylesheet + input.scss 1:1 root stylesheet <===> error-libsass Error: Invalid parent selector for "&.ruby": ".code.ruby >" diff --git a/spec/libsass-closed-issues/issue_1644/complex.hrx b/spec/libsass-closed-issues/issue_1644/complex.hrx index 3e05b51319..609e9e447e 100644 --- a/spec/libsass-closed-issues/issue_1644/complex.hrx +++ b/spec/libsass-closed-issues/issue_1644/complex.hrx @@ -38,11 +38,11 @@ $grid-breakpoints-immobile: ( Error: Top-level selectors may not contain the parent selector "&". , 30 | body.immobile & { - | ^^^^^^^^^^^^^^^^ + | ^ ' - input.scss 30:5 @content - input.scss 22:9 grid-media-query() - input.scss 29:3 root stylesheet + input.scss 30:19 @content + input.scss 22:9 grid-media-query() + input.scss 29:3 root stylesheet <===> error-libsass Error: Top-level selectors may not contain the parent selector "&". diff --git a/spec/libsass-closed-issues/issue_1644/mixin-parent.hrx b/spec/libsass-closed-issues/issue_1644/mixin-parent.hrx index 3ab059dfec..dea1623d18 100644 --- a/spec/libsass-closed-issues/issue_1644/mixin-parent.hrx +++ b/spec/libsass-closed-issues/issue_1644/mixin-parent.hrx @@ -13,11 +13,11 @@ Error: Top-level selectors may not contain the parent selector "&". , 6 | body.immobile & { - | ^^^^^^^^^^^^^^^^ + | ^ ' - input.scss 6:3 @content - input.scss 2:3 parent() - input.scss 5:1 root stylesheet + input.scss 6:17 @content + input.scss 2:3 parent() + input.scss 5:1 root stylesheet <===> error-libsass Error: Top-level selectors may not contain the parent selector "&". diff --git a/spec/libsass-closed-issues/issue_1822.hrx b/spec/libsass-closed-issues/issue_1822.hrx index 82156eae26..3a04e23308 100644 --- a/spec/libsass-closed-issues/issue_1822.hrx +++ b/spec/libsass-closed-issues/issue_1822.hrx @@ -8,7 +8,7 @@ <===> error Error: "&" may only used at the beginning of a compound selector. , -2 | .open&{ +2 | .open& { | ^ ' input.scss 2:10 root stylesheet diff --git a/spec/libsass-closed-issues/issue_1923.hrx b/spec/libsass-closed-issues/issue_1923.hrx index 6fe816a11e..f3fef79e08 100644 --- a/spec/libsass-closed-issues/issue_1923.hrx +++ b/spec/libsass-closed-issues/issue_1923.hrx @@ -25,7 +25,9 @@ You may not @extend selectors across media queries. 13 | @extend %btnBase; | ^^^^^^^^^^^^^^^^ ' - input.scss 13:5 root stylesheet + input.scss 13:5 @content + input.scss 7:5 mobile() + input.scss 11:1 root stylesheet <===> error-libsass Error: You may not @extend selectors across media queries. diff --git a/spec/libsass-closed-issues/issue_2023/id-selector-id.hrx b/spec/libsass-closed-issues/issue_2023/id-selector-id.hrx index 945e6866a1..6921d73239 100644 --- a/spec/libsass-closed-issues/issue_2023/id-selector-id.hrx +++ b/spec/libsass-closed-issues/issue_2023/id-selector-id.hrx @@ -11,7 +11,7 @@ <===> error Error: Expected identifier. , -1 | #2b{ +1 | #2b { | ^ ' input.scss 1:2 root stylesheet diff --git a/spec/libsass-closed-issues/issue_2023/id-selector-nr.hrx b/spec/libsass-closed-issues/issue_2023/id-selector-nr.hrx index d4f0794601..61cb068993 100644 --- a/spec/libsass-closed-issues/issue_2023/id-selector-nr.hrx +++ b/spec/libsass-closed-issues/issue_2023/id-selector-nr.hrx @@ -11,7 +11,7 @@ <===> error Error: Expected identifier. , -1 | #2{ +1 | #2 { | ^ ' input.scss 1:2 root stylesheet diff --git a/spec/libsass-closed-issues/issue_2023/pseudo-selector-id.hrx b/spec/libsass-closed-issues/issue_2023/pseudo-selector-id.hrx index e2e6c92858..92dd8b3f46 100644 --- a/spec/libsass-closed-issues/issue_2023/pseudo-selector-id.hrx +++ b/spec/libsass-closed-issues/issue_2023/pseudo-selector-id.hrx @@ -11,7 +11,7 @@ <===> error Error: Expected identifier. , -1 | #4d{ +1 | #4d { | ^ ' input.scss 1:2 root stylesheet diff --git a/spec/libsass-closed-issues/issue_2023/pseudo-selector-nr.hrx b/spec/libsass-closed-issues/issue_2023/pseudo-selector-nr.hrx index 1b0c7129bc..9b62e9dbfc 100644 --- a/spec/libsass-closed-issues/issue_2023/pseudo-selector-nr.hrx +++ b/spec/libsass-closed-issues/issue_2023/pseudo-selector-nr.hrx @@ -11,7 +11,7 @@ <===> error Error: Expected identifier. , -1 | #4{ +1 | #4 { | ^ ' input.scss 1:2 root stylesheet diff --git a/spec/libsass-closed-issues/issue_2155.hrx b/spec/libsass-closed-issues/issue_2155.hrx index 60e2896f89..8376fc1399 100644 --- a/spec/libsass-closed-issues/issue_2155.hrx +++ b/spec/libsass-closed-issues/issue_2155.hrx @@ -18,11 +18,15 @@ If you really want to use the color value here, use '"" + #ff0'. input.scss 2:7 root stylesheet Error: Expected identifier. + ,--> input.scss +2 | &.#{#ff0} { + | ^^^^ + ' , -2 | &.#ff0{ - | ^ +1 | &.#ff0 + | = error in interpolated output ' - input.scss 2:5 root stylesheet + input.scss 2:7 root stylesheet <===> error-libsass Error: Invalid CSS after "&": expected selector, was ".#ff0" diff --git a/spec/libsass-closed-issues/issue_2175.hrx b/spec/libsass-closed-issues/issue_2175.hrx index aedddd2414..da0e0b54f4 100644 --- a/spec/libsass-closed-issues/issue_2175.hrx +++ b/spec/libsass-closed-issues/issue_2175.hrx @@ -6,7 +6,7 @@ a:nth-child() { <===> error Error: Expected "n". , -1 | a:nth-child(){ +1 | a:nth-child() { | ^ ' input.scss 1:13 root stylesheet diff --git a/spec/libsass-closed-issues/issue_2260/no-parent-with-compound.hrx b/spec/libsass-closed-issues/issue_2260/no-parent-with-compound.hrx index 78c71e1ffd..b6e5e3cb1d 100644 --- a/spec/libsass-closed-issues/issue_2260/no-parent-with-compound.hrx +++ b/spec/libsass-closed-issues/issue_2260/no-parent-with-compound.hrx @@ -15,9 +15,9 @@ Error: Top-level selectors may not contain the parent selector "&". , 8 | .test & { - | ^^^^^^^^ + | ^ ' - input.scss 8:3 @content + input.scss 8:9 @content input.scss 3:5 test() input.scss 7:1 root stylesheet diff --git a/spec/libsass-closed-issues/issue_2304.hrx b/spec/libsass-closed-issues/issue_2304.hrx index 474f7864b9..f94bbf9625 100644 --- a/spec/libsass-closed-issues/issue_2304.hrx +++ b/spec/libsass-closed-issues/issue_2304.hrx @@ -12,9 +12,9 @@ Error: Top-level selectors may not contain the parent selector "&". , 1 | .foo, & { - | ^^^^^^^^ + | ^ ' - _module.scss 1:1 @import + _module.scss 1:7 @import input.scss 1:9 root stylesheet <===> error-libsass diff --git a/spec/libsass-closed-issues/issue_2482.hrx b/spec/libsass-closed-issues/issue_2482.hrx index 9a3aa67984..554ec5b1f9 100644 --- a/spec/libsass-closed-issues/issue_2482.hrx +++ b/spec/libsass-closed-issues/issue_2482.hrx @@ -11,9 +11,8 @@ <===> error Error: Top-level selectors may not contain the parent selector "&". , -3 | / & .class -4 | | { - | '----^ +3 | & .class + | ^ ' input.scss 3:2 mixin() input.scss 9:1 root stylesheet diff --git a/spec/libsass-closed-issues/issue_439.hrx b/spec/libsass-closed-issues/issue_439.hrx index bb06b3596b..b71909243c 100644 --- a/spec/libsass-closed-issues/issue_439.hrx +++ b/spec/libsass-closed-issues/issue_439.hrx @@ -26,7 +26,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 6 | #{$selector} { @extend %#{$placeholder}; } - | ^^^^^^^^^^^^^ invalid selector + | ^^^^^^^^^^^^ invalid selector | ======================== @extend rule ' input.scss 6:5 odd() diff --git a/spec/libsass-closed-issues/issue_759.hrx b/spec/libsass-closed-issues/issue_759.hrx index 8ed5710418..1725eaff00 100644 --- a/spec/libsass-closed-issues/issue_759.hrx +++ b/spec/libsass-closed-issues/issue_759.hrx @@ -28,6 +28,102 @@ foo { } <===> warning +DEPRECATION WARNING on line 3, column 19 of input.scss: +!default should only be written once for each variable. +This will be an error in Dart Sass 2.0.0. + , +3 | $c: 30px !default !default !default !global !global !global; + | ^^^^^^^^ + ' + +DEPRECATION WARNING on line 3, column 28 of input.scss: +!default should only be written once for each variable. +This will be an error in Dart Sass 2.0.0. + , +3 | $c: 30px !default !default !default !global !global !global; + | ^^^^^^^^ + ' + +DEPRECATION WARNING on line 3, column 45 of input.scss: +!global should only be written once for each variable. +This will be an error in Dart Sass 2.0.0. + , +3 | $c: 30px !default !default !default !global !global !global; + | ^^^^^^^ + ' + +DEPRECATION WARNING on line 3, column 53 of input.scss: +!global should only be written once for each variable. +This will be an error in Dart Sass 2.0.0. + , +3 | $c: 30px !default !default !default !global !global !global; + | ^^^^^^^ + ' + +DEPRECATION WARNING on line 4, column 18 of input.scss: +!global should only be written once for each variable. +This will be an error in Dart Sass 2.0.0. + , +4 | $d: 40px !global !global !global !default !default !default; + | ^^^^^^^ + ' + +DEPRECATION WARNING on line 4, column 26 of input.scss: +!global should only be written once for each variable. +This will be an error in Dart Sass 2.0.0. + , +4 | $d: 40px !global !global !global !default !default !default; + | ^^^^^^^ + ' + +DEPRECATION WARNING on line 4, column 43 of input.scss: +!default should only be written once for each variable. +This will be an error in Dart Sass 2.0.0. + , +4 | $d: 40px !global !global !global !default !default !default; + | ^^^^^^^^ + ' + +DEPRECATION WARNING on line 4, column 52 of input.scss: +!default should only be written once for each variable. +This will be an error in Dart Sass 2.0.0. + , +4 | $d: 40px !global !global !global !default !default !default; + | ^^^^^^^^ + ' + +DEPRECATION WARNING on line 5, column 27 of input.scss: +!global should only be written once for each variable. +This will be an error in Dart Sass 2.0.0. + , +5 | $e: 50px !global !default !global !default !global !default; + | ^^^^^^^ + ' + +DEPRECATION WARNING on line 5, column 35 of input.scss: +!default should only be written once for each variable. +This will be an error in Dart Sass 2.0.0. + , +5 | $e: 50px !global !default !global !default !global !default; + | ^^^^^^^^ + ' + +DEPRECATION WARNING on line 5, column 44 of input.scss: +!global should only be written once for each variable. +This will be an error in Dart Sass 2.0.0. + , +5 | $e: 50px !global !default !global !default !global !default; + | ^^^^^^^ + ' + +DEPRECATION WARNING on line 5, column 52 of input.scss: +!default should only be written once for each variable. +This will be an error in Dart Sass 2.0.0. + , +5 | $e: 50px !global !default !global !default !global !default; + | ^^^^^^^^ + ' + DEPRECATION WARNING: As of Dart Sass 2.0.0, !global assignments won't be able to declare new variables. Since this assignment is at the root of the stylesheet, the !global flag is diff --git a/spec/libsass-todo-issues/issue_2023/class-selector-id.hrx b/spec/libsass-todo-issues/issue_2023/class-selector-id.hrx index c8de9ecafb..0b3f728696 100644 --- a/spec/libsass-todo-issues/issue_2023/class-selector-id.hrx +++ b/spec/libsass-todo-issues/issue_2023/class-selector-id.hrx @@ -6,7 +6,7 @@ <===> error Error: Expected identifier. , -1 | .3c{ +1 | .3c { | ^ ' input.scss 1:2 root stylesheet diff --git a/spec/libsass-todo-issues/issue_2023/class-selector-nr.hrx b/spec/libsass-todo-issues/issue_2023/class-selector-nr.hrx index a3f3f7793f..6f54284fab 100644 --- a/spec/libsass-todo-issues/issue_2023/class-selector-nr.hrx +++ b/spec/libsass-todo-issues/issue_2023/class-selector-nr.hrx @@ -6,7 +6,7 @@ <===> error Error: Expected identifier. , -1 | .3{ +1 | .3 { | ^ ' input.scss 1:2 root stylesheet diff --git a/spec/libsass-todo-issues/issue_2023/type-selector-id.hrx b/spec/libsass-todo-issues/issue_2023/type-selector-id.hrx index a5676a4bd1..f085a35223 100644 --- a/spec/libsass-todo-issues/issue_2023/type-selector-id.hrx +++ b/spec/libsass-todo-issues/issue_2023/type-selector-id.hrx @@ -6,7 +6,7 @@ <===> error Error: expected selector. , -1 | 1a{ +1 | 1a { | ^ ' input.scss 1:1 root stylesheet diff --git a/spec/libsass-todo-issues/issue_2023/type-selector-nr.hrx b/spec/libsass-todo-issues/issue_2023/type-selector-nr.hrx index 95f453c8fd..041a9e62c4 100644 --- a/spec/libsass-todo-issues/issue_2023/type-selector-nr.hrx +++ b/spec/libsass-todo-issues/issue_2023/type-selector-nr.hrx @@ -6,7 +6,7 @@ <===> error Error: expected selector. , -1 | 1{ +1 | 1 { | ^ ' input.scss 1:1 root stylesheet diff --git a/spec/libsass-todo-issues/issue_238764.hrx b/spec/libsass-todo-issues/issue_238764.hrx index 56fe0dca25..1dee037362 100644 --- a/spec/libsass-todo-issues/issue_238764.hrx +++ b/spec/libsass-todo-issues/issue_238764.hrx @@ -9,7 +9,7 @@ <===> error Error: expected selector. , -2 | @at-root @bar{a: b} +2 | @at-root @bar {a: b} | ^ ' input.scss 2:12 bar() diff --git a/spec/libsass/base-level-parent/imported/at-root-alone-itpl.hrx b/spec/libsass/base-level-parent/imported/at-root-alone-itpl.hrx index 6f324fc3aa..afe21c6aa1 100644 --- a/spec/libsass/base-level-parent/imported/at-root-alone-itpl.hrx +++ b/spec/libsass/base-level-parent/imported/at-root-alone-itpl.hrx @@ -12,10 +12,10 @@ <===> error Error: expected selector. , -2 | { - | ^ +2 | #{&} { + | ^ ' - include.scss 2:3 @import + include.scss 2:8 @import input.scss 1:9 root stylesheet <===> error-libsass diff --git a/spec/libsass/base-level-parent/imported/at-root-alone.hrx b/spec/libsass/base-level-parent/imported/at-root-alone.hrx index 32b85ffe71..ab2f462d46 100644 --- a/spec/libsass/base-level-parent/imported/at-root-alone.hrx +++ b/spec/libsass/base-level-parent/imported/at-root-alone.hrx @@ -12,7 +12,7 @@ Error: Top-level selectors may not contain the parent selector "&". , 2 | & { - | ^^ + | ^ ' include.scss 2:3 @import input.scss 1:9 root stylesheet diff --git a/spec/libsass/base-level-parent/imported/at-root-postfix.hrx b/spec/libsass/base-level-parent/imported/at-root-postfix.hrx index 82d019d1c4..9401add08c 100644 --- a/spec/libsass/base-level-parent/imported/at-root-postfix.hrx +++ b/spec/libsass/base-level-parent/imported/at-root-postfix.hrx @@ -12,7 +12,7 @@ Error: Top-level selectors may not contain the parent selector "&". , 2 | &post { - | ^^^^^^ + | ^^^^^ ' include.scss 2:3 @import input.scss 1:9 root stylesheet diff --git a/spec/libsass/base-level-parent/imported/at-root-prefix.hrx b/spec/libsass/base-level-parent/imported/at-root-prefix.hrx index 0e71cc6565..7670542a5f 100644 --- a/spec/libsass/base-level-parent/imported/at-root-prefix.hrx +++ b/spec/libsass/base-level-parent/imported/at-root-prefix.hrx @@ -11,7 +11,7 @@ <===> error Error: "&" may only used at the beginning of a compound selector. , -2 | pre&{ +2 | pre& { | ^ ' include.scss 2:6 @import diff --git a/spec/libsass/base-level-parent/imported/basic-alone-itpl.hrx b/spec/libsass/base-level-parent/imported/basic-alone-itpl.hrx index b30cfc63f8..3d6b9a34d2 100644 --- a/spec/libsass/base-level-parent/imported/basic-alone-itpl.hrx +++ b/spec/libsass/base-level-parent/imported/basic-alone-itpl.hrx @@ -10,10 +10,10 @@ <===> error Error: expected selector. , -1 | { - | ^ +1 | #{&} { + | ^ ' - include.scss 1:1 @import + include.scss 1:6 @import input.scss 1:9 root stylesheet <===> error-libsass diff --git a/spec/libsass/base-level-parent/imported/basic-alone.hrx b/spec/libsass/base-level-parent/imported/basic-alone.hrx index de1004e730..85ef5f839b 100644 --- a/spec/libsass/base-level-parent/imported/basic-alone.hrx +++ b/spec/libsass/base-level-parent/imported/basic-alone.hrx @@ -11,7 +11,7 @@ Error: Top-level selectors may not contain the parent selector "&". , 1 | & { - | ^^ + | ^ ' include.scss 1:1 @import input.scss 1:9 root stylesheet diff --git a/spec/libsass/base-level-parent/imported/basic-postfix.hrx b/spec/libsass/base-level-parent/imported/basic-postfix.hrx index 5453a4f434..4e1263edf9 100644 --- a/spec/libsass/base-level-parent/imported/basic-postfix.hrx +++ b/spec/libsass/base-level-parent/imported/basic-postfix.hrx @@ -10,7 +10,7 @@ Error: Top-level selectors may not contain the parent selector "&". , 1 | &post { - | ^^^^^^ + | ^^^^^ ' include.scss 1:1 @import input.scss 1:9 root stylesheet diff --git a/spec/libsass/base-level-parent/imported/basic-prefix.hrx b/spec/libsass/base-level-parent/imported/basic-prefix.hrx index 962ca6e8da..0a96021562 100644 --- a/spec/libsass/base-level-parent/imported/basic-prefix.hrx +++ b/spec/libsass/base-level-parent/imported/basic-prefix.hrx @@ -9,7 +9,7 @@ pre& { <===> error Error: "&" may only used at the beginning of a compound selector. , -1 | pre&{ +1 | pre& { | ^ ' include.scss 1:4 @import diff --git a/spec/libsass/base-level-parent/nested/at-root-prefix.hrx b/spec/libsass/base-level-parent/nested/at-root-prefix.hrx index 045760caf4..69e974fc09 100644 --- a/spec/libsass/base-level-parent/nested/at-root-prefix.hrx +++ b/spec/libsass/base-level-parent/nested/at-root-prefix.hrx @@ -11,7 +11,7 @@ test{ <===> error Error: "&" may only used at the beginning of a compound selector. , -3 | pre&{ +3 | pre& { | ^ ' input.scss 3:8 root stylesheet diff --git a/spec/libsass/base-level-parent/nested/basic-prefix.hrx b/spec/libsass/base-level-parent/nested/basic-prefix.hrx index 7dd0bb6fe2..b67da45243 100644 --- a/spec/libsass/base-level-parent/nested/basic-prefix.hrx +++ b/spec/libsass/base-level-parent/nested/basic-prefix.hrx @@ -9,7 +9,7 @@ test { <===> error Error: "&" may only used at the beginning of a compound selector. , -2 | pre&{ +2 | pre& { | ^ ' input.scss 2:6 root stylesheet diff --git a/spec/libsass/base-level-parent/root/at-root-alone-itpl.hrx b/spec/libsass/base-level-parent/root/at-root-alone-itpl.hrx index 97b35f0ea8..0988d4e503 100644 --- a/spec/libsass/base-level-parent/root/at-root-alone-itpl.hrx +++ b/spec/libsass/base-level-parent/root/at-root-alone-itpl.hrx @@ -10,10 +10,10 @@ <===> error Error: expected selector. , -2 | { - | ^ +2 | #{&} { + | ^ ' - input.scss 2:3 root stylesheet + input.scss 2:8 root stylesheet <===> error-libsass Error: Invalid CSS after "": expected selector, was "" diff --git a/spec/libsass/base-level-parent/root/at-root-alone.hrx b/spec/libsass/base-level-parent/root/at-root-alone.hrx index 1d743079e7..54b99ecb4d 100644 --- a/spec/libsass/base-level-parent/root/at-root-alone.hrx +++ b/spec/libsass/base-level-parent/root/at-root-alone.hrx @@ -10,7 +10,7 @@ Error: Top-level selectors may not contain the parent selector "&". , 2 | & { - | ^^ + | ^ ' input.scss 2:3 root stylesheet diff --git a/spec/libsass/base-level-parent/root/at-root-postfix.hrx b/spec/libsass/base-level-parent/root/at-root-postfix.hrx index b81e0c2d9b..a843b6e9d5 100644 --- a/spec/libsass/base-level-parent/root/at-root-postfix.hrx +++ b/spec/libsass/base-level-parent/root/at-root-postfix.hrx @@ -10,7 +10,7 @@ Error: Top-level selectors may not contain the parent selector "&". , 2 | &post { - | ^^^^^^ + | ^^^^^ ' input.scss 2:3 root stylesheet diff --git a/spec/libsass/base-level-parent/root/at-root-prefix.hrx b/spec/libsass/base-level-parent/root/at-root-prefix.hrx index b01a14a87a..d46e7ac0a2 100644 --- a/spec/libsass/base-level-parent/root/at-root-prefix.hrx +++ b/spec/libsass/base-level-parent/root/at-root-prefix.hrx @@ -9,7 +9,7 @@ <===> error Error: "&" may only used at the beginning of a compound selector. , -2 | pre&{ +2 | pre& { | ^ ' input.scss 2:6 root stylesheet diff --git a/spec/libsass/base-level-parent/root/basic-alone-itpl.hrx b/spec/libsass/base-level-parent/root/basic-alone-itpl.hrx index 148dfd4562..38393494fc 100644 --- a/spec/libsass/base-level-parent/root/basic-alone-itpl.hrx +++ b/spec/libsass/base-level-parent/root/basic-alone-itpl.hrx @@ -8,10 +8,10 @@ <===> error Error: expected selector. , -1 | { - | ^ +1 | #{&} { + | ^ ' - input.scss 1:1 root stylesheet + input.scss 1:6 root stylesheet <===> error-libsass Error: Invalid CSS after "": expected selector, was "" diff --git a/spec/libsass/base-level-parent/root/basic-alone.hrx b/spec/libsass/base-level-parent/root/basic-alone.hrx index 5a156ccc94..5d8be3d2e4 100644 --- a/spec/libsass/base-level-parent/root/basic-alone.hrx +++ b/spec/libsass/base-level-parent/root/basic-alone.hrx @@ -9,7 +9,7 @@ Error: Top-level selectors may not contain the parent selector "&". , 1 | & { - | ^^ + | ^ ' input.scss 1:1 root stylesheet diff --git a/spec/libsass/base-level-parent/root/basic-postfix.hrx b/spec/libsass/base-level-parent/root/basic-postfix.hrx index 072b7652af..d6934ce596 100644 --- a/spec/libsass/base-level-parent/root/basic-postfix.hrx +++ b/spec/libsass/base-level-parent/root/basic-postfix.hrx @@ -8,7 +8,7 @@ Error: Top-level selectors may not contain the parent selector "&". , 1 | &post { - | ^^^^^^ + | ^^^^^ ' input.scss 1:1 root stylesheet diff --git a/spec/libsass/base-level-parent/root/basic-prefix.hrx b/spec/libsass/base-level-parent/root/basic-prefix.hrx index a539fe64d0..41780917cf 100644 --- a/spec/libsass/base-level-parent/root/basic-prefix.hrx +++ b/spec/libsass/base-level-parent/root/basic-prefix.hrx @@ -7,7 +7,7 @@ pre& { <===> error Error: "&" may only used at the beginning of a compound selector. , -1 | pre&{ +1 | pre& { | ^ ' input.scss 1:4 root stylesheet diff --git a/spec/libsass/bourbon.hrx b/spec/libsass/bourbon.hrx index 356dcdb0d7..618ca9fb4f 100644 --- a/spec/libsass/bourbon.hrx +++ b/spec/libsass/bourbon.hrx @@ -1926,8 +1926,8 @@ div { background-image: url("/images/a.png"), url("images/b.png"); background-image: url("/images/a.png"), -webkit-linear-gradient(white 0, yellow 50%, transparent 50%); background-image: url("/images/a.png"), linear-gradient( white 0, yellow 50%, transparent 50%); - background-image: -webkit-linear-gradient(hsla(0deg, 100%, 100%, 0.25) 0%, hsla(0deg, 100%, 100%, 0.08) 50%, transparent 50%), -webkit-linear-gradient(#4e7ba3, rgb(61.5619834711, 97.0785123967, 129.4380165289)); - background-image: linear-gradient( hsla(0deg, 100%, 100%, 0.25) 0%, hsla(0deg, 100%, 100%, 0.08) 50%, transparent 50%), linear-gradient( #4e7ba3, rgb(61.5619834711, 97.0785123967, 129.4380165289)); + background-image: -webkit-linear-gradient(hsla(0, 100%, 100%, 0.25) 0%, hsla(0, 100%, 100%, 0.08) 50%, transparent 50%), -webkit-linear-gradient(#4e7ba3, rgb(61.5619834711, 97.0785123967, 129.4380165289)); + background-image: linear-gradient( hsla(0, 100%, 100%, 0.25) 0%, hsla(0, 100%, 100%, 0.08) 50%, transparent 50%), linear-gradient( #4e7ba3, rgb(61.5619834711, 97.0785123967, 129.4380165289)); background-image: -webkit-url("/images/a.png")-gradient(center), -webkit-url("images/b.png")-gradient(left); background-image: url("/images/a.png")-gradient( center), url("images/b.png")-gradient( left); } diff --git a/spec/libsass/color-functions/saturate.hrx b/spec/libsass/color-functions/saturate.hrx index 4c6464a824..648cbf6855 100644 --- a/spec/libsass/color-functions/saturate.hrx +++ b/spec/libsass/color-functions/saturate.hrx @@ -109,105 +109,105 @@ foo { <===> output.css foo { - c0: hsl(100deg, 0%, 50%); - c1: hsl(100deg, 1%, 50%); - c2: hsl(100deg, 2%, 50%); - c3: hsl(100deg, 3%, 50%); - c4: hsl(100deg, 4%, 50%); - c5: hsl(100deg, 5%, 50%); - c6: hsl(100deg, 6%, 50%); - c7: hsl(100deg, 7%, 50%); - c8: hsl(100deg, 8%, 50%); - c9: hsl(100deg, 9%, 50%); - c10: hsl(100deg, 10%, 50%); - c11: hsl(100deg, 11%, 50%); - c12: hsl(100deg, 12%, 50%); - c13: hsl(100deg, 13%, 50%); - c14: hsl(100deg, 14%, 50%); - c15: hsl(100deg, 15%, 50%); - c16: hsl(100deg, 16%, 50%); - c17: hsl(100deg, 17%, 50%); - c18: hsl(100deg, 18%, 50%); - c19: hsl(100deg, 19%, 50%); - c20: hsl(100deg, 20%, 50%); - c21: hsl(100deg, 21%, 50%); - c22: hsl(100deg, 22%, 50%); - c23: hsl(100deg, 23%, 50%); - c24: hsl(100deg, 24%, 50%); - c25: hsl(100deg, 25%, 50%); - c26: hsl(100deg, 26%, 50%); - c27: hsl(100deg, 27%, 50%); - c28: hsl(100deg, 28%, 50%); - c29: hsl(100deg, 29%, 50%); - c30: hsl(100deg, 30%, 50%); - c31: hsl(100deg, 31%, 50%); - c32: hsl(100deg, 32%, 50%); - c33: hsl(100deg, 33%, 50%); - c34: hsl(100deg, 34%, 50%); - c35: hsl(100deg, 35%, 50%); - c36: hsl(100deg, 36%, 50%); - c37: hsl(100deg, 37%, 50%); - c38: hsl(100deg, 38%, 50%); - c39: hsl(100deg, 39%, 50%); - c41: hsl(100deg, 41%, 50%); - c42: hsl(100deg, 42%, 50%); - c43: hsl(100deg, 43%, 50%); - c44: hsl(100deg, 44%, 50%); - c45: hsl(100deg, 45%, 50%); - c46: hsl(100deg, 46%, 50%); - c47: hsl(100deg, 47%, 50%); - c48: hsl(100deg, 48%, 50%); - c49: hsl(100deg, 49%, 50%); - c50: hsl(100deg, 50%, 50%); - c51: hsl(100deg, 51%, 50%); - c52: hsl(100deg, 52%, 50%); - c53: hsl(100deg, 53%, 50%); - c54: hsl(100deg, 54%, 50%); - c55: hsl(100deg, 55%, 50%); - c56: hsl(100deg, 56%, 50%); - c57: hsl(100deg, 57%, 50%); - c58: hsl(100deg, 58%, 50%); - c59: hsl(100deg, 59%, 50%); - c60: hsl(100deg, 60%, 50%); - c61: hsl(100deg, 61%, 50%); - c62: hsl(100deg, 62%, 50%); - c63: hsl(100deg, 63%, 50%); - c64: hsl(100deg, 64%, 50%); - c65: hsl(100deg, 65%, 50%); - c66: hsl(100deg, 66%, 50%); - c67: hsl(100deg, 67%, 50%); - c68: hsl(100deg, 68%, 50%); - c69: hsl(100deg, 69%, 50%); - c70: hsl(100deg, 70%, 50%); - c71: hsl(100deg, 71%, 50%); - c72: hsl(100deg, 72%, 50%); - c73: hsl(100deg, 73%, 50%); - c74: hsl(100deg, 74%, 50%); - c75: hsl(100deg, 75%, 50%); - c76: hsl(100deg, 76%, 50%); - c77: hsl(100deg, 77%, 50%); - c78: hsl(100deg, 78%, 50%); - c79: hsl(100deg, 79%, 50%); - c81: hsl(100deg, 81%, 50%); - c82: hsl(100deg, 82%, 50%); - c83: hsl(100deg, 83%, 50%); - c84: hsl(100deg, 84%, 50%); - c85: hsl(100deg, 85%, 50%); - c86: hsl(100deg, 86%, 50%); - c87: hsl(100deg, 87%, 50%); - c88: hsl(100deg, 88%, 50%); - c89: hsl(100deg, 89%, 50%); - c90: hsl(100deg, 90%, 50%); - c91: hsl(100deg, 91%, 50%); - c92: hsl(100deg, 92%, 50%); - c93: hsl(100deg, 93%, 50%); - c94: hsl(100deg, 94%, 50%); - c95: hsl(100deg, 95%, 50%); - c96: hsl(100deg, 96%, 50%); - c97: hsl(100deg, 97%, 50%); - c98: hsl(100deg, 98%, 50%); - c99: hsl(100deg, 99%, 50%); - c100: hsl(100deg, 100%, 50%); + c0: hsl(100, 0%, 50%); + c1: hsl(100, 1%, 50%); + c2: hsl(100, 2%, 50%); + c3: hsl(100, 3%, 50%); + c4: hsl(100, 4%, 50%); + c5: hsl(100, 5%, 50%); + c6: hsl(100, 6%, 50%); + c7: hsl(100, 7%, 50%); + c8: hsl(100, 8%, 50%); + c9: hsl(100, 9%, 50%); + c10: hsl(100, 10%, 50%); + c11: hsl(100, 11%, 50%); + c12: hsl(100, 12%, 50%); + c13: hsl(100, 13%, 50%); + c14: hsl(100, 14%, 50%); + c15: hsl(100, 15%, 50%); + c16: hsl(100, 16%, 50%); + c17: hsl(100, 17%, 50%); + c18: hsl(100, 18%, 50%); + c19: hsl(100, 19%, 50%); + c20: hsl(100, 20%, 50%); + c21: hsl(100, 21%, 50%); + c22: hsl(100, 22%, 50%); + c23: hsl(100, 23%, 50%); + c24: hsl(100, 24%, 50%); + c25: hsl(100, 25%, 50%); + c26: hsl(100, 26%, 50%); + c27: hsl(100, 27%, 50%); + c28: hsl(100, 28%, 50%); + c29: hsl(100, 29%, 50%); + c30: hsl(100, 30%, 50%); + c31: hsl(100, 31%, 50%); + c32: hsl(100, 32%, 50%); + c33: hsl(100, 33%, 50%); + c34: hsl(100, 34%, 50%); + c35: hsl(100, 35%, 50%); + c36: hsl(100, 36%, 50%); + c37: hsl(100, 37%, 50%); + c38: hsl(100, 38%, 50%); + c39: hsl(100, 39%, 50%); + c41: hsl(100, 41%, 50%); + c42: hsl(100, 42%, 50%); + c43: hsl(100, 43%, 50%); + c44: hsl(100, 44%, 50%); + c45: hsl(100, 45%, 50%); + c46: hsl(100, 46%, 50%); + c47: hsl(100, 47%, 50%); + c48: hsl(100, 48%, 50%); + c49: hsl(100, 49%, 50%); + c50: hsl(100, 50%, 50%); + c51: hsl(100, 51%, 50%); + c52: hsl(100, 52%, 50%); + c53: hsl(100, 53%, 50%); + c54: hsl(100, 54%, 50%); + c55: hsl(100, 55%, 50%); + c56: hsl(100, 56%, 50%); + c57: hsl(100, 57%, 50%); + c58: hsl(100, 58%, 50%); + c59: hsl(100, 59%, 50%); + c60: hsl(100, 60%, 50%); + c61: hsl(100, 61%, 50%); + c62: hsl(100, 62%, 50%); + c63: hsl(100, 63%, 50%); + c64: hsl(100, 64%, 50%); + c65: hsl(100, 65%, 50%); + c66: hsl(100, 66%, 50%); + c67: hsl(100, 67%, 50%); + c68: hsl(100, 68%, 50%); + c69: hsl(100, 69%, 50%); + c70: hsl(100, 70%, 50%); + c71: hsl(100, 71%, 50%); + c72: hsl(100, 72%, 50%); + c73: hsl(100, 73%, 50%); + c74: hsl(100, 74%, 50%); + c75: hsl(100, 75%, 50%); + c76: hsl(100, 76%, 50%); + c77: hsl(100, 77%, 50%); + c78: hsl(100, 78%, 50%); + c79: hsl(100, 79%, 50%); + c81: hsl(100, 81%, 50%); + c82: hsl(100, 82%, 50%); + c83: hsl(100, 83%, 50%); + c84: hsl(100, 84%, 50%); + c85: hsl(100, 85%, 50%); + c86: hsl(100, 86%, 50%); + c87: hsl(100, 87%, 50%); + c88: hsl(100, 88%, 50%); + c89: hsl(100, 89%, 50%); + c90: hsl(100, 90%, 50%); + c91: hsl(100, 91%, 50%); + c92: hsl(100, 92%, 50%); + c93: hsl(100, 93%, 50%); + c94: hsl(100, 94%, 50%); + c95: hsl(100, 95%, 50%); + c96: hsl(100, 96%, 50%); + c97: hsl(100, 97%, 50%); + c98: hsl(100, 98%, 50%); + c99: hsl(100, 99%, 50%); + c100: hsl(100, 100%, 50%); } <===> output-libsass.css diff --git a/spec/libsass/parent-selector/missing.hrx b/spec/libsass/parent-selector/missing.hrx index 6b90a58381..e396f96df4 100644 --- a/spec/libsass/parent-selector/missing.hrx +++ b/spec/libsass/parent-selector/missing.hrx @@ -38,11 +38,11 @@ $grid-breakpoints-immobile: ( Error: Top-level selectors may not contain the parent selector "&". , 30 | body.immobile & { - | ^^^^^^^^^^^^^^^^ + | ^ ' - input.scss 30:5 @content - input.scss 22:9 grid-media-query() - input.scss 29:3 root stylesheet + input.scss 30:19 @content + input.scss 22:9 grid-media-query() + input.scss 29:3 root stylesheet <===> error-libsass Error: Top-level selectors may not contain the parent selector "&". diff --git a/spec/libsass/test.hrx b/spec/libsass/test.hrx index 6d10939b86..28d48a230c 100644 --- a/spec/libsass/test.hrx +++ b/spec/libsass/test.hrx @@ -107,10 +107,10 @@ span { e: a b c d e f; f: #102005; g: #782005; - h: hsl(25deg, 100%, 80%); + h: hsl(25, 100%, 80%); h: rgba(204, 86, 0, 0.8); - h: hsla(25deg, 100%, 40%, 0.8); - i: hsla(25deg, 100%, 40%, 0.8); + h: hsla(25, 100%, 40%, 0.8); + i: hsla(25, 100%, 40%, 0.8); foo: url("http://blah/flah/grah"); foo: url(http://foo/bar/buzz.css); foo: url(hey4ho.css); diff --git a/spec/non_conformant/basic/15_arithmetic_and_lists.hrx b/spec/non_conformant/basic/15_arithmetic_and_lists.hrx index 171fefc4a5..40a7a04245 100644 --- a/spec/non_conformant/basic/15_arithmetic_and_lists.hrx +++ b/spec/non_conformant/basic/15_arithmetic_and_lists.hrx @@ -72,10 +72,10 @@ div { r: 64em; s: 2.5em; t: 120.754/5 6/7; - one-over-zero: Infinity; - zero-over-zero: NaN; - one-mod-zero: NaN; - zero-mod-zero: NaN; + one-over-zero: calc(infinity); + zero-over-zero: calc(NaN); + one-mod-zero: calc(NaN); + zero-mod-zero: calc(NaN); } <===> output-libsass.css diff --git a/spec/non_conformant/colors/change-color.hrx b/spec/non_conformant/colors/change-color.hrx index d327e98c80..486354e5e6 100644 --- a/spec/non_conformant/colors/change-color.hrx +++ b/spec/non_conformant/colors/change-color.hrx @@ -10,7 +10,7 @@ p { color: #102005; color: rgba(16, 32, 48, 0.325); color: #782005; - color: hsla(25deg, 100%, 40%, 0.8); + color: hsla(25, 100%, 40%, 0.8); } <===> output-libsass.css diff --git a/spec/non_conformant/extend-tests/129_test_nested_extender_with_hacky_selector.hrx b/spec/non_conformant/extend-tests/129_test_nested_extender_with_hacky_selector.hrx index 9a6a1823e7..cbc11c7a1a 100644 --- a/spec/non_conformant/extend-tests/129_test_nested_extender_with_hacky_selector.hrx +++ b/spec/non_conformant/extend-tests/129_test_nested_extender_with_hacky_selector.hrx @@ -19,7 +19,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 2 | foo + > > + bar {@extend .foo} - | ^^^^^^^^^^^^^^^^ invalid selector + | ^^^^^^^^^^^^^^^ invalid selector | ============ @extend rule ' input.scss 2:1 root stylesheet diff --git a/spec/non_conformant/extend-tests/130_test_nested_extender_with_hacky_selector.hrx b/spec/non_conformant/extend-tests/130_test_nested_extender_with_hacky_selector.hrx index bfa5dbb9f1..58f56c6526 100644 --- a/spec/non_conformant/extend-tests/130_test_nested_extender_with_hacky_selector.hrx +++ b/spec/non_conformant/extend-tests/130_test_nested_extender_with_hacky_selector.hrx @@ -19,7 +19,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 2 | > > bar {@extend .foo} - | ^^^^^^^^ invalid selector + | ^^^^^^^ invalid selector | ============ @extend rule ' input.scss 2:1 root stylesheet diff --git a/spec/non_conformant/extend-tests/133_test_combinator_unification_for_hacky_combinators.hrx b/spec/non_conformant/extend-tests/133_test_combinator_unification_for_hacky_combinators.hrx index b2f80c7e74..9c17c6deec 100644 --- a/spec/non_conformant/extend-tests/133_test_combinator_unification_for_hacky_combinators.hrx +++ b/spec/non_conformant/extend-tests/133_test_combinator_unification_for_hacky_combinators.hrx @@ -16,6 +16,6 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | .a > + x {a: b} - | ^^^^^^^^^ + | ^^^^^^^^ ' input.scss 1:1 root stylesheet diff --git a/spec/non_conformant/extend-tests/134_test_combinator_unification_for_hacky_combinators.hrx b/spec/non_conformant/extend-tests/134_test_combinator_unification_for_hacky_combinators.hrx index f27f45a3bc..29047aa918 100644 --- a/spec/non_conformant/extend-tests/134_test_combinator_unification_for_hacky_combinators.hrx +++ b/spec/non_conformant/extend-tests/134_test_combinator_unification_for_hacky_combinators.hrx @@ -19,7 +19,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 2 | .b > + y {@extend x} - | ^^^^^^^^^ invalid selector + | ^^^^^^^^ invalid selector | ========= @extend rule ' input.scss 2:1 root stylesheet diff --git a/spec/non_conformant/extend-tests/135_test_combinator_unification_for_hacky_combinators.hrx b/spec/non_conformant/extend-tests/135_test_combinator_unification_for_hacky_combinators.hrx index 9e9ebc165f..425ca73c1f 100644 --- a/spec/non_conformant/extend-tests/135_test_combinator_unification_for_hacky_combinators.hrx +++ b/spec/non_conformant/extend-tests/135_test_combinator_unification_for_hacky_combinators.hrx @@ -16,7 +16,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | .a > + x {a: b} - | ^^^^^^^^^ + | ^^^^^^^^ ' input.scss 1:1 root stylesheet @@ -27,7 +27,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 2 | .b > + y {@extend x} - | ^^^^^^^^^ invalid selector + | ^^^^^^^^ invalid selector | ========= @extend rule ' input.scss 2:1 root stylesheet diff --git a/spec/non_conformant/extend-tests/136_test_combinator_unification_for_hacky_combinators.hrx b/spec/non_conformant/extend-tests/136_test_combinator_unification_for_hacky_combinators.hrx index 4534f2d555..5b2c4ff530 100644 --- a/spec/non_conformant/extend-tests/136_test_combinator_unification_for_hacky_combinators.hrx +++ b/spec/non_conformant/extend-tests/136_test_combinator_unification_for_hacky_combinators.hrx @@ -16,7 +16,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | .a ~ > + x {a: b} - | ^^^^^^^^^^^ + | ^^^^^^^^^^ ' input.scss 1:1 root stylesheet @@ -27,7 +27,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 2 | .b > + y {@extend x} - | ^^^^^^^^^ invalid selector + | ^^^^^^^^ invalid selector | ========= @extend rule ' input.scss 2:1 root stylesheet diff --git a/spec/non_conformant/extend-tests/137_test_combinator_unification_for_hacky_combinators.hrx b/spec/non_conformant/extend-tests/137_test_combinator_unification_for_hacky_combinators.hrx index 42324a4bec..25d7470cac 100644 --- a/spec/non_conformant/extend-tests/137_test_combinator_unification_for_hacky_combinators.hrx +++ b/spec/non_conformant/extend-tests/137_test_combinator_unification_for_hacky_combinators.hrx @@ -16,7 +16,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | .a + > x {a: b} - | ^^^^^^^^^ + | ^^^^^^^^ ' input.scss 1:1 root stylesheet @@ -27,7 +27,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 2 | .b > + y {@extend x} - | ^^^^^^^^^ invalid selector + | ^^^^^^^^ invalid selector | ========= @extend rule ' input.scss 2:1 root stylesheet diff --git a/spec/non_conformant/extend-tests/138_test_combinator_unification_for_hacky_combinators.hrx b/spec/non_conformant/extend-tests/138_test_combinator_unification_for_hacky_combinators.hrx index 42324a4bec..25d7470cac 100644 --- a/spec/non_conformant/extend-tests/138_test_combinator_unification_for_hacky_combinators.hrx +++ b/spec/non_conformant/extend-tests/138_test_combinator_unification_for_hacky_combinators.hrx @@ -16,7 +16,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | .a + > x {a: b} - | ^^^^^^^^^ + | ^^^^^^^^ ' input.scss 1:1 root stylesheet @@ -27,7 +27,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 2 | .b > + y {@extend x} - | ^^^^^^^^^ invalid selector + | ^^^^^^^^ invalid selector | ========= @extend rule ' input.scss 2:1 root stylesheet diff --git a/spec/non_conformant/extend-tests/139_test_combinator_unification_for_hacky_combinators.hrx b/spec/non_conformant/extend-tests/139_test_combinator_unification_for_hacky_combinators.hrx index 92bcba9253..4d182a6c30 100644 --- a/spec/non_conformant/extend-tests/139_test_combinator_unification_for_hacky_combinators.hrx +++ b/spec/non_conformant/extend-tests/139_test_combinator_unification_for_hacky_combinators.hrx @@ -16,7 +16,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | .a ~ > + .b > x {a: b} - | ^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^ ' input.scss 1:1 root stylesheet @@ -27,7 +27,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 2 | .c > + .d > y {@extend x} - | ^^^^^^^^^^^^^^ invalid selector + | ^^^^^^^^^^^^^ invalid selector | ========= @extend rule ' input.scss 2:1 root stylesheet diff --git a/spec/non_conformant/extend-tests/146_test_combinator_unification_tilde_plus.hrx b/spec/non_conformant/extend-tests/146_test_combinator_unification_tilde_plus.hrx index 8000958c53..d8946eb75c 100644 --- a/spec/non_conformant/extend-tests/146_test_combinator_unification_tilde_plus.hrx +++ b/spec/non_conformant/extend-tests/146_test_combinator_unification_tilde_plus.hrx @@ -3,6 +3,11 @@ .b ~ y {@extend x} <===> output.css +.a + x, .b ~ .a + y, .a.b + y { + a: b; +} + +<===> output-libsass.css .a + x, .b ~ .a + y, .b.a + y { a: b; } diff --git a/spec/non_conformant/extend-tests/224_test_nested_selector_with_child_selector_hack_extendee.hrx b/spec/non_conformant/extend-tests/224_test_nested_selector_with_child_selector_hack_extendee.hrx index 37e836a070..0fb100c7e6 100644 --- a/spec/non_conformant/extend-tests/224_test_nested_selector_with_child_selector_hack_extendee.hrx +++ b/spec/non_conformant/extend-tests/224_test_nested_selector_with_child_selector_hack_extendee.hrx @@ -15,7 +15,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | > .foo {a: b} - | ^^^^^^^ + | ^^^^^^ ' input.scss 1:1 root stylesheet diff --git a/spec/non_conformant/extend-tests/225_test_nested_selector_with_child_selector_hack_extender.hrx b/spec/non_conformant/extend-tests/225_test_nested_selector_with_child_selector_hack_extender.hrx index 40cd888750..94779b118a 100644 --- a/spec/non_conformant/extend-tests/225_test_nested_selector_with_child_selector_hack_extender.hrx +++ b/spec/non_conformant/extend-tests/225_test_nested_selector_with_child_selector_hack_extender.hrx @@ -15,7 +15,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 2 | > foo bar {@extend .bar} - | ^^^^^^^^^^ invalid selector + | ^^^^^^^^^ invalid selector | ============ @extend rule ' input.scss 2:1 root stylesheet diff --git a/spec/non_conformant/extend-tests/226_test_nested_selector_with_child_selector_hack_extender_and_extendee.hrx b/spec/non_conformant/extend-tests/226_test_nested_selector_with_child_selector_hack_extender_and_extendee.hrx index fe4b6ebf4f..739d8165dc 100644 --- a/spec/non_conformant/extend-tests/226_test_nested_selector_with_child_selector_hack_extender_and_extendee.hrx +++ b/spec/non_conformant/extend-tests/226_test_nested_selector_with_child_selector_hack_extender_and_extendee.hrx @@ -15,7 +15,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | > .foo {a: b} - | ^^^^^^^ + | ^^^^^^ ' input.scss 1:1 root stylesheet @@ -26,7 +26,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 2 | > foo bar {@extend .foo} - | ^^^^^^^^^^ invalid selector + | ^^^^^^^^^ invalid selector | ============ @extend rule ' input.scss 2:1 root stylesheet diff --git a/spec/non_conformant/extend-tests/227_test_nested_with_child_hack_extender_and_sibling_extendee.hrx b/spec/non_conformant/extend-tests/227_test_nested_with_child_hack_extender_and_sibling_extendee.hrx index 656f00bec8..c47b5f5794 100644 --- a/spec/non_conformant/extend-tests/227_test_nested_with_child_hack_extender_and_sibling_extendee.hrx +++ b/spec/non_conformant/extend-tests/227_test_nested_with_child_hack_extender_and_sibling_extendee.hrx @@ -15,7 +15,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | ~ .foo {a: b} - | ^^^^^^^ + | ^^^^^^ ' input.scss 1:1 root stylesheet @@ -26,7 +26,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 2 | > foo bar {@extend .foo} - | ^^^^^^^^^^ invalid selector + | ^^^^^^^^^ invalid selector | ============ @extend rule ' input.scss 2:1 root stylesheet diff --git a/spec/non_conformant/extend-tests/228_test_nested_with_child_selector_hack_extender_extendee_newline.hrx b/spec/non_conformant/extend-tests/228_test_nested_with_child_selector_hack_extender_extendee_newline.hrx index 3b64619361..77194bfdaa 100644 --- a/spec/non_conformant/extend-tests/228_test_nested_with_child_selector_hack_extender_extendee_newline.hrx +++ b/spec/non_conformant/extend-tests/228_test_nested_with_child_selector_hack_extender_extendee_newline.hrx @@ -17,7 +17,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | > .foo {a: b} - | ^^^^^^^ + | ^^^^^^ ' input.scss 1:1 root stylesheet @@ -27,11 +27,10 @@ This will be an error in Dart Sass 2.0.0. More info: https://sass-lang.com/d/bogus-combinators , -2 | / flip, -3 | | > foo bar {@extend .foo} - | '----------^ invalid selector - | ============ @extend rule +3 | > foo bar {@extend .foo} + | ^^^^^^^^^ invalid selector + | ============ @extend rule ' - input.scss 2:1 root stylesheet + input.scss 3:1 root stylesheet <===> warning-libsass diff --git a/spec/non_conformant/parser/interpolate/44_selector/todo_single_escape/11_escaped_interpolated_value.hrx b/spec/non_conformant/parser/interpolate/44_selector/todo_single_escape/11_escaped_interpolated_value.hrx index 580fcbac0a..ebd25c401e 100644 --- a/spec/non_conformant/parser/interpolate/44_selector/todo_single_escape/11_escaped_interpolated_value.hrx +++ b/spec/non_conformant/parser/interpolate/44_selector/todo_single_escape/11_escaped_interpolated_value.hrx @@ -4,11 +4,15 @@ $key: 'bar'; <===> error Error: expected selector. + ,--> input.scss +2 | .test11#{'\@#{$key}'} { content: '1.1'; } + | ^^^^^^^^^^^ + ' , -2 | .test11@bar{ content: '1.1'; } - | ^ +1 | .test11@bar + | = error in interpolated output ' - input.scss 2:8 root stylesheet + input.scss 2:10 root stylesheet <===> error-libsass Error: Invalid CSS after ".test11": expected selector, was "@bar" diff --git a/spec/non_conformant/parser/interpolate/44_selector/todo_single_escape/21_escaped_interpolated_variable.hrx b/spec/non_conformant/parser/interpolate/44_selector/todo_single_escape/21_escaped_interpolated_variable.hrx index 0d62c989f5..7f8de1bbed 100644 --- a/spec/non_conformant/parser/interpolate/44_selector/todo_single_escape/21_escaped_interpolated_variable.hrx +++ b/spec/non_conformant/parser/interpolate/44_selector/todo_single_escape/21_escaped_interpolated_variable.hrx @@ -5,11 +5,15 @@ $suffix1: '\@#{$key}'; <===> error Error: expected selector. + ,--> input.scss +3 | .test21#{$suffix1} { content: '2.1'; } + | ^^^^^^^^ + ' , -3 | .test21@bar{ content: '2.1'; } - | ^ +1 | .test21@bar + | = error in interpolated output ' - input.scss 3:8 root stylesheet + input.scss 3:10 root stylesheet <===> error-libsass Error: Invalid CSS after ".test21": expected selector, was "@bar" diff --git a/spec/non_conformant/parser/interpolate/44_selector/todo_single_escape/31_escaped_literal.hrx b/spec/non_conformant/parser/interpolate/44_selector/todo_single_escape/31_escaped_literal.hrx index ce99df652f..3068586273 100644 --- a/spec/non_conformant/parser/interpolate/44_selector/todo_single_escape/31_escaped_literal.hrx +++ b/spec/non_conformant/parser/interpolate/44_selector/todo_single_escape/31_escaped_literal.hrx @@ -3,11 +3,15 @@ <===> error Error: expected selector. + ,--> input.scss +1 | .test31#{'\@baz'} { content: '3.1'; } + | ^^^^^^^ + ' , -1 | .test31@baz{ content: '3.1'; } - | ^ +1 | .test31@baz + | = error in interpolated output ' - input.scss 1:8 root stylesheet + input.scss 1:10 root stylesheet <===> error-libsass Error: Invalid CSS after ".test31": expected selector, was "@baz" diff --git a/spec/non_conformant/scss/css_selector_hacks.hrx b/spec/non_conformant/scss/css_selector_hacks.hrx index a7cf44b201..2b65519da6 100644 --- a/spec/non_conformant/scss/css_selector_hacks.hrx +++ b/spec/non_conformant/scss/css_selector_hacks.hrx @@ -16,6 +16,6 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | > > E { - | ^^^^^^ + | ^^^^^ ' input.scss 1:1 root stylesheet diff --git a/spec/non_conformant/scss/negation.hrx b/spec/non_conformant/scss/negation.hrx index d7f6862b5d..c830559b8b 100644 --- a/spec/non_conformant/scss/negation.hrx +++ b/spec/non_conformant/scss/negation.hrx @@ -22,7 +22,7 @@ <===> warning DEPRECATION WARNING: Using / for division outside of calc() is deprecated and will be removed in Dart Sass 2.0.0. -Recommendation: math.div(-$bwidth, 3) or calc(-$bwidth / 3) +Recommendation: math.div(-$bwidth, 3) or calc(-1 * $bwidth / 3) More info and automated migrator: https://sass-lang.com/d/slash-div diff --git a/spec/non_conformant/scss/weird-selectors.hrx b/spec/non_conformant/scss/weird-selectors.hrx index eec586d68a..d13fdba72d 100644 --- a/spec/non_conformant/scss/weird-selectors.hrx +++ b/spec/non_conformant/scss/weird-selectors.hrx @@ -26,7 +26,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 1 | > > E { - | ^^^^^^ + | ^^^^^ ' input.scss 1:1 root stylesheet @@ -37,7 +37,7 @@ More info: https://sass-lang.com/d/bogus-combinators , 5 | E > > { - | ^^^^^^ + | ^^^^^ ' input.scss 5:1 root stylesheet @@ -48,6 +48,6 @@ More info: https://sass-lang.com/d/bogus-combinators , 10 | > > F > > { - | ^^^^^^^^^^ + | ^^^^^^^^^ ' input.scss 10:3 root stylesheet diff --git a/spec/parser/selector.hrx b/spec/parser/selector.hrx index 7acc6a096d..ae9270489c 100644 --- a/spec/parser/selector.hrx +++ b/spec/parser/selector.hrx @@ -1,3 +1,16 @@ +<===> escaped_backslash/input.scss +// Regression test for sass/dart-sass#1855. +\\{ + b: c; +} + +<===> escaped_backslash/output.css +\\ { + b: c; +} + +<===> +================================================================================ <===> error/empty_placeholder/input.scss % { a: b; @@ -6,7 +19,7 @@ <===> error/empty_placeholder/error Error: Expected identifier. , -1 | %{ +1 | % { | ^ ' input.scss 1:2 root stylesheet diff --git a/spec/values/calculation/calc/constant.hrx b/spec/values/calculation/calc/constant.hrx new file mode 100644 index 0000000000..2d7ac9091c --- /dev/null +++ b/spec/values/calculation/calc/constant.hrx @@ -0,0 +1,388 @@ +<===> pi/alone/input.scss +a {b: calc(pi)} + +<===> pi/alone/output.css +a { + b: 3.1415926536; +} + +<===> +================================================================================ +<===> pi/equals_max_precision/input.scss +// Verify that pi is equal to the maximum precision representable in a double. +a {b: calc(pi) == 3.141592653589793} + +<===> pi/equals_max_precision/output.css +a { + b: true; +} + +<===> +================================================================================ +<===> pi/math/simplified/input.scss +a {b: calc(pi * 2)} + +<===> pi/math/simplified/output.css +a { + b: 6.2831853072; +} + +<===> +================================================================================ +<===> pi/math/unsimplified/input.scss +a {b: calc(pi * (1% + 1px))} + +<===> pi/math/unsimplified/output.css +a { + b: calc(3.1415926536 * (1% + 1px)); +} + +<===> +================================================================================ +<===> pi/case_insensitive/input.scss +a {b: calc(pI)} + +<===> pi/case_insensitive/output.css +a { + b: 3.1415926536; +} + +<===> +================================================================================ +<===> e/alone/input.scss +a {b: calc(e)} + +<===> e/alone/output.css +a { + b: 2.7182818285; +} + +<===> +================================================================================ +<===> e/equals_max_precision/input.scss +// Verify that e is equal to the maximum precision representable in a double. +a {b: calc(e) == 2.718281828459045} + +<===> e/equals_max_precision/output.css +a { + b: true; +} + +<===> +================================================================================ +<===> e/math/simplified/input.scss +a {b: calc(e * 2)} + +<===> e/math/simplified/output.css +a { + b: 5.4365636569; +} + +<===> +================================================================================ +<===> e/math/unsimplified/input.scss +a {b: calc(e * (1% + 1px))} + +<===> e/math/unsimplified/output.css +a { + b: calc(2.7182818285 * (1% + 1px)); +} + +<===> +================================================================================ +<===> e/case_insensitive/input.scss +a {b: calc(E)} + +<===> e/case_insensitive/output.css +a { + b: 2.7182818285; +} + +<===> +================================================================================ +<===> infinity/alone/input.scss +a {b: calc(infinity)} + +<===> infinity/alone/output.css +a { + b: calc(infinity); +} + +<===> +================================================================================ +<===> infinity/type/input.scss +@use 'sass:meta'; +a {b: meta.type-of(calc(infinity))} + +<===> infinity/type/output.css +a { + b: number; +} + +<===> +================================================================================ +<===> infinity/math/simplified/input.scss +a {b: calc(infinity * 2)} + +<===> infinity/math/simplified/output.css +a { + b: calc(infinity); +} + +<===> +================================================================================ +<===> infinity/math/unsimplified/literal/input.scss +a {b: calc(infinity * (1% + 1px))} + +<===> infinity/math/unsimplified/literal/output.css +a { + b: calc(infinity * (1% + 1px)); +} + +<===> +================================================================================ +<===> infinity/math/unsimplified/computed/input.scss +a {b: calc((1/0) * (1% + 1px))} + +<===> infinity/math/unsimplified/computed/output.css +a { + b: calc(infinity * (1% + 1px)); +} + +<===> +================================================================================ +<===> infinity/math/unsimplified/from_variable/input.scss +@use 'sass:math'; +$var: math.div(1, 0); +a {b: calc($var * (1% + 1px))} + +<===> infinity/math/unsimplified/from_variable/output.css +a { + b: calc(infinity * (1% + 1px)); +} + +<===> +================================================================================ +<===> infinity/case_insensitive/input.scss +a {b: calc(InFiNiTy)} + +<===> infinity/case_insensitive/output.css +a { + b: calc(infinity); +} + +<===> +================================================================================ +<===> minus_infinity/alone/input.scss +a {b: calc(-infinity)} + +<===> minus_infinity/alone/output.css +a { + b: calc(-infinity); +} + +<===> +================================================================================ +<===> minus_infinity/type/input.scss +@use 'sass:meta'; +a {b: meta.type-of(calc(-infinity))} + +<===> minus_infinity/type/output.css +a { + b: number; +} + +<===> +================================================================================ +<===> minus_infinity/math/simplified/input.scss +a {b: calc(-infinity * 2)} + +<===> minus_infinity/math/simplified/output.css +a { + b: calc(-infinity); +} + +<===> +================================================================================ +<===> minus_infinity/math/unsimplified/literal/input.scss +a {b: calc(-infinity * (1% + 1px))} + +<===> minus_infinity/math/unsimplified/literal/output.css +a { + b: calc(-infinity * (1% + 1px)); +} + +<===> +================================================================================ +<===> minus_infinity/math/unsimplified/computed/input.scss +a {b: calc((-1/0) * (1% + 1px))} + +<===> minus_infinity/math/unsimplified/computed/output.css +a { + b: calc(-infinity * (1% + 1px)); +} + +<===> +================================================================================ +<===> minus_infinity/math/unsimplified/from_variable/input.scss +@use 'sass:math'; +$var: math.div(-1, 0); +a {b: calc($var * (1% + 1px))} + +<===> minus_infinity/math/unsimplified/from_variable/output.css +a { + b: calc(-infinity * (1% + 1px)); +} + +<===> +================================================================================ +<===> minus_infinity/case_insensitive/input.scss +a {b: calc(-iNfInItY)} + +<===> minus_infinity/case_insensitive/output.css +a { + b: calc(-infinity); +} + +<===> +================================================================================ +<===> nan/alone/input.scss +a {b: calc(NaN)} + +<===> nan/alone/output.css +a { + b: calc(NaN); +} + +<===> +================================================================================ +<===> nan/type/input.scss +@use 'sass:meta'; +a {b: meta.type-of(calc(NaN))} + +<===> nan/type/output.css +a { + b: number; +} + +<===> +================================================================================ +<===> nan/math/simplified/input.scss +a {b: calc(NaN * 2)} + +<===> nan/math/simplified/output.css +a { + b: calc(NaN); +} + +<===> +================================================================================ +<===> nan/math/unsimplified/literal/input.scss +a {b: calc(NaN * (1% + 1px))} + +<===> nan/math/unsimplified/literal/output.css +a { + b: calc(NaN * (1% + 1px)); +} + +<===> +================================================================================ +<===> nan/math/unsimplified/computed/input.scss +a {b: calc((0/0) * (1% + 1px))} + +<===> nan/math/unsimplified/computed/output.css +a { + b: calc(NaN * (1% + 1px)); +} + +<===> +================================================================================ +<===> nan/math/unsimplified/from_variable/input.scss +@use 'sass:math'; +$var: math.div(0, 0); +a {b: calc($var * (1% + 1px))} + +<===> nan/math/unsimplified/from_variable/output.css +a { + b: calc(NaN * (1% + 1px)); +} + +<===> +================================================================================ +<===> nan/case_insensitive/input.scss +a {b: calc(nan)} + +<===> nan/case_insensitive/output.css +a { + b: calc(NaN); +} + +<===> +================================================================================ +<===> precedence/after_plus/input.scss +a {b: calc(1% + (infinity * 1px))} + +<===> precedence/after_plus/output.css +a { + b: calc(1% + infinity * 1px); +} + +<===> +================================================================================ +<===> precedence/after_minus/input.scss +a {b: calc(1% - (infinity * 1px))} + +<===> precedence/after_minus/output.css +a { + b: calc(1% - infinity * 1px); +} + +<===> +================================================================================ +<===> precedence/after_times/input.scss +a {b: calc(var(--c) * (infinity * 1px))} + +<===> precedence/after_times/output.css +a { + b: calc(var(--c) * infinity * 1px); +} + +<===> +================================================================================ +<===> precedence/after_divide/unit/input.scss +a {b: calc(var(--c) / (infinity * 1px))} + +<===> precedence/after_divide/unit/output.css +a { + b: calc(var(--c) / (infinity * 1px)); +} + +<===> +================================================================================ +<===> precedence/after_divide/no_unit/input.scss +a {b: calc(var(--c) / infinity)} + +<===> precedence/after_divide/no_unit/output.css +a { + b: calc(var(--c) / infinity); +} + +<===> +================================================================================ +<===> undefined/alone/input.scss +a {b: calc(c)} + +<===> undefined/alone/output.css +a { + b: calc(c); +} + +<===> +================================================================================ +<===> undefined/math/input.scss +a {b: calc(c * 2)} + +<===> undefined/math/output.css +a { + b: calc(c * 2); +} diff --git a/spec/values/calculation/calc/error/syntax.hrx b/spec/values/calculation/calc/error/syntax.hrx index 5908a5befc..89db4e06e4 100644 --- a/spec/values/calculation/calc/error/syntax.hrx +++ b/spec/values/calculation/calc/error/syntax.hrx @@ -100,19 +100,6 @@ Error: Expected identifier. ' input.scss 1:13 root stylesheet -<===> -================================================================================ -<===> identifier/input.scss -a {b: calc(c)} - -<===> identifier/error -Error: Expected "(" or ".". - , -1 | a {b: calc(c)} - | ^ - ' - input.scss 1:13 root stylesheet - <===> ================================================================================ <===> interpolation/in_parens/input.scss diff --git a/spec/values/calculation/clamp.hrx b/spec/values/calculation/clamp.hrx index 0be950032e..79e09fa2d9 100644 --- a/spec/values/calculation/clamp.hrx +++ b/spec/values/calculation/clamp.hrx @@ -70,12 +70,12 @@ Error: expected "+", "-", "*", "/", ",", or ")". <===> ================================================================================ <===> error/syntax/invalid_arg/input.scss -a {b: clamp(1px, c, 2px)} +a {b: clamp(1px, $, 2px)} <===> error/syntax/invalid_arg/error -Error: Expected "(" or ".". +Error: Expected identifier. , -1 | a {b: clamp(1px, c, 2px)} +1 | a {b: clamp(1px, $, 2px)} | ^ ' input.scss 1:19 root stylesheet diff --git a/spec/values/calculation/max.hrx b/spec/values/calculation/max.hrx index dd88615756..7364ce9e83 100644 --- a/spec/values/calculation/max.hrx +++ b/spec/values/calculation/max.hrx @@ -18,15 +18,15 @@ Error: At least one argument must be passed. <===> ================================================================================ <===> error/syntax/invalid_arg/input.scss -a {b: max(c)} +a {b: max($)} <===> error/syntax/invalid_arg/error -Error: c is not a number. +Error: Expected identifier. , -1 | a {b: max(c)} - | ^^^^^^ +1 | a {b: max($)} + | ^ ' - input.scss 1:7 root stylesheet + input.scss 1:12 root stylesheet <===> ================================================================================ diff --git a/spec/values/calculation/min.hrx b/spec/values/calculation/min.hrx index 5fdd9eb341..768f763a2c 100644 --- a/spec/values/calculation/min.hrx +++ b/spec/values/calculation/min.hrx @@ -18,15 +18,15 @@ Error: At least one argument must be passed. <===> ================================================================================ <===> error/syntax/invalid_arg/input.scss -a {b: min(c)} +a {b: min($)} <===> error/syntax/invalid_arg/error -Error: c is not a number. +Error: Expected identifier. , -1 | a {b: min(c)} - | ^^^^^^ +1 | a {b: min($)} + | ^ ' - input.scss 1:7 root stylesheet + input.scss 1:12 root stylesheet <===> ================================================================================ diff --git a/spec/values/numbers/bounds.hrx b/spec/values/numbers/bounds.hrx index 573b56ea02..a1a028c390 100644 --- a/spec/values/numbers/bounds.hrx +++ b/spec/values/numbers/bounds.hrx @@ -85,7 +85,7 @@ a { <===> int/above_max/very/output.css a { - b: Infinity; + b: calc(infinity); } <===> @@ -125,7 +125,7 @@ a { <===> int/below_min/very/output.css a { - b: -Infinity; + b: calc(-infinity); } <===> diff --git a/spec/values/numbers/degenerate.hrx b/spec/values/numbers/degenerate.hrx new file mode 100644 index 0000000000..ed29b09a95 --- /dev/null +++ b/spec/values/numbers/degenerate.hrx @@ -0,0 +1,195 @@ +<===> options.yml +:ignore_for: +- libsass + +<===> +================================================================================ +<===> infinity/unitless/input.scss +@use 'sass:math'; +a {b: math.div(1, 0)} + +<===> infinity/unitless/output.css +a { + b: calc(infinity); +} + +<===> +================================================================================ +<===> infinity/single_unit/input.scss +@use 'sass:math'; +a {b: math.div(1px, 0)} + +<===> infinity/single_unit/output.css +a { + b: calc(infinity * 1px); +} + +<===> +================================================================================ +<===> minus_infinity/unitless/input.scss +@use 'sass:math'; +a {b: math.div(-1, 0)} + +<===> minus_infinity/unitless/output.css +a { + b: calc(-infinity); +} + +<===> +================================================================================ +<===> minus_infinity/single_unit/input.scss +@use 'sass:math'; +a {b: math.div(-1px, 0)} + +<===> minus_infinity/single_unit/output.css +a { + b: calc(-infinity * 1px); +} + +<===> +================================================================================ +<===> nan/unitless/input.scss +@use 'sass:math'; +a {b: math.div(0, 0)} + +<===> nan/unitless/output.css +a { + b: calc(NaN); +} + +<===> +================================================================================ +<===> nan/single_unit/input.scss +@use 'sass:math'; +a {b: math.div(0px, 0)} + +<===> nan/single_unit/output.css +a { + b: calc(NaN * 1px); +} + +<===> +================================================================================ +<===> error/infinity/multiple_numerator_units/input.scss +@use 'sass:math'; +a {b: math.div(1px * 1em, 0)} + +<===> error/infinity/multiple_numerator_units/error +Error: calc(Infinitypx*em) isn't a valid CSS value. + , +2 | a {b: math.div(1px * 1em, 0)} + | ^^^^^^^^^^^^^^^^^^^^^^ + ' + input.scss 2:7 root stylesheet + +<===> +================================================================================ +<===> error/infinity/denominator_unit/input.scss +@use 'sass:math'; +a {b: math.div(1, 0px)} + +<===> error/infinity/denominator_unit/error +Error: calc(Infinitypx^-1) isn't a valid CSS value. + , +2 | a {b: math.div(1, 0px)} + | ^^^^^^^^^^^^^^^^ + ' + input.scss 2:7 root stylesheet + +<===> +================================================================================ +<===> error/infinity/numerator_and_denominator_unit/input.scss +@use 'sass:math'; +a {b: math.div(1px, 0em)} + +<===> error/infinity/numerator_and_denominator_unit/error +Error: calc(Infinitypx/em) isn't a valid CSS value. + , +2 | a {b: math.div(1px, 0em)} + | ^^^^^^^^^^^^^^^^^^ + ' + input.scss 2:7 root stylesheet + +<===> +================================================================================ +<===> error/minus_infinity/multiple_numerator_units/input.scss +@use 'sass:math'; +a {b: math.div(-1px * 1em, 0)} + +<===> error/minus_infinity/multiple_numerator_units/error +Error: calc(-Infinitypx*em) isn't a valid CSS value. + , +2 | a {b: math.div(-1px * 1em, 0)} + | ^^^^^^^^^^^^^^^^^^^^^^^ + ' + input.scss 2:7 root stylesheet + +<===> +================================================================================ +<===> error/minus_infinity/denominator_unit/input.scss +@use 'sass:math'; +a {b: math.div(-1, 0px)} + +<===> error/minus_infinity/denominator_unit/error +Error: calc(-Infinitypx^-1) isn't a valid CSS value. + , +2 | a {b: math.div(-1, 0px)} + | ^^^^^^^^^^^^^^^^^ + ' + input.scss 2:7 root stylesheet + +<===> +================================================================================ +<===> error/minus_infinity/numerator_and_denominator_unit/input.scss +@use 'sass:math'; +a {b: math.div(-1px, 0em)} + +<===> error/minus_infinity/numerator_and_denominator_unit/error +Error: calc(-Infinitypx/em) isn't a valid CSS value. + , +2 | a {b: math.div(-1px, 0em)} + | ^^^^^^^^^^^^^^^^^^^ + ' + input.scss 2:7 root stylesheet + +<===> +================================================================================ +<===> error/nan/multiple_numerator_units/input.scss +@use 'sass:math'; +a {b: math.div(0px * 0em, 0)} + +<===> error/nan/multiple_numerator_units/error +Error: calc(NaNpx*em) isn't a valid CSS value. + , +2 | a {b: math.div(0px * 0em, 0)} + | ^^^^^^^^^^^^^^^^^^^^^^ + ' + input.scss 2:7 root stylesheet + +<===> +================================================================================ +<===> error/nan/denominator_unit/input.scss +@use 'sass:math'; +a {b: math.div(0, 0px)} + +<===> error/nan/denominator_unit/error +Error: calc(NaNpx^-1) isn't a valid CSS value. + , +2 | a {b: math.div(0, 0px)} + | ^^^^^^^^^^^^^^^^ + ' + input.scss 2:7 root stylesheet + +<===> +================================================================================ +<===> error/nan/numerator_and_denominator_unit/input.scss +@use 'sass:math'; +a {b: math.div(0px, 0em)} + +<===> error/nan/numerator_and_denominator_unit/error +Error: calc(NaNpx/em) isn't a valid CSS value. + , +2 | a {b: math.div(0px, 0em)} + | ^^^^^^^^^^^^^^^^^^ + ' + input.scss 2:7 root stylesheet diff --git a/spec/values/numbers/modulo/zeros.hrx b/spec/values/numbers/modulo/zeros.hrx index 3f4833d2fb..d29217699d 100644 --- a/spec/values/numbers/modulo/zeros.hrx +++ b/spec/values/numbers/modulo/zeros.hrx @@ -45,6 +45,10 @@ a { <===> ================================================================================ +<===> zero_divider/options.yml +:ignore_for: + - libsass + <===> zero_divider/input.scss a { b: inspect(1 % 0); @@ -52,5 +56,5 @@ a { <===> zero_divider/output.css a { - b: NaN; + b: calc(NaN); } diff --git a/spec/values/strings.hrx b/spec/values/strings.hrx new file mode 100644 index 0000000000..3cba87df6a --- /dev/null +++ b/spec/values/strings.hrx @@ -0,0 +1,65 @@ +<===> options.yml +:ignore_for: +- libsass + +<===> +================================================================================ +<===> new-line/escaped/input.scss +a { + b: 'line1 \ + line2'; +} + +<===> new-line/escaped/output.css +a { + b: "line1 line2"; +} + +<===> +================================================================================ +<===> new-line/raw/input.scss +@mixin a($b) { b: $b } +a { + b: 'line1 + line2'; +} + +<===> new-line/raw/error +Error: Expected '. + , +3 | b: 'line1 + | ^ + ' + input.scss 3:12 root stylesheet + +<===> +================================================================================ +<===> new-line/cr/input.scss +@mixin a($b) { b: $b } +a { + b: 'line1 line2'; +} + +<===> new-line/cr/error +Error: Expected '. + , +3 | b: 'line1 + | ^ + ' + input.scss 3:12 root stylesheet + +<===> +================================================================================ +<===> new-line/ff/input.scss +@mixin a($b) { b: $b } +a { + b: 'line1 line2'; + + +<===> new-line/ff/error +Error: Expected '. + , +3 | b: 'line1 line2'; + | ^ + ' + input.scss 3:12 root stylesheet diff --git a/spec/variables.hrx b/spec/variables.hrx index 3bb9e289d9..dbc6e2ddb6 100644 --- a/spec/variables.hrx +++ b/spec/variables.hrx @@ -15,3 +15,54 @@ c {d: $a} c { d: global; } + +<===> +================================================================================ +<===> double_flag/options.yml +--- +:warning_todo: +- sass/libsass#2834 + +<===> +================================================================================ +<===> double_flag/default/input.scss +$a: b !default !default; + +c {d: $a} + +<===> double_flag/default/output.css +c { + d: b; +} + +<===> double_flag/default/warning +DEPRECATION WARNING on line 1, column 16 of input.scss: +!default should only be written once for each variable. +This will be an error in Dart Sass 2.0.0. + , +1 | $a: b !default !default; + | ^^^^^^^^ + ' + +<===> +================================================================================ +<===> double_flag/global/input.scss +$a: b; +c { + $a: d !global !global; + e: $a +} + +<===> double_flag/global/output.css +c { + e: d; +} + +<===> double_flag/global/warning +DEPRECATION WARNING on line 3, column 17 of input.scss: +!global should only be written once for each variable. +This will be an error in Dart Sass 2.0.0. + , +3 | $a: d !global !global; + | ^^^^^^^ + ' diff --git a/test/global.d.ts b/test/global.d.ts new file mode 100644 index 0000000000..9e6c1dbd9f --- /dev/null +++ b/test/global.d.ts @@ -0,0 +1 @@ +import 'jest-extended';