1+ import { parse , Rule , SyntaxTree } from "tns-core-modules/css" ;
2+ import { loader } from "webpack" ;
3+
4+ interface ImportRule extends Rule {
5+ import : string ;
6+ }
7+
8+ const betweenQuotesPattern = / ( ' | " ) ( .* ?) \1/ ;
9+ const unpackUrlPattern = / u r l \( ( [ ^ \) ] + ) \) / ;
10+
11+ const loader : loader . Loader = function ( content : string , map ) {
12+ const ast = parse ( content , undefined ) ;
13+
14+ let dependencies = [ ] ;
15+ getImportRules ( ast )
16+ . map ( extractUrlFromRule )
17+ . map ( createRequireUri )
18+ . forEach ( ( { uri, requireURI } ) => {
19+ dependencies . push ( `global.registerModule("${ uri } ", () => require("${ requireURI } "));` ) ;
20+
21+ // Call registerModule with requireURI to handle cases like @import "~@nativescript/theme/css/blue.css";
22+ if ( uri !== requireURI ) {
23+ dependencies . push ( `global.registerModule("${ requireURI } ", () => require("${ requireURI } "));` ) ;
24+ }
25+ } ) ;
26+ const str = JSON . stringify ( ast , ( k , v ) => k === "position" ? undefined : v ) ;
27+ this . callback ( null , `${ dependencies . join ( "\n" ) } module.exports = ${ str } ;` , map ) ;
28+ }
29+
30+ function getImportRules ( ast : SyntaxTree ) : ImportRule [ ] {
31+ if ( ! ast || ( < any > ast ) . type !== "stylesheet" || ! ast . stylesheet ) {
32+ return [ ] ;
33+ }
34+ return < ImportRule [ ] > ast . stylesheet . rules
35+ . filter ( rule => rule . type === "import" && ( < any > rule ) . import )
36+ }
37+
38+ /**
39+ * Extracts the url from import rule (ex. `url("./platform.css")`)
40+ */
41+ function extractUrlFromRule ( importRule : ImportRule ) : string {
42+ const urlValue = importRule . import ;
43+
44+ const unpackedUrlMatch = urlValue . match ( unpackUrlPattern ) ;
45+ const unpackedValue = unpackedUrlMatch ? unpackedUrlMatch [ 1 ] : urlValue
46+
47+ const quotesMatch = unpackedValue . match ( betweenQuotesPattern ) ;
48+ return quotesMatch ? quotesMatch [ 2 ] : unpackedValue ;
49+ } ;
50+
51+ function createRequireUri ( uri ) : { uri : string , requireURI : string } {
52+ return {
53+ uri : uri ,
54+ requireURI : uri [ 0 ] === "~" && uri [ 1 ] !== "/" ? uri . substr ( 1 ) : uri
55+ } ;
56+ }
57+
58+
59+
60+ export default loader ;
0 commit comments