Browse Source
* Dependency workflow add dependency correction value * Download workflow instance map width adjustment and change "desc" field to "description" * The third-party library that builds the dependency is recommended to be placed in 'devDependencies' * Tree chart and Gantt chart style modification * The workflow instance can be deleted only when its status is success, failure, stop and pause. * change desc to description * Maximum width of tooltip is set to 500px, note the copyright number of login page * Delete copyright number * No tenant in the list of selected tenants the default is default, and the status not shown in the repair page * repair * Repair security center module prompt * Remove blank character during verification * Remove blank character during verification * Non admin users cannot create users, tenants, alarm groups, queues and worker groups * Remove CI windows detection * The value of loadaverage should be two decimal places * Add license * delete docs * update package.json * delete LICENSE * Display icon when there is no data in process definition * Worker group add IP format verification * Modify MySQL page of monitoring center * DB page rename and background color modification * IO build replace with source code * Replace ans charts with source code * delete component-compiler-utilspull/2/head
break60
5 years ago
committed by
qiaozhanwei
38 changed files with 0 additions and 1963 deletions
@ -1,31 +0,0 @@ |
|||||||
# Javascript Node CircleCI 2.0 configuration file |
|
||||||
# |
|
||||||
# Check https://circleci.com/docs/2.0/language-javascript/ for more details |
|
||||||
# |
|
||||||
version: 2 |
|
||||||
jobs: |
|
||||||
build: |
|
||||||
docker: |
|
||||||
- image: circleci/node:6 |
|
||||||
|
|
||||||
working_directory: ~/repo |
|
||||||
|
|
||||||
steps: |
|
||||||
- checkout |
|
||||||
|
|
||||||
# Download and cache dependencies |
|
||||||
- restore_cache: |
|
||||||
keys: |
|
||||||
- v1-dependencies-{{ checksum "package.json" }} |
|
||||||
# fallback to using the latest cache if no exact match is found |
|
||||||
- v1-dependencies- |
|
||||||
|
|
||||||
- run: yarn install |
|
||||||
|
|
||||||
- save_cache: |
|
||||||
paths: |
|
||||||
- node_modules |
|
||||||
key: v1-dependencies-{{ checksum "package.json" }} |
|
||||||
|
|
||||||
# run tests! |
|
||||||
- run: yarn test |
|
@ -1,4 +0,0 @@ |
|||||||
module.exports = { |
|
||||||
semi: false, |
|
||||||
singleQuote: true |
|
||||||
} |
|
@ -1,125 +0,0 @@ |
|||||||
<a name="2.2.0"></a> |
|
||||||
# [2.2.0](https://github.com/vuejs/component-compiler-utils/compare/v2.1.2...v2.2.0) (2018-08-16) |
|
||||||
|
|
||||||
|
|
||||||
### Features |
|
||||||
|
|
||||||
* **scoped-css:** support leading >>> or /deep/ in selectors ([1a3b5bb](https://github.com/vuejs/component-compiler-utils/commit/1a3b5bb)) |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="2.1.2"></a> |
|
||||||
## [2.1.2](https://github.com/vuejs/component-compiler-utils/compare/v2.1.1...v2.1.2) (2018-08-09) |
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes |
|
||||||
|
|
||||||
* pin prettier version ([5f138a6](https://github.com/vuejs/component-compiler-utils/commit/5f138a6)) |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="2.1.1"></a> |
|
||||||
## [2.1.1](https://github.com/vuejs/component-compiler-utils/compare/v2.1.0...v2.1.1) (2018-08-07) |
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes |
|
||||||
|
|
||||||
* remove space after selector when inserting scoped attribute ([5b299ed](https://github.com/vuejs/component-compiler-utils/commit/5b299ed)), closes [vue-loader/#1370](https://github.com/vuejs/component-compiler-utils/issues/1370) |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="2.1.0"></a> |
|
||||||
# [2.1.0](https://github.com/vuejs/component-compiler-utils/compare/v2.0.0...v2.1.0) (2018-07-03) |
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes |
|
||||||
|
|
||||||
* Forward preprocessor options to less ([#25](https://github.com/vuejs/component-compiler-utils/issues/25)) ([3b19c1e](https://github.com/vuejs/component-compiler-utils/commit/3b19c1e)), closes [#24](https://github.com/vuejs/component-compiler-utils/issues/24) |
|
||||||
* should work with variable named render (close [#23](https://github.com/vuejs/component-compiler-utils/issues/23)) ([273827b](https://github.com/vuejs/component-compiler-utils/commit/273827b)) |
|
||||||
|
|
||||||
|
|
||||||
### Features |
|
||||||
|
|
||||||
* Support `stylus` as `<style>` lang ([#18](https://github.com/vuejs/component-compiler-utils/issues/18)) ([986084e](https://github.com/vuejs/component-compiler-utils/commit/986084e)) |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="2.0.0"></a> |
|
||||||
# [2.0.0](https://github.com/vuejs/component-compiler-utils/compare/v1.3.1...v2.0.0) (2018-06-03) |
|
||||||
|
|
||||||
|
|
||||||
### Features |
|
||||||
|
|
||||||
* Add async style compilation support ([#13](https://github.com/vuejs/component-compiler-utils/issues/13)) ([54464d6](https://github.com/vuejs/component-compiler-utils/commit/54464d6)) |
|
||||||
* allow/require compiler to be passed in for `parse` ([caa1538](https://github.com/vuejs/component-compiler-utils/commit/caa1538)) |
|
||||||
|
|
||||||
|
|
||||||
### BREAKING CHANGES |
|
||||||
|
|
||||||
* vue template compiler must now be passed to `parse` |
|
||||||
via options. |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="1.3.1"></a> |
|
||||||
## [1.3.1](https://github.com/vuejs/component-compiler-utils/compare/v1.3.0...v1.3.1) (2018-05-28) |
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes |
|
||||||
|
|
||||||
* default parser was removed from prettier ([#15](https://github.com/vuejs/component-compiler-utils/issues/15)) ([598224d](https://github.com/vuejs/component-compiler-utils/commit/598224d)) |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="1.3.0"></a> |
|
||||||
# [1.3.0](https://github.com/vuejs/component-compiler-utils/compare/v1.2.1...v1.3.0) (2018-05-22) |
|
||||||
|
|
||||||
|
|
||||||
### Features |
|
||||||
|
|
||||||
* include href for <image> in transformAssetUrls (close [#12](https://github.com/vuejs/component-compiler-utils/issues/12)) ([86fddc2](https://github.com/vuejs/component-compiler-utils/commit/86fddc2)) |
|
||||||
* Provide installation instructions on missing language preprocessors ([#10](https://github.com/vuejs/component-compiler-utils/issues/10)) ([97e772c](https://github.com/vuejs/component-compiler-utils/commit/97e772c)) |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="1.2.1"></a> |
|
||||||
## [1.2.1](https://github.com/vuejs/component-compiler-utils/compare/v1.2.0...v1.2.1) (2018-04-26) |
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes |
|
||||||
|
|
||||||
* postcss import ([c845a80](https://github.com/vuejs/component-compiler-utils/commit/c845a80)) |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="1.2.0"></a> |
|
||||||
# [1.2.0](https://github.com/vuejs/component-compiler-utils/compare/v1.1.0...v1.2.0) (2018-04-26) |
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes |
|
||||||
|
|
||||||
* compile only lib directory ([#6](https://github.com/vuejs/component-compiler-utils/issues/6)) ([4f787b3](https://github.com/vuejs/component-compiler-utils/commit/4f787b3)) |
|
||||||
|
|
||||||
|
|
||||||
### Features |
|
||||||
|
|
||||||
* accept postcss options and plugins ([#7](https://github.com/vuejs/component-compiler-utils/issues/7)) ([1456e3d](https://github.com/vuejs/component-compiler-utils/commit/1456e3d)) |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<a name="1.1.0"></a> |
|
||||||
# [1.1.0](https://github.com/vuejs/component-compiler-utils/compare/9204f16...v1.1.0) (2018-04-24) |
|
||||||
|
|
||||||
|
|
||||||
### Bug Fixes |
|
||||||
|
|
||||||
* use more strict regex for matching css animation rules ([4644727](https://github.com/vuejs/component-compiler-utils/commit/4644727)) |
|
||||||
|
|
||||||
|
|
||||||
### Features |
|
||||||
|
|
||||||
* adds stylus & less preprocessor ([#5](https://github.com/vuejs/component-compiler-utils/issues/5)) ([f2fd8b9](https://github.com/vuejs/component-compiler-utils/commit/f2fd8b9)) |
|
||||||
* preprocess scss/sass styles with node-sass ([#4](https://github.com/vuejs/component-compiler-utils/issues/4)) ([9204f16](https://github.com/vuejs/component-compiler-utils/commit/9204f16)) |
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,146 +0,0 @@ |
|||||||
# @vue/component-compiler-utils [![Build Status](https://circleci.com/gh/vuejs/component-compiler-utils/tree/master.svg?style=shield)](https://circleci.com/gh/vuejs/component-compiler-utils/) |
|
||||||
|
|
||||||
> Lower level utilities for compiling Vue single file components |
|
||||||
|
|
||||||
This package contains lower level utilities that you can use if you are writing a plugin / transform for a bundler or module system that compiles Vue single file components into JavaScript. It is used in [vue-loader](https://github.com/vuejs/vue-loader) version 15 and above. |
|
||||||
|
|
||||||
The API surface is intentionally minimal - the goal is to reuse as much as possible while being as flexible as possible. |
|
||||||
|
|
||||||
## Why isn't `vue-template-compiler` a peerDependency? |
|
||||||
|
|
||||||
Since this package is more often used as a low-level utility, it is usually a transitive dependency in an actual Vue project. It is therefore the responsibility of the higher-level package (e.g. `vue-loader`) to inject `vue-template-compiler` via options when calling the `parse` and `compileTemplate` methods. |
|
||||||
|
|
||||||
Not listing it as a peer depedency also allows tooling authors to use a non-default template compiler instead of `vue-template-compiler` without having to include it just to fullfil the peer dep requirement. |
|
||||||
|
|
||||||
## API |
|
||||||
|
|
||||||
### parse(ParseOptions): SFCDescriptor |
|
||||||
|
|
||||||
Parse raw single file component source into a descriptor with source maps. The actual compiler (`vue-template-compiler`) must be passed in via the `compiler` option so that the specific version used can be determined by the end user. |
|
||||||
|
|
||||||
``` ts |
|
||||||
interface ParseOptions { |
|
||||||
source: string |
|
||||||
filename?: string |
|
||||||
compiler: VueTemplateCompiler |
|
||||||
// https://github.com/vuejs/vue/tree/dev/packages/vue-template-compiler#compilerparsecomponentfile-options |
|
||||||
// defualt: { pad: 'line' } |
|
||||||
compilerParseOptions?: VueTemplateCompilerParseOptions |
|
||||||
sourceRoot?: string |
|
||||||
needMap?: boolean |
|
||||||
} |
|
||||||
|
|
||||||
interface SFCDescriptor { |
|
||||||
template?: SFCBlock |
|
||||||
script?: SFCBlock |
|
||||||
styles: SFCBlock[] |
|
||||||
customBlocks: SFCCustomBlock[] |
|
||||||
} |
|
||||||
|
|
||||||
interface SFCCustomBlock { |
|
||||||
type: string |
|
||||||
content: string |
|
||||||
attrs: { [key: string]: string } |
|
||||||
start: number |
|
||||||
end: number |
|
||||||
map: RawSourceMap |
|
||||||
} |
|
||||||
|
|
||||||
interface SFCBlock extends SFCCustomBlock { |
|
||||||
lang?: string |
|
||||||
src?: string |
|
||||||
scoped?: boolean |
|
||||||
module?: string | boolean |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
### compileTemplate(TemplateCompileOptions): TemplateCompileResults |
|
||||||
|
|
||||||
Takes raw template source and compile it into JavaScript code. The actual compiler (`vue-template-compiler`) must be passed in via the `compiler` option so that the specific version used can be determined by the end user. |
|
||||||
|
|
||||||
It can also optionally perform pre-processing for any templating engine supported by [consolidate](https://github.com/tj/consolidate.js/). |
|
||||||
|
|
||||||
``` ts |
|
||||||
interface TemplateCompileOptions { |
|
||||||
source: string |
|
||||||
filename: string |
|
||||||
|
|
||||||
compiler: VueTemplateCompiler |
|
||||||
https://github.com/vuejs/vue/tree/dev/packages/vue-template-compiler#compilercompiletemplate-options |
|
||||||
// default: {} |
|
||||||
compilerOptions?: VueTemplateCompilerOptions |
|
||||||
|
|
||||||
// Template preprocessor |
|
||||||
preprocessLang?: string |
|
||||||
preprocessOptions?: any |
|
||||||
|
|
||||||
// Transform asset urls found in the template into `require()` calls |
|
||||||
// This is off by default. If set to true, the default value is |
|
||||||
// { |
|
||||||
// video: ['src', 'poster'], |
|
||||||
// source: 'src', |
|
||||||
// img: 'src', |
|
||||||
// image: 'xlink:href' |
|
||||||
// } |
|
||||||
transformAssetUrls?: AssetURLOptions | boolean |
|
||||||
|
|
||||||
// For vue-template-es2015-compiler, which is a fork of Buble |
|
||||||
transpileOptions?: any |
|
||||||
|
|
||||||
isProduction?: boolean // default: false |
|
||||||
isFunctional?: boolean // default: false |
|
||||||
optimizeSSR?: boolean // default: false |
|
||||||
} |
|
||||||
|
|
||||||
interface TemplateCompileResult { |
|
||||||
code: string |
|
||||||
source: string |
|
||||||
tips: string[] |
|
||||||
errors: string[] |
|
||||||
} |
|
||||||
|
|
||||||
interface AssetURLOptions { |
|
||||||
[name: string]: string | string[] |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
#### Handling the Output |
|
||||||
|
|
||||||
The resulting JavaScript code will look like this: |
|
||||||
|
|
||||||
``` js |
|
||||||
var render = function (h) { /* ... */} |
|
||||||
var staticRenderFns = [function (h) { /* ... */}, function (h) { /* ... */}] |
|
||||||
``` |
|
||||||
|
|
||||||
It **does NOT** assume any module system. It is your responsibility to handle the exports, if needed. |
|
||||||
|
|
||||||
### compileStyle(StyleCompileOptions) |
|
||||||
|
|
||||||
Take input raw CSS and applies scoped CSS transform. It does NOT handle pre-processors. If the component doesn't use scoped CSS then this step can be skipped. |
|
||||||
|
|
||||||
``` ts |
|
||||||
interface StyleCompileOptions { |
|
||||||
source: string |
|
||||||
filename: string |
|
||||||
id: string |
|
||||||
map?: any |
|
||||||
scoped?: boolean |
|
||||||
trim?: boolean |
|
||||||
preprocessLang?: string |
|
||||||
preprocessOptions?: any |
|
||||||
postcssOptions?: any |
|
||||||
postcssPlugins?: any[] |
|
||||||
} |
|
||||||
|
|
||||||
interface StyleCompileResults { |
|
||||||
code: string |
|
||||||
map: any | void |
|
||||||
rawResult: LazyResult | void // raw lazy result from PostCSS |
|
||||||
errors: string[] |
|
||||||
} |
|
||||||
``` |
|
||||||
|
|
||||||
### compileStyleAsync(StyleCompileOptions) |
|
||||||
|
|
||||||
Same as `compileStyle(StyleCompileOptions)` but it returns a Promise resolving to `StyleCompileResults`. It can be used with async postcss plugins. |
|
@ -1,25 +0,0 @@ |
|||||||
import { LazyResult } from 'postcss'; |
|
||||||
export interface StyleCompileOptions { |
|
||||||
source: string; |
|
||||||
filename: string; |
|
||||||
id: string; |
|
||||||
map?: any; |
|
||||||
scoped?: boolean; |
|
||||||
trim?: boolean; |
|
||||||
preprocessLang?: string; |
|
||||||
preprocessOptions?: any; |
|
||||||
postcssOptions?: any; |
|
||||||
postcssPlugins?: any[]; |
|
||||||
} |
|
||||||
export interface AsyncStyleCompileOptions extends StyleCompileOptions { |
|
||||||
isAsync?: boolean; |
|
||||||
} |
|
||||||
export interface StyleCompileResults { |
|
||||||
code: string; |
|
||||||
map: any | void; |
|
||||||
rawResult: LazyResult | void; |
|
||||||
errors: string[]; |
|
||||||
} |
|
||||||
export declare function compileStyle(options: StyleCompileOptions): StyleCompileResults; |
|
||||||
export declare function compileStyleAsync(options: StyleCompileOptions): Promise<StyleCompileResults>; |
|
||||||
export declare function doCompileStyle(options: AsyncStyleCompileOptions): StyleCompileResults; |
|
@ -1,78 +0,0 @@ |
|||||||
"use strict"; |
|
||||||
Object.defineProperty(exports, "__esModule", { value: true }); |
|
||||||
const postcss = require('postcss'); |
|
||||||
const trim_1 = require("./stylePlugins/trim"); |
|
||||||
const scoped_1 = require("./stylePlugins/scoped"); |
|
||||||
const styleProcessors_1 = require("./styleProcessors"); |
|
||||||
function compileStyle(options) { |
|
||||||
return doCompileStyle(Object.assign({}, options, { isAsync: false })); |
|
||||||
} |
|
||||||
exports.compileStyle = compileStyle; |
|
||||||
function compileStyleAsync(options) { |
|
||||||
return Promise.resolve(doCompileStyle(Object.assign({}, options, { isAsync: true }))); |
|
||||||
} |
|
||||||
exports.compileStyleAsync = compileStyleAsync; |
|
||||||
function doCompileStyle(options) { |
|
||||||
const { filename, id, scoped = true, trim = true, preprocessLang, postcssOptions, postcssPlugins } = options; |
|
||||||
const preprocessor = preprocessLang && styleProcessors_1.processors[preprocessLang]; |
|
||||||
const preProcessedSource = preprocessor && preprocess(options, preprocessor); |
|
||||||
const map = preProcessedSource ? preProcessedSource.map : options.map; |
|
||||||
const source = preProcessedSource ? preProcessedSource.code : options.source; |
|
||||||
const plugins = (postcssPlugins || []).slice(); |
|
||||||
if (trim) { |
|
||||||
plugins.push(trim_1.default()); |
|
||||||
} |
|
||||||
if (scoped) { |
|
||||||
plugins.push(scoped_1.default(id)); |
|
||||||
} |
|
||||||
const postCSSOptions = Object.assign({}, postcssOptions, { to: filename, from: filename }); |
|
||||||
if (map) { |
|
||||||
postCSSOptions.map = { |
|
||||||
inline: false, |
|
||||||
annotation: false, |
|
||||||
prev: map |
|
||||||
}; |
|
||||||
} |
|
||||||
let result, code, outMap; |
|
||||||
const errors = []; |
|
||||||
if (preProcessedSource && preProcessedSource.errors.length) { |
|
||||||
errors.push(...preProcessedSource.errors); |
|
||||||
} |
|
||||||
try { |
|
||||||
result = postcss(plugins).process(source, postCSSOptions); |
|
||||||
// In async mode, return a promise.
|
|
||||||
if (options.isAsync) { |
|
||||||
return result |
|
||||||
.then((result) => ({ |
|
||||||
code: result.css || '', |
|
||||||
map: result.map && result.map.toJSON(), |
|
||||||
errors, |
|
||||||
rawResult: result |
|
||||||
})) |
|
||||||
.catch((error) => ({ |
|
||||||
code: '', |
|
||||||
map: undefined, |
|
||||||
errors: [...errors, error.message], |
|
||||||
rawResult: undefined |
|
||||||
})); |
|
||||||
} |
|
||||||
// force synchronous transform (we know we only have sync plugins)
|
|
||||||
code = result.css; |
|
||||||
outMap = result.map; |
|
||||||
} |
|
||||||
catch (e) { |
|
||||||
errors.push(e); |
|
||||||
} |
|
||||||
return { |
|
||||||
code: code || ``, |
|
||||||
map: outMap && outMap.toJSON(), |
|
||||||
errors, |
|
||||||
rawResult: result |
|
||||||
}; |
|
||||||
} |
|
||||||
exports.doCompileStyle = doCompileStyle; |
|
||||||
function preprocess(options, preprocessor) { |
|
||||||
return preprocessor.render(options.source, options.map, Object.assign({ |
|
||||||
filename: options.filename |
|
||||||
}, options.preprocessOptions)); |
|
||||||
} |
|
@ -1,22 +0,0 @@ |
|||||||
import { VueTemplateCompiler, VueTemplateCompilerOptions } from './types'; |
|
||||||
import { AssetURLOptions } from './templateCompilerModules/assetUrl'; |
|
||||||
export interface TemplateCompileOptions { |
|
||||||
source: string; |
|
||||||
filename: string; |
|
||||||
compiler: VueTemplateCompiler; |
|
||||||
compilerOptions?: VueTemplateCompilerOptions; |
|
||||||
transformAssetUrls?: AssetURLOptions | boolean; |
|
||||||
preprocessLang?: string; |
|
||||||
preprocessOptions?: any; |
|
||||||
transpileOptions?: any; |
|
||||||
isProduction?: boolean; |
|
||||||
isFunctional?: boolean; |
|
||||||
optimizeSSR?: boolean; |
|
||||||
} |
|
||||||
export interface TemplateCompileResult { |
|
||||||
code: string; |
|
||||||
source: string; |
|
||||||
tips: string[]; |
|
||||||
errors: string[]; |
|
||||||
} |
|
||||||
export declare function compileTemplate(options: TemplateCompileOptions): TemplateCompileResult; |
|
@ -1,106 +0,0 @@ |
|||||||
"use strict"; |
|
||||||
Object.defineProperty(exports, "__esModule", { value: true }); |
|
||||||
const assetUrl_1 = require("./templateCompilerModules/assetUrl"); |
|
||||||
const srcset_1 = require("./templateCompilerModules/srcset"); |
|
||||||
const prettier = require('prettier'); |
|
||||||
const consolidate = require('consolidate'); |
|
||||||
const transpile = require('vue-template-es2015-compiler'); |
|
||||||
function compileTemplate(options) { |
|
||||||
const { preprocessLang } = options; |
|
||||||
const preprocessor = preprocessLang && consolidate[preprocessLang]; |
|
||||||
if (preprocessor) { |
|
||||||
return actuallyCompile(Object.assign({}, options, { |
|
||||||
source: preprocess(options, preprocessor) |
|
||||||
})); |
|
||||||
} |
|
||||||
else if (preprocessLang) { |
|
||||||
return { |
|
||||||
code: `var render = function () {}\n` + `var staticRenderFns = []\n`, |
|
||||||
source: options.source, |
|
||||||
tips: [ |
|
||||||
`Component ${options.filename} uses lang ${preprocessLang} for template. Please install the language preprocessor.` |
|
||||||
], |
|
||||||
errors: [ |
|
||||||
`Component ${options.filename} uses lang ${preprocessLang} for template, however it is not installed.` |
|
||||||
] |
|
||||||
}; |
|
||||||
} |
|
||||||
else { |
|
||||||
return actuallyCompile(options); |
|
||||||
} |
|
||||||
} |
|
||||||
exports.compileTemplate = compileTemplate; |
|
||||||
function preprocess(options, preprocessor) { |
|
||||||
const { source, filename, preprocessOptions } = options; |
|
||||||
const finalPreprocessOptions = Object.assign({ |
|
||||||
filename |
|
||||||
}, preprocessOptions); |
|
||||||
// Consolidate exposes a callback based API, but the callback is in fact
|
|
||||||
// called synchronously for most templating engines. In our case, we have to
|
|
||||||
// expose a synchronous API so that it is usable in Jest transforms (which
|
|
||||||
// have to be sync because they are applied via Node.js require hooks)
|
|
||||||
let res, err; |
|
||||||
preprocessor.render(source, finalPreprocessOptions, (_err, _res) => { |
|
||||||
if (_err) |
|
||||||
err = _err; |
|
||||||
res = _res; |
|
||||||
}); |
|
||||||
if (err) |
|
||||||
throw err; |
|
||||||
return res; |
|
||||||
} |
|
||||||
function actuallyCompile(options) { |
|
||||||
const { source, compiler, compilerOptions = {}, transpileOptions = {}, transformAssetUrls, isProduction = process.env.NODE_ENV === 'production', isFunctional = false, optimizeSSR = false } = options; |
|
||||||
const compile = optimizeSSR && compiler.ssrCompile ? compiler.ssrCompile : compiler.compile; |
|
||||||
let finalCompilerOptions = compilerOptions; |
|
||||||
if (transformAssetUrls) { |
|
||||||
const builtInModules = [ |
|
||||||
transformAssetUrls === true |
|
||||||
? assetUrl_1.default() |
|
||||||
: assetUrl_1.default(transformAssetUrls), |
|
||||||
srcset_1.default() |
|
||||||
]; |
|
||||||
finalCompilerOptions = Object.assign({}, compilerOptions, { |
|
||||||
modules: [...builtInModules, ...(compilerOptions.modules || [])] |
|
||||||
}); |
|
||||||
} |
|
||||||
const { render, staticRenderFns, tips, errors } = compile(source, finalCompilerOptions); |
|
||||||
if (errors && errors.length) { |
|
||||||
return { |
|
||||||
code: `var render = function () {}\n` + `var staticRenderFns = []\n`, |
|
||||||
source, |
|
||||||
tips, |
|
||||||
errors |
|
||||||
}; |
|
||||||
} |
|
||||||
else { |
|
||||||
const finalTranspileOptions = Object.assign({}, transpileOptions, { |
|
||||||
transforms: Object.assign({}, transpileOptions.transforms, { |
|
||||||
stripWithFunctional: isFunctional |
|
||||||
}) |
|
||||||
}); |
|
||||||
const toFunction = (code) => { |
|
||||||
return `function (${isFunctional ? `_h,_vm` : ``}) {${code}}`; |
|
||||||
}; |
|
||||||
// transpile code with vue-template-es2015-compiler, which is a forked
|
|
||||||
// version of Buble that applies ES2015 transforms + stripping `with` usage
|
|
||||||
let code = transpile(`var __render__ = ${toFunction(render)}\n` + |
|
||||||
`var __staticRenderFns__ = [${staticRenderFns.map(toFunction)}]`, finalTranspileOptions) + `\n`; |
|
||||||
// #23 we use __render__ to avoid `render` not being prefixed by the
|
|
||||||
// transpiler when stripping with, but revert it back to `render` to
|
|
||||||
// maintain backwards compat
|
|
||||||
code = code.replace(/\s__(render|staticRenderFns)__\s/g, ' $1 '); |
|
||||||
if (!isProduction) { |
|
||||||
// mark with stripped (this enables Vue to use correct runtime proxy
|
|
||||||
// detection)
|
|
||||||
code += `render._withStripped = true`; |
|
||||||
code = prettier.format(code, { semi: false, parser: 'babylon' }); |
|
||||||
} |
|
||||||
return { |
|
||||||
code, |
|
||||||
source, |
|
||||||
tips, |
|
||||||
errors |
|
||||||
}; |
|
||||||
} |
|
||||||
} |
|
@ -1,5 +0,0 @@ |
|||||||
import { parse, SFCBlock, SFCCustomBlock, SFCDescriptor } from './parse'; |
|
||||||
import { compileTemplate, TemplateCompileOptions, TemplateCompileResult } from './compileTemplate'; |
|
||||||
import { compileStyle, compileStyleAsync, StyleCompileOptions, StyleCompileResults } from './compileStyle'; |
|
||||||
export { parse, compileTemplate, compileStyle, compileStyleAsync }; |
|
||||||
export { SFCBlock, SFCCustomBlock, SFCDescriptor, TemplateCompileOptions, TemplateCompileResult, StyleCompileOptions, StyleCompileResults }; |
|
@ -1,9 +0,0 @@ |
|||||||
"use strict"; |
|
||||||
Object.defineProperty(exports, "__esModule", { value: true }); |
|
||||||
const parse_1 = require("./parse"); |
|
||||||
exports.parse = parse_1.parse; |
|
||||||
const compileTemplate_1 = require("./compileTemplate"); |
|
||||||
exports.compileTemplate = compileTemplate_1.compileTemplate; |
|
||||||
const compileStyle_1 = require("./compileStyle"); |
|
||||||
exports.compileStyle = compileStyle_1.compileStyle; |
|
||||||
exports.compileStyleAsync = compileStyle_1.compileStyleAsync; |
|
@ -1,32 +0,0 @@ |
|||||||
import { RawSourceMap, VueTemplateCompiler, VueTemplateCompilerParseOptions } from './types'; |
|
||||||
export interface ParseOptions { |
|
||||||
source: string; |
|
||||||
filename?: string; |
|
||||||
compiler: VueTemplateCompiler; |
|
||||||
compilerParseOptions?: VueTemplateCompilerParseOptions; |
|
||||||
sourceRoot?: string; |
|
||||||
needMap?: boolean; |
|
||||||
} |
|
||||||
export interface SFCCustomBlock { |
|
||||||
type: string; |
|
||||||
content: string; |
|
||||||
attrs: { |
|
||||||
[key: string]: string; |
|
||||||
}; |
|
||||||
start: number; |
|
||||||
end: number; |
|
||||||
map: RawSourceMap; |
|
||||||
} |
|
||||||
export interface SFCBlock extends SFCCustomBlock { |
|
||||||
lang?: string; |
|
||||||
src?: string; |
|
||||||
scoped?: boolean; |
|
||||||
module?: string | boolean; |
|
||||||
} |
|
||||||
export interface SFCDescriptor { |
|
||||||
template?: SFCBlock; |
|
||||||
script?: SFCBlock; |
|
||||||
styles: SFCBlock[]; |
|
||||||
customBlocks: SFCCustomBlock[]; |
|
||||||
} |
|
||||||
export declare function parse(options: ParseOptions): SFCDescriptor; |
|
@ -1,53 +0,0 @@ |
|||||||
"use strict"; |
|
||||||
Object.defineProperty(exports, "__esModule", { value: true }); |
|
||||||
const hash = require('hash-sum'); |
|
||||||
const cache = require('lru-cache')(100); |
|
||||||
const { SourceMapGenerator } = require('source-map'); |
|
||||||
const splitRE = /\r?\n/g; |
|
||||||
const emptyRE = /^(?:\/\/)?\s*$/; |
|
||||||
function parse(options) { |
|
||||||
const { source, filename = '', compiler, compilerParseOptions = { pad: 'line' }, sourceRoot = process.cwd(), needMap = true } = options; |
|
||||||
const cacheKey = hash(filename + source); |
|
||||||
let output = cache.get(cacheKey); |
|
||||||
if (output) |
|
||||||
return output; |
|
||||||
output = compiler.parseComponent(source, compilerParseOptions); |
|
||||||
if (needMap) { |
|
||||||
if (output.script && !output.script.src) { |
|
||||||
output.script.map = generateSourceMap(filename, source, output.script.content, sourceRoot); |
|
||||||
} |
|
||||||
if (output.styles) { |
|
||||||
output.styles.forEach(style => { |
|
||||||
if (!style.src) { |
|
||||||
style.map = generateSourceMap(filename, source, style.content, sourceRoot); |
|
||||||
} |
|
||||||
}); |
|
||||||
} |
|
||||||
} |
|
||||||
cache.set(cacheKey, output); |
|
||||||
return output; |
|
||||||
} |
|
||||||
exports.parse = parse; |
|
||||||
function generateSourceMap(filename, source, generated, sourceRoot) { |
|
||||||
const map = new SourceMapGenerator({ |
|
||||||
file: filename, |
|
||||||
sourceRoot |
|
||||||
}); |
|
||||||
map.setSourceContent(filename, source); |
|
||||||
generated.split(splitRE).forEach((line, index) => { |
|
||||||
if (!emptyRE.test(line)) { |
|
||||||
map.addMapping({ |
|
||||||
source: filename, |
|
||||||
original: { |
|
||||||
line: index + 1, |
|
||||||
column: 0 |
|
||||||
}, |
|
||||||
generated: { |
|
||||||
line: index + 1, |
|
||||||
column: 0 |
|
||||||
} |
|
||||||
}); |
|
||||||
} |
|
||||||
}); |
|
||||||
return map.toJSON(); |
|
||||||
} |
|
@ -1,3 +0,0 @@ |
|||||||
import * as postcss from 'postcss'; |
|
||||||
declare const _default: postcss.Plugin<any>; |
|
||||||
export default _default; |
|
@ -1,95 +0,0 @@ |
|||||||
"use strict"; |
|
||||||
Object.defineProperty(exports, "__esModule", { value: true }); |
|
||||||
const postcss = require("postcss"); |
|
||||||
// postcss-selector-parser does have typings but it's problematic to work with.
|
|
||||||
const selectorParser = require('postcss-selector-parser'); |
|
||||||
exports.default = postcss.plugin('add-id', (options) => (root) => { |
|
||||||
const id = options; |
|
||||||
const keyframes = Object.create(null); |
|
||||||
root.each(function rewriteSelector(node) { |
|
||||||
if (!node.selector) { |
|
||||||
// handle media queries
|
|
||||||
if (node.type === 'atrule') { |
|
||||||
if (node.name === 'media' || node.name === 'supports') { |
|
||||||
node.each(rewriteSelector); |
|
||||||
} |
|
||||||
else if (/-?keyframes$/.test(node.name)) { |
|
||||||
// register keyframes
|
|
||||||
keyframes[node.params] = node.params = node.params + '-' + id; |
|
||||||
} |
|
||||||
} |
|
||||||
return; |
|
||||||
} |
|
||||||
node.selector = selectorParser((selectors) => { |
|
||||||
selectors.each((selector) => { |
|
||||||
let node = null; |
|
||||||
let hasDeep = false; |
|
||||||
selector.each((n) => { |
|
||||||
// ">>>" combinator
|
|
||||||
if (n.type === 'combinator' && n.value === '>>>') { |
|
||||||
n.value = ' '; |
|
||||||
n.spaces.before = n.spaces.after = ''; |
|
||||||
hasDeep = true; |
|
||||||
return false; |
|
||||||
} |
|
||||||
// /deep/ alias for >>>, since >>> doesn't work in SASS
|
|
||||||
if (n.type === 'tag' && n.value === '/deep/') { |
|
||||||
const prev = n.prev(); |
|
||||||
if (prev && prev.type === 'combinator' && prev.value === ' ') { |
|
||||||
prev.remove(); |
|
||||||
} |
|
||||||
n.remove(); |
|
||||||
hasDeep = true; |
|
||||||
return false; |
|
||||||
} |
|
||||||
if (n.type !== 'pseudo' && n.type !== 'combinator') { |
|
||||||
node = n; |
|
||||||
} |
|
||||||
}); |
|
||||||
if (node) { |
|
||||||
node.spaces.after = ''; |
|
||||||
selector.insertAfter(node, selectorParser.attribute({ |
|
||||||
attribute: id |
|
||||||
})); |
|
||||||
} |
|
||||||
else if (hasDeep) { |
|
||||||
selector.prepend(selectorParser.attribute({ |
|
||||||
attribute: id |
|
||||||
})); |
|
||||||
} |
|
||||||
}); |
|
||||||
}).processSync(node.selector); |
|
||||||
}); |
|
||||||
// If keyframes are found in this <style>, find and rewrite animation names
|
|
||||||
// in declarations.
|
|
||||||
// Caveat: this only works for keyframes and animation rules in the same
|
|
||||||
// <style> element.
|
|
||||||
if (Object.keys(keyframes).length) { |
|
||||||
root.walkDecls(decl => { |
|
||||||
// individual animation-name declaration
|
|
||||||
if (/^(-\w+-)?animation-name$/.test(decl.prop)) { |
|
||||||
decl.value = decl.value |
|
||||||
.split(',') |
|
||||||
.map(v => keyframes[v.trim()] || v.trim()) |
|
||||||
.join(','); |
|
||||||
} |
|
||||||
// shorthand
|
|
||||||
if (/^(-\w+-)?animation$/.test(decl.prop)) { |
|
||||||
decl.value = decl.value |
|
||||||
.split(',') |
|
||||||
.map(v => { |
|
||||||
const vals = v.trim().split(/\s+/); |
|
||||||
const i = vals.findIndex(val => keyframes[val]); |
|
||||||
if (i !== -1) { |
|
||||||
vals.splice(i, 1, keyframes[vals[i]]); |
|
||||||
return vals.join(' '); |
|
||||||
} |
|
||||||
else { |
|
||||||
return v; |
|
||||||
} |
|
||||||
}) |
|
||||||
.join(','); |
|
||||||
} |
|
||||||
}); |
|
||||||
} |
|
||||||
}); |
|
@ -1,3 +0,0 @@ |
|||||||
import * as postcss from 'postcss'; |
|
||||||
declare const _default: postcss.Plugin<{}>; |
|
||||||
export default _default; |
|
@ -1,10 +0,0 @@ |
|||||||
"use strict"; |
|
||||||
Object.defineProperty(exports, "__esModule", { value: true }); |
|
||||||
const postcss = require("postcss"); |
|
||||||
exports.default = postcss.plugin('trim', () => (css) => { |
|
||||||
css.walk(({ type, raws }) => { |
|
||||||
if (type === 'rule' || type === 'atrule') { |
|
||||||
raws.before = raws.after = '\n'; |
|
||||||
} |
|
||||||
}); |
|
||||||
}); |
|
@ -1,11 +0,0 @@ |
|||||||
export interface StylePreprocessor { |
|
||||||
render(source: string, map: any | null, options: any): StylePreprocessorResults; |
|
||||||
} |
|
||||||
export interface StylePreprocessorResults { |
|
||||||
code: string; |
|
||||||
map?: any; |
|
||||||
errors: Array<Error>; |
|
||||||
} |
|
||||||
export declare const processors: { |
|
||||||
[key: string]: StylePreprocessor; |
|
||||||
}; |
|
@ -1,87 +0,0 @@ |
|||||||
"use strict"; |
|
||||||
Object.defineProperty(exports, "__esModule", { value: true }); |
|
||||||
const merge = require('merge-source-map'); |
|
||||||
// .scss/.sass processor
|
|
||||||
const scss = { |
|
||||||
render(source, map, options) { |
|
||||||
const nodeSass = require('node-sass'); |
|
||||||
const finalOptions = Object.assign({}, options, { |
|
||||||
data: source, |
|
||||||
file: options.filename, |
|
||||||
outFile: options.filename, |
|
||||||
sourceMap: !!map |
|
||||||
}); |
|
||||||
try { |
|
||||||
const result = nodeSass.renderSync(finalOptions); |
|
||||||
if (map) { |
|
||||||
return { |
|
||||||
code: result.css.toString(), |
|
||||||
map: merge(map, JSON.parse(result.map.toString())), |
|
||||||
errors: [] |
|
||||||
}; |
|
||||||
} |
|
||||||
return { code: result.css.toString(), errors: [] }; |
|
||||||
} |
|
||||||
catch (e) { |
|
||||||
return { code: '', errors: [e] }; |
|
||||||
} |
|
||||||
} |
|
||||||
}; |
|
||||||
const sass = { |
|
||||||
render(source, map, options) { |
|
||||||
return scss.render(source, map, Object.assign({}, options, { indentedSyntax: true })); |
|
||||||
} |
|
||||||
}; |
|
||||||
// .less
|
|
||||||
const less = { |
|
||||||
render(source, map, options) { |
|
||||||
const nodeLess = require('less'); |
|
||||||
let result; |
|
||||||
let error = null; |
|
||||||
nodeLess.render(source, Object.assign({}, options, { syncImport: true }), (err, output) => { |
|
||||||
error = err; |
|
||||||
result = output; |
|
||||||
}); |
|
||||||
if (error) |
|
||||||
return { code: '', errors: [error] }; |
|
||||||
if (map) { |
|
||||||
return { |
|
||||||
code: result.css.toString(), |
|
||||||
map: merge(map, result.map), |
|
||||||
errors: [] |
|
||||||
}; |
|
||||||
} |
|
||||||
return { code: result.css.toString(), errors: [] }; |
|
||||||
} |
|
||||||
}; |
|
||||||
// .styl
|
|
||||||
const styl = { |
|
||||||
render(source, map, options) { |
|
||||||
const nodeStylus = require('stylus'); |
|
||||||
try { |
|
||||||
const ref = nodeStylus(source); |
|
||||||
Object.keys(options).forEach(key => ref.set(key, options[key])); |
|
||||||
if (map) |
|
||||||
ref.set('sourcemap', { inline: false, comment: false }); |
|
||||||
const result = ref.render(); |
|
||||||
if (map) { |
|
||||||
return { |
|
||||||
code: result, |
|
||||||
map: merge(map, ref.sourcemap), |
|
||||||
errors: [] |
|
||||||
}; |
|
||||||
} |
|
||||||
return { code: result, errors: [] }; |
|
||||||
} |
|
||||||
catch (e) { |
|
||||||
return { code: '', errors: [e] }; |
|
||||||
} |
|
||||||
} |
|
||||||
}; |
|
||||||
exports.processors = { |
|
||||||
less, |
|
||||||
sass, |
|
||||||
scss, |
|
||||||
styl, |
|
||||||
stylus: styl |
|
||||||
}; |
|
@ -1,8 +0,0 @@ |
|||||||
import { ASTNode } from './utils'; |
|
||||||
export interface AssetURLOptions { |
|
||||||
[name: string]: string | string[]; |
|
||||||
} |
|
||||||
declare const _default: (userOptions?: AssetURLOptions | undefined) => { |
|
||||||
postTransformNode: (node: ASTNode) => void; |
|
||||||
}; |
|
||||||
export default _default; |
|
@ -1,44 +0,0 @@ |
|||||||
"use strict"; |
|
||||||
// vue compiler module for transforming `<tag>:<attribute>` to `require`
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true }); |
|
||||||
const utils_1 = require("./utils"); |
|
||||||
const defaultOptions = { |
|
||||||
video: ['src', 'poster'], |
|
||||||
source: 'src', |
|
||||||
img: 'src', |
|
||||||
image: ['xlink:href', 'href'] |
|
||||||
}; |
|
||||||
exports.default = (userOptions) => { |
|
||||||
const options = userOptions |
|
||||||
? Object.assign({}, defaultOptions, userOptions) |
|
||||||
: defaultOptions; |
|
||||||
return { |
|
||||||
postTransformNode: (node) => { |
|
||||||
transform(node, options); |
|
||||||
} |
|
||||||
}; |
|
||||||
}; |
|
||||||
function transform(node, options) { |
|
||||||
for (const tag in options) { |
|
||||||
if ((tag === '*' || node.tag === tag) && node.attrs) { |
|
||||||
const attributes = options[tag]; |
|
||||||
if (typeof attributes === 'string') { |
|
||||||
node.attrs.some(attr => rewrite(attr, attributes)); |
|
||||||
} |
|
||||||
else if (Array.isArray(attributes)) { |
|
||||||
attributes.forEach(item => node.attrs.some(attr => rewrite(attr, item))); |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
function rewrite(attr, name) { |
|
||||||
if (attr.name === name) { |
|
||||||
const value = attr.value; |
|
||||||
// only transform static URLs
|
|
||||||
if (value.charAt(0) === '"' && value.charAt(value.length - 1) === '"') { |
|
||||||
attr.value = utils_1.urlToRequire(value.slice(1, -1)); |
|
||||||
return true; |
|
||||||
} |
|
||||||
} |
|
||||||
return false; |
|
||||||
} |
|
@ -1,5 +0,0 @@ |
|||||||
import { ASTNode } from './utils'; |
|
||||||
declare const _default: () => { |
|
||||||
postTransformNode: (node: ASTNode) => void; |
|
||||||
}; |
|
||||||
export default _default; |
|
@ -1,51 +0,0 @@ |
|||||||
"use strict"; |
|
||||||
// vue compiler module for transforming `img:srcset` to a number of `require`s
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true }); |
|
||||||
const utils_1 = require("./utils"); |
|
||||||
exports.default = () => ({ |
|
||||||
postTransformNode: (node) => { |
|
||||||
transform(node); |
|
||||||
} |
|
||||||
}); |
|
||||||
// http://w3c.github.io/html/semantics-embedded-content.html#ref-for-image-candidate-string-5
|
|
||||||
const escapedSpaceCharacters = /( |\\t|\\n|\\f|\\r)+/g; |
|
||||||
function transform(node) { |
|
||||||
const tags = ['img', 'source']; |
|
||||||
if (tags.indexOf(node.tag) !== -1 && node.attrs) { |
|
||||||
node.attrs.forEach(attr => { |
|
||||||
if (attr.name === 'srcset') { |
|
||||||
// same logic as in transform-require.js
|
|
||||||
const value = attr.value; |
|
||||||
const isStatic = value.charAt(0) === '"' && value.charAt(value.length - 1) === '"'; |
|
||||||
if (!isStatic) { |
|
||||||
return; |
|
||||||
} |
|
||||||
const imageCandidates = value |
|
||||||
.substr(1, value.length - 2) |
|
||||||
.split(',') |
|
||||||
.map(s => { |
|
||||||
// The attribute value arrives here with all whitespace, except
|
|
||||||
// normal spaces, represented by escape sequences
|
|
||||||
const [url, descriptor] = s |
|
||||||
.replace(escapedSpaceCharacters, ' ') |
|
||||||
.trim() |
|
||||||
.split(' ', 2); |
|
||||||
return { require: utils_1.urlToRequire(url), descriptor }; |
|
||||||
}); |
|
||||||
// "require(url1)"
|
|
||||||
// "require(url1) 1x"
|
|
||||||
// "require(url1), require(url2)"
|
|
||||||
// "require(url1), require(url2) 2x"
|
|
||||||
// "require(url1) 1x, require(url2)"
|
|
||||||
// "require(url1) 1x, require(url2) 2x"
|
|
||||||
const code = imageCandidates |
|
||||||
.map(({ require, descriptor }) => `${require} + "${descriptor ? ' ' + descriptor : ''}, " + `) |
|
||||||
.join('') |
|
||||||
.slice(0, -6) |
|
||||||
.concat('"') |
|
||||||
.replace(/ \+ ""$/, ''); |
|
||||||
attr.value = code; |
|
||||||
} |
|
||||||
}); |
|
||||||
} |
|
||||||
} |
|
@ -1,9 +0,0 @@ |
|||||||
export interface Attr { |
|
||||||
name: string; |
|
||||||
value: string; |
|
||||||
} |
|
||||||
export interface ASTNode { |
|
||||||
tag: string; |
|
||||||
attrs: Attr[]; |
|
||||||
} |
|
||||||
export declare function urlToRequire(url: string): string; |
|
@ -1,17 +0,0 @@ |
|||||||
"use strict"; |
|
||||||
Object.defineProperty(exports, "__esModule", { value: true }); |
|
||||||
function urlToRequire(url) { |
|
||||||
// same logic as in transform-require.js
|
|
||||||
const firstChar = url.charAt(0); |
|
||||||
if (firstChar === '.' || firstChar === '~' || firstChar === '@') { |
|
||||||
if (firstChar === '~') { |
|
||||||
const secondChar = url.charAt(1); |
|
||||||
url = url.slice(secondChar === '/' ? 2 : 1); |
|
||||||
} |
|
||||||
return `require("${url}")`; |
|
||||||
} |
|
||||||
else { |
|
||||||
return `"${url}"`; |
|
||||||
} |
|
||||||
} |
|
||||||
exports.urlToRequire = urlToRequire; |
|
@ -1,30 +0,0 @@ |
|||||||
import { SFCDescriptor } from './parse'; |
|
||||||
export interface StartOfSourceMap { |
|
||||||
file?: string; |
|
||||||
sourceRoot?: string; |
|
||||||
} |
|
||||||
export interface RawSourceMap extends StartOfSourceMap { |
|
||||||
version: string; |
|
||||||
sources: string[]; |
|
||||||
names: string[]; |
|
||||||
sourcesContent?: string[]; |
|
||||||
mappings: string; |
|
||||||
} |
|
||||||
export interface VueTemplateCompiler { |
|
||||||
parseComponent(source: string, options?: any): SFCDescriptor; |
|
||||||
compile(template: string, options: VueTemplateCompilerOptions): VueTemplateCompilerResults; |
|
||||||
ssrCompile(template: string, options: VueTemplateCompilerOptions): VueTemplateCompilerResults; |
|
||||||
} |
|
||||||
export interface VueTemplateCompilerOptions { |
|
||||||
modules?: Object[]; |
|
||||||
} |
|
||||||
export interface VueTemplateCompilerParseOptions { |
|
||||||
pad?: 'line' | 'space'; |
|
||||||
} |
|
||||||
export interface VueTemplateCompilerResults { |
|
||||||
ast: Object | void; |
|
||||||
render: string; |
|
||||||
staticRenderFns: string[]; |
|
||||||
errors: string[]; |
|
||||||
tips: string[]; |
|
||||||
} |
|
@ -1,2 +0,0 @@ |
|||||||
"use strict"; |
|
||||||
Object.defineProperty(exports, "__esModule", { value: true }); |
|
@ -1,143 +0,0 @@ |
|||||||
const postcss = require('postcss') |
|
||||||
import { ProcessOptions, LazyResult } from 'postcss' |
|
||||||
import trimPlugin from './stylePlugins/trim' |
|
||||||
import scopedPlugin from './stylePlugins/scoped' |
|
||||||
import { |
|
||||||
processors, |
|
||||||
StylePreprocessor, |
|
||||||
StylePreprocessorResults |
|
||||||
} from './styleProcessors' |
|
||||||
|
|
||||||
export interface StyleCompileOptions { |
|
||||||
source: string |
|
||||||
filename: string |
|
||||||
id: string |
|
||||||
map?: any |
|
||||||
scoped?: boolean |
|
||||||
trim?: boolean |
|
||||||
preprocessLang?: string |
|
||||||
preprocessOptions?: any |
|
||||||
postcssOptions?: any |
|
||||||
postcssPlugins?: any[] |
|
||||||
} |
|
||||||
|
|
||||||
export interface AsyncStyleCompileOptions extends StyleCompileOptions { |
|
||||||
isAsync?: boolean |
|
||||||
} |
|
||||||
|
|
||||||
export interface StyleCompileResults { |
|
||||||
code: string |
|
||||||
map: any | void |
|
||||||
rawResult: LazyResult | void |
|
||||||
errors: string[] |
|
||||||
} |
|
||||||
|
|
||||||
export function compileStyle( |
|
||||||
options: StyleCompileOptions |
|
||||||
): StyleCompileResults { |
|
||||||
return doCompileStyle({ ...options, isAsync: false }) |
|
||||||
} |
|
||||||
|
|
||||||
export function compileStyleAsync( |
|
||||||
options: StyleCompileOptions |
|
||||||
): Promise<StyleCompileResults> { |
|
||||||
return Promise.resolve(doCompileStyle({ ...options, isAsync: true })) |
|
||||||
} |
|
||||||
|
|
||||||
export function doCompileStyle( |
|
||||||
options: AsyncStyleCompileOptions |
|
||||||
): StyleCompileResults { |
|
||||||
const { |
|
||||||
filename, |
|
||||||
id, |
|
||||||
scoped = true, |
|
||||||
trim = true, |
|
||||||
preprocessLang, |
|
||||||
postcssOptions, |
|
||||||
postcssPlugins |
|
||||||
} = options |
|
||||||
const preprocessor = preprocessLang && processors[preprocessLang] |
|
||||||
const preProcessedSource = preprocessor && preprocess(options, preprocessor) |
|
||||||
const map = preProcessedSource ? preProcessedSource.map : options.map |
|
||||||
const source = preProcessedSource ? preProcessedSource.code : options.source |
|
||||||
|
|
||||||
const plugins = (postcssPlugins || []).slice() |
|
||||||
if (trim) { |
|
||||||
plugins.push(trimPlugin()) |
|
||||||
} |
|
||||||
if (scoped) { |
|
||||||
plugins.push(scopedPlugin(id)) |
|
||||||
} |
|
||||||
|
|
||||||
const postCSSOptions: ProcessOptions = { |
|
||||||
...postcssOptions, |
|
||||||
to: filename, |
|
||||||
from: filename |
|
||||||
} |
|
||||||
if (map) { |
|
||||||
postCSSOptions.map = { |
|
||||||
inline: false, |
|
||||||
annotation: false, |
|
||||||
prev: map |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
let result, code, outMap |
|
||||||
const errors: any[] = [] |
|
||||||
if (preProcessedSource && preProcessedSource.errors.length) { |
|
||||||
errors.push(...preProcessedSource.errors) |
|
||||||
} |
|
||||||
try { |
|
||||||
result = postcss(plugins).process(source, postCSSOptions) |
|
||||||
|
|
||||||
// In async mode, return a promise.
|
|
||||||
if (options.isAsync) { |
|
||||||
return result |
|
||||||
.then( |
|
||||||
(result: LazyResult): StyleCompileResults => ({ |
|
||||||
code: result.css || '', |
|
||||||
map: result.map && result.map.toJSON(), |
|
||||||
errors, |
|
||||||
rawResult: result |
|
||||||
}) |
|
||||||
) |
|
||||||
.catch( |
|
||||||
(error: Error): StyleCompileResults => ({ |
|
||||||
code: '', |
|
||||||
map: undefined, |
|
||||||
errors: [...errors, error.message], |
|
||||||
rawResult: undefined |
|
||||||
}) |
|
||||||
) |
|
||||||
} |
|
||||||
|
|
||||||
// force synchronous transform (we know we only have sync plugins)
|
|
||||||
code = result.css |
|
||||||
outMap = result.map |
|
||||||
} catch (e) { |
|
||||||
errors.push(e) |
|
||||||
} |
|
||||||
|
|
||||||
return { |
|
||||||
code: code || ``, |
|
||||||
map: outMap && outMap.toJSON(), |
|
||||||
errors, |
|
||||||
rawResult: result |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
function preprocess( |
|
||||||
options: StyleCompileOptions, |
|
||||||
preprocessor: StylePreprocessor |
|
||||||
): StylePreprocessorResults { |
|
||||||
return preprocessor.render( |
|
||||||
options.source, |
|
||||||
options.map, |
|
||||||
Object.assign( |
|
||||||
{ |
|
||||||
filename: options.filename |
|
||||||
}, |
|
||||||
options.preprocessOptions |
|
||||||
) |
|
||||||
) |
|
||||||
} |
|
@ -1,176 +0,0 @@ |
|||||||
import { VueTemplateCompiler, VueTemplateCompilerOptions } from './types' |
|
||||||
|
|
||||||
import assetUrlsModule, { |
|
||||||
AssetURLOptions |
|
||||||
} from './templateCompilerModules/assetUrl' |
|
||||||
import srcsetModule from './templateCompilerModules/srcset' |
|
||||||
|
|
||||||
const prettier = require('prettier') |
|
||||||
const consolidate = require('consolidate') |
|
||||||
const transpile = require('vue-template-es2015-compiler') |
|
||||||
|
|
||||||
export interface TemplateCompileOptions { |
|
||||||
source: string |
|
||||||
filename: string |
|
||||||
compiler: VueTemplateCompiler |
|
||||||
compilerOptions?: VueTemplateCompilerOptions |
|
||||||
transformAssetUrls?: AssetURLOptions | boolean |
|
||||||
preprocessLang?: string |
|
||||||
preprocessOptions?: any |
|
||||||
transpileOptions?: any |
|
||||||
isProduction?: boolean |
|
||||||
isFunctional?: boolean |
|
||||||
optimizeSSR?: boolean |
|
||||||
} |
|
||||||
|
|
||||||
export interface TemplateCompileResult { |
|
||||||
code: string |
|
||||||
source: string |
|
||||||
tips: string[] |
|
||||||
errors: string[] |
|
||||||
} |
|
||||||
|
|
||||||
export function compileTemplate( |
|
||||||
options: TemplateCompileOptions |
|
||||||
): TemplateCompileResult { |
|
||||||
const { preprocessLang } = options |
|
||||||
const preprocessor = preprocessLang && consolidate[preprocessLang] |
|
||||||
if (preprocessor) { |
|
||||||
return actuallyCompile( |
|
||||||
Object.assign({}, options, { |
|
||||||
source: preprocess(options, preprocessor) |
|
||||||
}) |
|
||||||
) |
|
||||||
} else if (preprocessLang) { |
|
||||||
return { |
|
||||||
code: `var render = function () {}\n` + `var staticRenderFns = []\n`, |
|
||||||
source: options.source, |
|
||||||
tips: [ |
|
||||||
`Component ${ |
|
||||||
options.filename |
|
||||||
} uses lang ${preprocessLang} for template. Please install the language preprocessor.` |
|
||||||
], |
|
||||||
errors: [ |
|
||||||
`Component ${ |
|
||||||
options.filename |
|
||||||
} uses lang ${preprocessLang} for template, however it is not installed.` |
|
||||||
] |
|
||||||
} |
|
||||||
} else { |
|
||||||
return actuallyCompile(options) |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
function preprocess( |
|
||||||
options: TemplateCompileOptions, |
|
||||||
preprocessor: any |
|
||||||
): string { |
|
||||||
const { source, filename, preprocessOptions } = options |
|
||||||
|
|
||||||
const finalPreprocessOptions = Object.assign( |
|
||||||
{ |
|
||||||
filename |
|
||||||
}, |
|
||||||
preprocessOptions |
|
||||||
) |
|
||||||
|
|
||||||
// Consolidate exposes a callback based API, but the callback is in fact
|
|
||||||
// called synchronously for most templating engines. In our case, we have to
|
|
||||||
// expose a synchronous API so that it is usable in Jest transforms (which
|
|
||||||
// have to be sync because they are applied via Node.js require hooks)
|
|
||||||
let res: any, err |
|
||||||
preprocessor.render( |
|
||||||
source, |
|
||||||
finalPreprocessOptions, |
|
||||||
(_err: Error | null, _res: string) => { |
|
||||||
if (_err) err = _err |
|
||||||
res = _res |
|
||||||
} |
|
||||||
) |
|
||||||
|
|
||||||
if (err) throw err |
|
||||||
return res |
|
||||||
} |
|
||||||
|
|
||||||
function actuallyCompile( |
|
||||||
options: TemplateCompileOptions |
|
||||||
): TemplateCompileResult { |
|
||||||
const { |
|
||||||
source, |
|
||||||
compiler, |
|
||||||
compilerOptions = {}, |
|
||||||
transpileOptions = {}, |
|
||||||
transformAssetUrls, |
|
||||||
isProduction = process.env.NODE_ENV === 'production', |
|
||||||
isFunctional = false, |
|
||||||
optimizeSSR = false |
|
||||||
} = options |
|
||||||
|
|
||||||
const compile = |
|
||||||
optimizeSSR && compiler.ssrCompile ? compiler.ssrCompile : compiler.compile |
|
||||||
|
|
||||||
let finalCompilerOptions = compilerOptions |
|
||||||
if (transformAssetUrls) { |
|
||||||
const builtInModules = [ |
|
||||||
transformAssetUrls === true |
|
||||||
? assetUrlsModule() |
|
||||||
: assetUrlsModule(transformAssetUrls), |
|
||||||
srcsetModule() |
|
||||||
] |
|
||||||
finalCompilerOptions = Object.assign({}, compilerOptions, { |
|
||||||
modules: [...builtInModules, ...(compilerOptions.modules || [])] |
|
||||||
}) |
|
||||||
} |
|
||||||
|
|
||||||
const { render, staticRenderFns, tips, errors } = compile( |
|
||||||
source, |
|
||||||
finalCompilerOptions |
|
||||||
) |
|
||||||
|
|
||||||
if (errors && errors.length) { |
|
||||||
return { |
|
||||||
code: `var render = function () {}\n` + `var staticRenderFns = []\n`, |
|
||||||
source, |
|
||||||
tips, |
|
||||||
errors |
|
||||||
} |
|
||||||
} else { |
|
||||||
const finalTranspileOptions = Object.assign({}, transpileOptions, { |
|
||||||
transforms: Object.assign({}, transpileOptions.transforms, { |
|
||||||
stripWithFunctional: isFunctional |
|
||||||
}) |
|
||||||
}) |
|
||||||
|
|
||||||
const toFunction = (code: string): string => { |
|
||||||
return `function (${isFunctional ? `_h,_vm` : ``}) {${code}}` |
|
||||||
} |
|
||||||
|
|
||||||
// transpile code with vue-template-es2015-compiler, which is a forked
|
|
||||||
// version of Buble that applies ES2015 transforms + stripping `with` usage
|
|
||||||
let code = |
|
||||||
transpile( |
|
||||||
`var __render__ = ${toFunction(render)}\n` + |
|
||||||
`var __staticRenderFns__ = [${staticRenderFns.map(toFunction)}]`, |
|
||||||
finalTranspileOptions |
|
||||||
) + `\n` |
|
||||||
|
|
||||||
// #23 we use __render__ to avoid `render` not being prefixed by the
|
|
||||||
// transpiler when stripping with, but revert it back to `render` to
|
|
||||||
// maintain backwards compat
|
|
||||||
code = code.replace(/\s__(render|staticRenderFns)__\s/g, ' $1 ') |
|
||||||
|
|
||||||
if (!isProduction) { |
|
||||||
// mark with stripped (this enables Vue to use correct runtime proxy
|
|
||||||
// detection)
|
|
||||||
code += `render._withStripped = true` |
|
||||||
code = prettier.format(code, { semi: false, parser: 'babylon' }) |
|
||||||
} |
|
||||||
|
|
||||||
return { |
|
||||||
code, |
|
||||||
source, |
|
||||||
tips, |
|
||||||
errors |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
@ -1,28 +0,0 @@ |
|||||||
import { parse, SFCBlock, SFCCustomBlock, SFCDescriptor } from './parse' |
|
||||||
|
|
||||||
import { |
|
||||||
compileTemplate, |
|
||||||
TemplateCompileOptions, |
|
||||||
TemplateCompileResult |
|
||||||
} from './compileTemplate' |
|
||||||
|
|
||||||
import { |
|
||||||
compileStyle, |
|
||||||
compileStyleAsync, |
|
||||||
StyleCompileOptions, |
|
||||||
StyleCompileResults |
|
||||||
} from './compileStyle' |
|
||||||
|
|
||||||
// API
|
|
||||||
export { parse, compileTemplate, compileStyle, compileStyleAsync } |
|
||||||
|
|
||||||
// types
|
|
||||||
export { |
|
||||||
SFCBlock, |
|
||||||
SFCCustomBlock, |
|
||||||
SFCDescriptor, |
|
||||||
TemplateCompileOptions, |
|
||||||
TemplateCompileResult, |
|
||||||
StyleCompileOptions, |
|
||||||
StyleCompileResults |
|
||||||
} |
|
@ -1,112 +0,0 @@ |
|||||||
import { |
|
||||||
RawSourceMap, |
|
||||||
VueTemplateCompiler, |
|
||||||
VueTemplateCompilerParseOptions |
|
||||||
} from './types' |
|
||||||
|
|
||||||
const hash = require('hash-sum') |
|
||||||
const cache = require('lru-cache')(100) |
|
||||||
const { SourceMapGenerator } = require('source-map') |
|
||||||
|
|
||||||
const splitRE = /\r?\n/g |
|
||||||
const emptyRE = /^(?:\/\/)?\s*$/ |
|
||||||
|
|
||||||
export interface ParseOptions { |
|
||||||
source: string |
|
||||||
filename?: string |
|
||||||
compiler: VueTemplateCompiler |
|
||||||
compilerParseOptions?: VueTemplateCompilerParseOptions |
|
||||||
sourceRoot?: string |
|
||||||
needMap?: boolean |
|
||||||
} |
|
||||||
|
|
||||||
export interface SFCCustomBlock { |
|
||||||
type: string |
|
||||||
content: string |
|
||||||
attrs: { [key: string]: string } |
|
||||||
start: number |
|
||||||
end: number |
|
||||||
map: RawSourceMap |
|
||||||
} |
|
||||||
|
|
||||||
export interface SFCBlock extends SFCCustomBlock { |
|
||||||
lang?: string |
|
||||||
src?: string |
|
||||||
scoped?: boolean |
|
||||||
module?: string | boolean |
|
||||||
} |
|
||||||
|
|
||||||
export interface SFCDescriptor { |
|
||||||
template?: SFCBlock |
|
||||||
script?: SFCBlock |
|
||||||
styles: SFCBlock[] |
|
||||||
customBlocks: SFCCustomBlock[] |
|
||||||
} |
|
||||||
|
|
||||||
export function parse(options: ParseOptions): SFCDescriptor { |
|
||||||
const { |
|
||||||
source, |
|
||||||
filename = '', |
|
||||||
compiler, |
|
||||||
compilerParseOptions = { pad: 'line' }, |
|
||||||
sourceRoot = process.cwd(), |
|
||||||
needMap = true |
|
||||||
} = options |
|
||||||
const cacheKey = hash(filename + source) |
|
||||||
let output: SFCDescriptor = cache.get(cacheKey) |
|
||||||
if (output) return output |
|
||||||
output = compiler.parseComponent(source, compilerParseOptions) |
|
||||||
if (needMap) { |
|
||||||
if (output.script && !output.script.src) { |
|
||||||
output.script.map = generateSourceMap( |
|
||||||
filename, |
|
||||||
source, |
|
||||||
output.script.content, |
|
||||||
sourceRoot |
|
||||||
) |
|
||||||
} |
|
||||||
if (output.styles) { |
|
||||||
output.styles.forEach(style => { |
|
||||||
if (!style.src) { |
|
||||||
style.map = generateSourceMap( |
|
||||||
filename, |
|
||||||
source, |
|
||||||
style.content, |
|
||||||
sourceRoot |
|
||||||
) |
|
||||||
} |
|
||||||
}) |
|
||||||
} |
|
||||||
} |
|
||||||
cache.set(cacheKey, output) |
|
||||||
return output |
|
||||||
} |
|
||||||
|
|
||||||
function generateSourceMap( |
|
||||||
filename: string, |
|
||||||
source: string, |
|
||||||
generated: string, |
|
||||||
sourceRoot: string |
|
||||||
): RawSourceMap { |
|
||||||
const map = new SourceMapGenerator({ |
|
||||||
file: filename, |
|
||||||
sourceRoot |
|
||||||
}) |
|
||||||
map.setSourceContent(filename, source) |
|
||||||
generated.split(splitRE).forEach((line, index) => { |
|
||||||
if (!emptyRE.test(line)) { |
|
||||||
map.addMapping({ |
|
||||||
source: filename, |
|
||||||
original: { |
|
||||||
line: index + 1, |
|
||||||
column: 0 |
|
||||||
}, |
|
||||||
generated: { |
|
||||||
line: index + 1, |
|
||||||
column: 0 |
|
||||||
} |
|
||||||
}) |
|
||||||
} |
|
||||||
}) |
|
||||||
return map.toJSON() |
|
||||||
} |
|
@ -1,99 +0,0 @@ |
|||||||
import { Root } from 'postcss' |
|
||||||
import * as postcss from 'postcss' |
|
||||||
// postcss-selector-parser does have typings but it's problematic to work with.
|
|
||||||
const selectorParser = require('postcss-selector-parser') |
|
||||||
|
|
||||||
export default postcss.plugin('add-id', (options: any) => (root: Root) => { |
|
||||||
const id: string = options |
|
||||||
const keyframes = Object.create(null) |
|
||||||
|
|
||||||
root.each(function rewriteSelector(node: any) { |
|
||||||
if (!node.selector) { |
|
||||||
// handle media queries
|
|
||||||
if (node.type === 'atrule') { |
|
||||||
if (node.name === 'media' || node.name === 'supports') { |
|
||||||
node.each(rewriteSelector) |
|
||||||
} else if (/-?keyframes$/.test(node.name)) { |
|
||||||
// register keyframes
|
|
||||||
keyframes[node.params] = node.params = node.params + '-' + id |
|
||||||
} |
|
||||||
} |
|
||||||
return |
|
||||||
} |
|
||||||
node.selector = selectorParser((selectors: any) => { |
|
||||||
selectors.each((selector: any) => { |
|
||||||
let node: any = null |
|
||||||
let hasDeep: boolean = false |
|
||||||
selector.each((n: any) => { |
|
||||||
// ">>>" combinator
|
|
||||||
if (n.type === 'combinator' && n.value === '>>>') { |
|
||||||
n.value = ' ' |
|
||||||
n.spaces.before = n.spaces.after = '' |
|
||||||
hasDeep = true |
|
||||||
return false |
|
||||||
} |
|
||||||
// /deep/ alias for >>>, since >>> doesn't work in SASS
|
|
||||||
if (n.type === 'tag' && n.value === '/deep/') { |
|
||||||
const prev = n.prev() |
|
||||||
if (prev && prev.type === 'combinator' && prev.value === ' ') { |
|
||||||
prev.remove() |
|
||||||
} |
|
||||||
n.remove() |
|
||||||
hasDeep = true |
|
||||||
return false |
|
||||||
} |
|
||||||
if (n.type !== 'pseudo' && n.type !== 'combinator') { |
|
||||||
node = n |
|
||||||
} |
|
||||||
}) |
|
||||||
if (node) { |
|
||||||
node.spaces.after = '' |
|
||||||
selector.insertAfter( |
|
||||||
node, |
|
||||||
selectorParser.attribute({ |
|
||||||
attribute: id |
|
||||||
}) |
|
||||||
) |
|
||||||
} else if (hasDeep) { |
|
||||||
selector.prepend( |
|
||||||
selectorParser.attribute({ |
|
||||||
attribute: id |
|
||||||
}) |
|
||||||
) |
|
||||||
} |
|
||||||
}) |
|
||||||
}).processSync(node.selector) |
|
||||||
}) |
|
||||||
|
|
||||||
// If keyframes are found in this <style>, find and rewrite animation names
|
|
||||||
// in declarations.
|
|
||||||
// Caveat: this only works for keyframes and animation rules in the same
|
|
||||||
// <style> element.
|
|
||||||
if (Object.keys(keyframes).length) { |
|
||||||
root.walkDecls(decl => { |
|
||||||
// individual animation-name declaration
|
|
||||||
if (/^(-\w+-)?animation-name$/.test(decl.prop)) { |
|
||||||
decl.value = decl.value |
|
||||||
.split(',') |
|
||||||
.map(v => keyframes[v.trim()] || v.trim()) |
|
||||||
.join(',') |
|
||||||
} |
|
||||||
// shorthand
|
|
||||||
if (/^(-\w+-)?animation$/.test(decl.prop)) { |
|
||||||
decl.value = decl.value |
|
||||||
.split(',') |
|
||||||
.map(v => { |
|
||||||
const vals = v.trim().split(/\s+/) |
|
||||||
const i = vals.findIndex(val => keyframes[val]) |
|
||||||
if (i !== -1) { |
|
||||||
vals.splice(i, 1, keyframes[vals[i]]) |
|
||||||
return vals.join(' ') |
|
||||||
} else { |
|
||||||
return v |
|
||||||
} |
|
||||||
}) |
|
||||||
.join(',') |
|
||||||
} |
|
||||||
}) |
|
||||||
} |
|
||||||
}) |
|
@ -1,10 +0,0 @@ |
|||||||
import { Root } from 'postcss' |
|
||||||
import * as postcss from 'postcss' |
|
||||||
|
|
||||||
export default postcss.plugin('trim', () => (css: Root) => { |
|
||||||
css.walk(({ type, raws }) => { |
|
||||||
if (type === 'rule' || type === 'atrule') { |
|
||||||
raws.before = raws.after = '\n' |
|
||||||
} |
|
||||||
}) |
|
||||||
}) |
|
@ -1,133 +0,0 @@ |
|||||||
const merge = require('merge-source-map') |
|
||||||
|
|
||||||
export interface StylePreprocessor { |
|
||||||
render( |
|
||||||
source: string, |
|
||||||
map: any | null, |
|
||||||
options: any |
|
||||||
): StylePreprocessorResults |
|
||||||
} |
|
||||||
|
|
||||||
export interface StylePreprocessorResults { |
|
||||||
code: string |
|
||||||
map?: any |
|
||||||
errors: Array<Error> |
|
||||||
} |
|
||||||
|
|
||||||
// .scss/.sass processor
|
|
||||||
const scss: StylePreprocessor = { |
|
||||||
render( |
|
||||||
source: string, |
|
||||||
map: any | null, |
|
||||||
options: any |
|
||||||
): StylePreprocessorResults { |
|
||||||
const nodeSass = require('node-sass') |
|
||||||
const finalOptions = Object.assign({}, options, { |
|
||||||
data: source, |
|
||||||
file: options.filename, |
|
||||||
outFile: options.filename, |
|
||||||
sourceMap: !!map |
|
||||||
}) |
|
||||||
|
|
||||||
try { |
|
||||||
const result = nodeSass.renderSync(finalOptions) |
|
||||||
|
|
||||||
if (map) { |
|
||||||
return { |
|
||||||
code: result.css.toString(), |
|
||||||
map: merge(map, JSON.parse(result.map.toString())), |
|
||||||
errors: [] |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
return { code: result.css.toString(), errors: [] } |
|
||||||
} catch (e) { |
|
||||||
return { code: '', errors: [e] } |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
const sass = { |
|
||||||
render( |
|
||||||
source: string, |
|
||||||
map: any | null, |
|
||||||
options: any |
|
||||||
): StylePreprocessorResults { |
|
||||||
return scss.render( |
|
||||||
source, |
|
||||||
map, |
|
||||||
Object.assign({}, options, { indentedSyntax: true }) |
|
||||||
) |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// .less
|
|
||||||
const less = { |
|
||||||
render( |
|
||||||
source: string, |
|
||||||
map: any | null, |
|
||||||
options: any |
|
||||||
): StylePreprocessorResults { |
|
||||||
const nodeLess = require('less') |
|
||||||
|
|
||||||
let result: any |
|
||||||
let error: Error | null = null |
|
||||||
nodeLess.render( |
|
||||||
source, |
|
||||||
Object.assign({}, options, { syncImport: true }), |
|
||||||
(err: Error | null, output: any) => { |
|
||||||
error = err |
|
||||||
result = output |
|
||||||
} |
|
||||||
) |
|
||||||
|
|
||||||
if (error) return { code: '', errors: [error] } |
|
||||||
|
|
||||||
if (map) { |
|
||||||
return { |
|
||||||
code: result.css.toString(), |
|
||||||
map: merge(map, result.map), |
|
||||||
errors: [] |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
return { code: result.css.toString(), errors: [] } |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
// .styl
|
|
||||||
const styl = { |
|
||||||
render( |
|
||||||
source: string, |
|
||||||
map: any | null, |
|
||||||
options: any |
|
||||||
): StylePreprocessorResults { |
|
||||||
const nodeStylus = require('stylus') |
|
||||||
try { |
|
||||||
const ref = nodeStylus(source) |
|
||||||
Object.keys(options).forEach(key => ref.set(key, options[key])) |
|
||||||
if (map) ref.set('sourcemap', { inline: false, comment: false }) |
|
||||||
|
|
||||||
const result = ref.render() |
|
||||||
if (map) { |
|
||||||
return { |
|
||||||
code: result, |
|
||||||
map: merge(map, ref.sourcemap), |
|
||||||
errors: [] |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
return { code: result, errors: [] } |
|
||||||
} catch (e) { |
|
||||||
return { code: '', errors: [e] } |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
export const processors: { [key: string]: StylePreprocessor } = { |
|
||||||
less, |
|
||||||
sass, |
|
||||||
scss, |
|
||||||
styl, |
|
||||||
stylus: styl |
|
||||||
} |
|
@ -1,51 +0,0 @@ |
|||||||
// vue compiler module for transforming `<tag>:<attribute>` to `require`
|
|
||||||
|
|
||||||
import { urlToRequire, ASTNode, Attr } from './utils' |
|
||||||
|
|
||||||
export interface AssetURLOptions { |
|
||||||
[name: string]: string | string[] |
|
||||||
} |
|
||||||
|
|
||||||
const defaultOptions: AssetURLOptions = { |
|
||||||
video: ['src', 'poster'], |
|
||||||
source: 'src', |
|
||||||
img: 'src', |
|
||||||
image: ['xlink:href', 'href'] |
|
||||||
} |
|
||||||
|
|
||||||
export default (userOptions?: AssetURLOptions) => { |
|
||||||
const options = userOptions |
|
||||||
? Object.assign({}, defaultOptions, userOptions) |
|
||||||
: defaultOptions |
|
||||||
|
|
||||||
return { |
|
||||||
postTransformNode: (node: ASTNode) => { |
|
||||||
transform(node, options) |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
function transform(node: ASTNode, options: AssetURLOptions) { |
|
||||||
for (const tag in options) { |
|
||||||
if ((tag === '*' || node.tag === tag) && node.attrs) { |
|
||||||
const attributes = options[tag] |
|
||||||
if (typeof attributes === 'string') { |
|
||||||
node.attrs.some(attr => rewrite(attr, attributes)) |
|
||||||
} else if (Array.isArray(attributes)) { |
|
||||||
attributes.forEach(item => node.attrs.some(attr => rewrite(attr, item))) |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
function rewrite(attr: Attr, name: string) { |
|
||||||
if (attr.name === name) { |
|
||||||
const value = attr.value |
|
||||||
// only transform static URLs
|
|
||||||
if (value.charAt(0) === '"' && value.charAt(value.length - 1) === '"') { |
|
||||||
attr.value = urlToRequire(value.slice(1, -1)) |
|
||||||
return true |
|
||||||
} |
|
||||||
} |
|
||||||
return false |
|
||||||
} |
|
@ -1,66 +0,0 @@ |
|||||||
// vue compiler module for transforming `img:srcset` to a number of `require`s
|
|
||||||
|
|
||||||
import { urlToRequire, ASTNode } from './utils' |
|
||||||
|
|
||||||
interface ImageCandidate { |
|
||||||
require: string |
|
||||||
descriptor: string |
|
||||||
} |
|
||||||
|
|
||||||
export default () => ({ |
|
||||||
postTransformNode: (node: ASTNode) => { |
|
||||||
transform(node) |
|
||||||
} |
|
||||||
}) |
|
||||||
|
|
||||||
// http://w3c.github.io/html/semantics-embedded-content.html#ref-for-image-candidate-string-5
|
|
||||||
const escapedSpaceCharacters = /( |\\t|\\n|\\f|\\r)+/g |
|
||||||
|
|
||||||
function transform(node: ASTNode) { |
|
||||||
const tags = ['img', 'source'] |
|
||||||
|
|
||||||
if (tags.indexOf(node.tag) !== -1 && node.attrs) { |
|
||||||
node.attrs.forEach(attr => { |
|
||||||
if (attr.name === 'srcset') { |
|
||||||
// same logic as in transform-require.js
|
|
||||||
const value = attr.value |
|
||||||
const isStatic = |
|
||||||
value.charAt(0) === '"' && value.charAt(value.length - 1) === '"' |
|
||||||
if (!isStatic) { |
|
||||||
return |
|
||||||
} |
|
||||||
|
|
||||||
const imageCandidates: ImageCandidate[] = value |
|
||||||
.substr(1, value.length - 2) |
|
||||||
.split(',') |
|
||||||
.map(s => { |
|
||||||
// The attribute value arrives here with all whitespace, except
|
|
||||||
// normal spaces, represented by escape sequences
|
|
||||||
const [url, descriptor] = s |
|
||||||
.replace(escapedSpaceCharacters, ' ') |
|
||||||
.trim() |
|
||||||
.split(' ', 2) |
|
||||||
return { require: urlToRequire(url), descriptor } |
|
||||||
}) |
|
||||||
|
|
||||||
// "require(url1)"
|
|
||||||
// "require(url1) 1x"
|
|
||||||
// "require(url1), require(url2)"
|
|
||||||
// "require(url1), require(url2) 2x"
|
|
||||||
// "require(url1) 1x, require(url2)"
|
|
||||||
// "require(url1) 1x, require(url2) 2x"
|
|
||||||
const code = imageCandidates |
|
||||||
.map( |
|
||||||
({ require, descriptor }) => |
|
||||||
`${require} + "${descriptor ? ' ' + descriptor : ''}, " + ` |
|
||||||
) |
|
||||||
.join('') |
|
||||||
.slice(0, -6) |
|
||||||
.concat('"') |
|
||||||
.replace(/ \+ ""$/, '') |
|
||||||
|
|
||||||
attr.value = code |
|
||||||
} |
|
||||||
}) |
|
||||||
} |
|
||||||
} |
|
@ -1,23 +0,0 @@ |
|||||||
export interface Attr { |
|
||||||
name: string |
|
||||||
value: string |
|
||||||
} |
|
||||||
|
|
||||||
export interface ASTNode { |
|
||||||
tag: string |
|
||||||
attrs: Attr[] |
|
||||||
} |
|
||||||
|
|
||||||
export function urlToRequire(url: string): string { |
|
||||||
// same logic as in transform-require.js
|
|
||||||
const firstChar = url.charAt(0) |
|
||||||
if (firstChar === '.' || firstChar === '~' || firstChar === '@') { |
|
||||||
if (firstChar === '~') { |
|
||||||
const secondChar = url.charAt(1) |
|
||||||
url = url.slice(secondChar === '/' ? 2 : 1) |
|
||||||
} |
|
||||||
return `require("${url}")` |
|
||||||
} else { |
|
||||||
return `"${url}"` |
|
||||||
} |
|
||||||
} |
|
@ -1,47 +0,0 @@ |
|||||||
import { SFCDescriptor } from './parse' |
|
||||||
|
|
||||||
export interface StartOfSourceMap { |
|
||||||
file?: string |
|
||||||
sourceRoot?: string |
|
||||||
} |
|
||||||
|
|
||||||
export interface RawSourceMap extends StartOfSourceMap { |
|
||||||
version: string |
|
||||||
sources: string[] |
|
||||||
names: string[] |
|
||||||
sourcesContent?: string[] |
|
||||||
mappings: string |
|
||||||
} |
|
||||||
|
|
||||||
export interface VueTemplateCompiler { |
|
||||||
parseComponent(source: string, options?: any): SFCDescriptor |
|
||||||
|
|
||||||
compile( |
|
||||||
template: string, |
|
||||||
options: VueTemplateCompilerOptions |
|
||||||
): VueTemplateCompilerResults |
|
||||||
|
|
||||||
ssrCompile( |
|
||||||
template: string, |
|
||||||
options: VueTemplateCompilerOptions |
|
||||||
): VueTemplateCompilerResults |
|
||||||
} |
|
||||||
|
|
||||||
// we'll just shim this much for now - in the future these types
|
|
||||||
// should come from vue-template-compiler directly, or this package should be
|
|
||||||
// part of the vue monorepo.
|
|
||||||
export interface VueTemplateCompilerOptions { |
|
||||||
modules?: Object[] |
|
||||||
} |
|
||||||
|
|
||||||
export interface VueTemplateCompilerParseOptions { |
|
||||||
pad?: 'line' | 'space' |
|
||||||
} |
|
||||||
|
|
||||||
export interface VueTemplateCompilerResults { |
|
||||||
ast: Object | void |
|
||||||
render: string |
|
||||||
staticRenderFns: string[] |
|
||||||
errors: string[] |
|
||||||
tips: string[] |
|
||||||
} |
|
@ -1,64 +0,0 @@ |
|||||||
{ |
|
||||||
"name": "@vue/component-compiler-utils", |
|
||||||
"version": "2.2.0", |
|
||||||
"description": "Lower level utilities for compiling Vue single file components", |
|
||||||
"main": "dist/index.js", |
|
||||||
"typings": "dist/index.d.ts", |
|
||||||
"scripts": { |
|
||||||
"lint": "prettier --write \"{lib,test}/**/*.ts\"", |
|
||||||
"test": "prettier --list-different \"{lib,test}/**/*.ts\" && jest", |
|
||||||
"build": "rm -rf dist && tsc", |
|
||||||
"prepublishOnly": "yarn build && conventional-changelog -p angular -r 2 -i CHANGELOG.md -s" |
|
||||||
}, |
|
||||||
"gitHooks": { |
|
||||||
"pre-commit": "lint-staged" |
|
||||||
}, |
|
||||||
"lint-staged": { |
|
||||||
"*.{ts,js}": [ |
|
||||||
"prettier --write", |
|
||||||
"git add" |
|
||||||
] |
|
||||||
}, |
|
||||||
"repository": { |
|
||||||
"type": "git", |
|
||||||
"url": "git+https://github.com/vuejs/component-compiler-utils.git" |
|
||||||
}, |
|
||||||
"keywords": [ |
|
||||||
"vue", |
|
||||||
"sfc", |
|
||||||
"component", |
|
||||||
"compiler" |
|
||||||
], |
|
||||||
"author": "Evan You", |
|
||||||
"license": "MIT", |
|
||||||
"bugs": { |
|
||||||
"url": "https://github.com/vuejs/component-compiler-utils/issues" |
|
||||||
}, |
|
||||||
"homepage": "https://github.com/vuejs/component-compiler-utils#readme", |
|
||||||
"devDependencies": { |
|
||||||
"@types/jest": "^22.2.3", |
|
||||||
"@types/node": "^9.4.7", |
|
||||||
"conventional-changelog-cli": "^1.3.22", |
|
||||||
"jest": "^22.4.2", |
|
||||||
"less": "^3.0.1", |
|
||||||
"lint-staged": "^7.2.0", |
|
||||||
"node-sass": "^4.8.3", |
|
||||||
"pug": "^2.0.3", |
|
||||||
"stylus": "^0.54.5", |
|
||||||
"ts-jest": "^22.4.2", |
|
||||||
"typescript": "^2.7.2", |
|
||||||
"vue-template-compiler": "^2.5.16", |
|
||||||
"yorkie": "^1.0.3" |
|
||||||
}, |
|
||||||
"dependencies": { |
|
||||||
"consolidate": "^0.15.1", |
|
||||||
"hash-sum": "^1.0.2", |
|
||||||
"lru-cache": "^4.1.2", |
|
||||||
"merge-source-map": "^1.1.0", |
|
||||||
"postcss": "^6.0.20", |
|
||||||
"postcss-selector-parser": "^3.1.1", |
|
||||||
"prettier": "1.13.7", |
|
||||||
"source-map": "^0.5.6", |
|
||||||
"vue-template-es2015-compiler": "^1.6.0" |
|
||||||
} |
|
||||||
} |
|
Loading…
Reference in new issue