2016-08-29 00:04:48 +02:00
// Copyright 2016 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.
2020-01-24 22:05:04 +01:00
import ' dart:convert ' ;
import ' dart:io ' ;
import ' package:charcode/charcode.dart ' ;
import ' package:cli_pkg/cli_pkg.dart ' as pkg ;
2016-08-29 00:04:48 +02:00
import ' package:grinder/grinder.dart ' ;
2020-01-24 22:05:04 +01:00
import ' package:path/path.dart ' as p ;
import ' package:source_span/source_span.dart ' ;
2017-10-12 21:22:01 +02:00
2018-05-04 02:37:25 +02:00
import ' grind/synchronize.dart ' ;
2016-10-15 00:48:34 +02:00
2020-02-25 23:05:01 +01:00
export ' grind/bazel.dart ' ;
2018-06-15 20:29:42 +02:00
export ' grind/benchmark.dart ' ;
2019-01-10 01:45:27 +01:00
export ' grind/sanity_check.dart ' ;
2021-07-29 03:28:00 +02:00
export ' grind/subpackages.dart ' ;
2018-05-04 02:37:25 +02:00
export ' grind/synchronize.dart ' ;
2018-02-02 03:54:42 +01:00
2020-01-24 22:05:04 +01:00
void main ( List < String > args ) {
2020-10-14 02:37:22 +02:00
pkg . humanName . value = " Dart Sass " ;
pkg . botName . value = " Sass Bot " ;
pkg . botEmail . value = " sass.bot.beep.boop@gmail.com " ;
pkg . executables . value = { " sass " : " bin/sass.dart " } ;
pkg . chocolateyNuspec . value = _nuspec ;
pkg . homebrewRepo . value = " sass/homebrew-sass " ;
pkg . homebrewFormula . value = " sass.rb " ;
2020-10-28 23:00:05 +01:00
pkg . jsRequires . value = { " chokidar " : " chokidar " , " readline " : " readline " } ;
2020-10-14 02:37:22 +02:00
pkg . jsModuleMainLibrary . value = " lib/src/node.dart " ;
pkg . npmPackageJson . fn = ( ) = >
2020-01-24 22:05:04 +01:00
json . decode ( File ( " package/package.json " ) . readAsStringSync ( ) )
2021-03-17 04:51:32 +01:00
as Map < String , dynamic > ;
2020-10-14 02:37:22 +02:00
pkg . npmReadme . fn = ( ) = > _readAndResolveMarkdown ( " package/README.npm.md " ) ;
pkg . standaloneName . value = " dart-sass " ;
2021-03-17 03:25:39 +01:00
pkg . githubUser . fn = ( ) = > Platform . environment [ " GH_USER " ] ! ;
pkg . githubPassword . fn = ( ) = > Platform . environment [ " GH_TOKEN " ] ! ;
2020-01-24 22:05:04 +01:00
2020-10-14 02:37:22 +02:00
pkg . githubReleaseNotes . fn = ( ) = >
" To install Sass ${ pkg . version } , download one of the packages below "
" and [add it to your PATH][], or see [the Sass website][] for full "
" installation instructions. \n "
" \n "
" [add it to your PATH]: https://katiek2.github.io/path-doc/ \n "
" [the Sass website]: https://sass-lang.com/install \n "
" \n "
" # Changes \n "
" \n "
2020-10-29 21:43:27 +01:00
" ${ pkg . githubReleaseNotes . defaultValue } " ;
2020-03-09 20:17:09 +01:00
2020-01-24 22:05:04 +01:00
pkg . addAllTasks ( ) ;
grind ( args ) ;
}
2016-08-29 00:04:48 +02:00
2017-11-20 23:30:42 +01:00
@ DefaultTask ( ' Compile async code and reformat. ' )
2017-12-01 23:20:49 +01:00
@ Depends ( format , synchronize )
2019-11-06 01:28:26 +01:00
void all ( ) { }
2017-11-20 23:30:42 +01:00
@ Task ( ' Run the Dart formatter. ' )
2019-11-06 01:28:26 +01:00
void format ( ) {
2021-07-29 03:28:00 +02:00
Pub . run ( ' dart_style ' ,
script: ' format ' , arguments: [ ' --overwrite ' , ' --fix ' , ' . ' ] ) ;
2016-08-29 00:04:48 +02:00
}
2016-10-05 10:04:51 +02:00
2017-12-01 23:20:49 +01:00
@ Task ( ' Installs dependencies from npm. ' )
2020-09-08 18:23:46 +02:00
void npmInstall ( ) = >
run ( Platform . isWindows ? " npm.cmd " : " npm " , arguments: [ " install " ] ) ;
2017-12-01 23:20:49 +01:00
@ Task ( ' Runs the tasks that are required for running tests. ' )
2020-01-24 22:05:04 +01:00
@ Depends ( format , synchronize , " pkg-npm-dev " , npmInstall , " pkg-standalone-dev " )
2019-11-06 01:28:26 +01:00
void beforeTest ( ) { }
2020-01-24 22:05:04 +01:00
String get _nuspec = > """
< ? xml version = " 1.0 " ? >
< package xmlns = " http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd " >
< metadata >
< id > sass < / id >
< title > Sass < / title >
< authors > Natalie Weizenbaum < / authors >
< owners > nex3 < / owners >
< projectUrl > https: //github.com/sass/dart-sass</projectUrl>
2020-02-07 22:05:21 +01:00
< licenseUrl > https: //github.com/sass/dart-sass/blob/${pkg.version}/LICENSE</licenseUrl>
2020-01-24 22:05:04 +01:00
< iconUrl > https: //cdn.rawgit.com/sass/sass-site/f99ee33e4f688e244c7a5902c59d61f78daccc55/source/assets/img/logos/logo-seal.png</iconUrl>
< bugTrackerUrl > https: //github.com/sass/dart-sass/issues</bugTrackerUrl>
< description > * * Sass makes CSS fun again * * . Sass is an extension of CSS , adding nested rules , variables , mixins , selector inheritance , and more . It ' s translated to well-formatted, standard CSS using the command line tool or a web-framework plugin.
This package is Dart Sass , the new Dart implementation of Sass . < / description >
< summary > Sass makes CSS fun again . < / summary >
< tags > css preprocessor style sass < / tags >
< copyright > Copyright $ { DateTime . now ( ) . year } Google , Inc . < / copyright >
< / metadata >
< / package >
""" ;
final _readAndResolveRegExp = RegExp (
r"^<!-- +#include +([^\s]+) +"
' "([^" \n ]+)" '
r" +-->$" ,
multiLine: true ) ;
/// Reads a Markdown file from [path] and resolves include directives.
///
/// Include directives have the syntax `"<!-- #include" PATH HEADER "-->"`,
/// which must appear on its own line. PATH is a relative file: URL to another
/// Markdown file, and HEADER is the name of a header in that file whose
/// contents should be included as-is.
String _readAndResolveMarkdown ( String path ) = > File ( path )
. readAsStringSync ( )
. replaceAllMapped ( _readAndResolveRegExp , ( match ) {
2021-03-17 03:25:39 +01:00
late String included ;
2020-01-24 22:05:04 +01:00
try {
included = File ( p . join ( p . dirname ( path ) , p . fromUri ( match [ 1 ] ) ) )
. readAsStringSync ( ) ;
} catch ( error ) {
_matchError ( match , error . toString ( ) , url: p . toUri ( path ) ) ;
}
2021-03-17 03:25:39 +01:00
late Match headerMatch ;
2020-01-24 22:05:04 +01:00
try {
headerMatch = " # ${ match [ 2 ] } " . allMatches ( included ) . first ;
} on StateError {
_matchError ( match , " Could not find header. " , url: p . toUri ( path ) ) ;
}
var headerLevel = 0 ;
var index = headerMatch . start ;
while ( index > = 0 & & included . codeUnitAt ( index ) = = $hash ) {
headerLevel + + ;
index - - ;
}
// The section goes until the next header of the same level, or the end
// of the document.
var sectionEnd = included . indexOf ( " # " * headerLevel , headerMatch . end ) ;
if ( sectionEnd = = - 1 ) sectionEnd = included . length ;
return included . substring ( headerMatch . end , sectionEnd ) . trim ( ) ;
} ) ;
/// Throws a nice [SourceSpanException] associated with [match].
2021-03-17 03:25:39 +01:00
void _matchError ( Match match , String message , { Object ? url } ) {
2020-01-24 22:05:04 +01:00
var file = SourceFile . fromString ( match . input , url: url ) ;
throw SourceSpanException ( message , file . span ( match . start , match . end ) ) ;
}