diff --git a/packages/vue-cli-plugin-uni/packages/@vue/component-compiler-utils/dist/compileStyle.d.ts b/packages/vue-cli-plugin-uni/packages/@vue/component-compiler-utils/dist/compileStyle.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..078f5444a20be57be624ee8fe26ca6ac4b389ccf --- /dev/null +++ b/packages/vue-cli-plugin-uni/packages/@vue/component-compiler-utils/dist/compileStyle.d.ts @@ -0,0 +1,25 @@ +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; +export declare function doCompileStyle(options: AsyncStyleCompileOptions): StyleCompileResults; diff --git a/packages/vue-cli-plugin-uni/packages/@vue/component-compiler-utils/dist/compileStyle.js b/packages/vue-cli-plugin-uni/packages/@vue/component-compiler-utils/dist/compileStyle.js new file mode 100644 index 0000000000000000000000000000000000000000..065dc116611acdcb696fcea515d74757bd30840b --- /dev/null +++ b/packages/vue-cli-plugin-uni/packages/@vue/component-compiler-utils/dist/compileStyle.js @@ -0,0 +1,81 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const postcss = require('postcss'); +const trim_1 = __importDefault(require("./stylePlugins/trim")); +const scoped_1 = __importDefault(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)); +} diff --git a/packages/vue-cli-plugin-uni/packages/@vue/component-compiler-utils/dist/compileTemplate.d.ts b/packages/vue-cli-plugin-uni/packages/@vue/component-compiler-utils/dist/compileTemplate.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..9b8654268f82e04e7713210cc0df58d8aa28a9f6 --- /dev/null +++ b/packages/vue-cli-plugin-uni/packages/@vue/component-compiler-utils/dist/compileTemplate.d.ts @@ -0,0 +1,24 @@ +import { VueTemplateCompiler, VueTemplateCompilerOptions, ErrorWithRange } 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; + prettify?: boolean; +} +export interface TemplateCompileResult { + ast: Object | undefined; + code: string; + source: string; + tips: (string | ErrorWithRange)[]; + errors: (string | ErrorWithRange)[]; +} +export declare function compileTemplate(options: TemplateCompileOptions): TemplateCompileResult; diff --git a/packages/vue-cli-plugin-uni/packages/@vue/component-compiler-utils/dist/index.d.ts b/packages/vue-cli-plugin-uni/packages/@vue/component-compiler-utils/dist/index.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..f7e9cf3e2ef26705b79be25fd8b86beca1f7c615 --- /dev/null +++ b/packages/vue-cli-plugin-uni/packages/@vue/component-compiler-utils/dist/index.d.ts @@ -0,0 +1,5 @@ +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 }; diff --git a/packages/vue-cli-plugin-uni/packages/@vue/component-compiler-utils/dist/index.js b/packages/vue-cli-plugin-uni/packages/@vue/component-compiler-utils/dist/index.js new file mode 100644 index 0000000000000000000000000000000000000000..a8f4055569994baae29dd826f93433a4b5000a4e --- /dev/null +++ b/packages/vue-cli-plugin-uni/packages/@vue/component-compiler-utils/dist/index.js @@ -0,0 +1,9 @@ +"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; diff --git a/packages/vue-cli-plugin-uni/packages/@vue/component-compiler-utils/dist/parse.d.ts b/packages/vue-cli-plugin-uni/packages/@vue/component-compiler-utils/dist/parse.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..f82493e70b6e4269b07f0ef604accea2403cc9d9 --- /dev/null +++ b/packages/vue-cli-plugin-uni/packages/@vue/component-compiler-utils/dist/parse.d.ts @@ -0,0 +1,32 @@ +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 | true; + }; + 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 | null; + script: SFCBlock | null; + styles: SFCBlock[]; + customBlocks: SFCCustomBlock[]; +} +export declare function parse(options: ParseOptions): SFCDescriptor; diff --git a/packages/vue-cli-plugin-uni/packages/@vue/component-compiler-utils/dist/parseCustomBlocks.js b/packages/vue-cli-plugin-uni/packages/@vue/component-compiler-utils/dist/parseCustomBlocks.js new file mode 100644 index 0000000000000000000000000000000000000000..9debc81aa500b3462960925b006f1f06293fc024 --- /dev/null +++ b/packages/vue-cli-plugin-uni/packages/@vue/component-compiler-utils/dist/parseCustomBlocks.js @@ -0,0 +1,52 @@ +const { + getPlatformFilterTag, + normalizeNodeModules +} = require('@dcloudio/uni-cli-shared/lib/platform') + +const FILTER_TAG = getPlatformFilterTag() + +module.exports = function parseCustomBlocks(descriptor, options) { + + if (!descriptor.template || !FILTER_TAG || options.isAppNVue) { + // delete customBlocks + descriptor.customBlocks.length = 0 + return descriptor + } + + const modules = Object.create(null) + + descriptor.customBlocks = descriptor.customBlocks.filter(block => { + if ( + block.attrs.module && + ( + block.type === FILTER_TAG || + block.attrs.lang === FILTER_TAG + ) + ) { + modules[block.attrs.module] = block + return true + } + if ( // renderjs + options.isAppView && + ( + block.type === 'renderjs' || + block.attrs.lang === 'renderjs' + ) + ) { + return true + } + }) + + if (Object.keys(modules).length) { + const filterModules = JSON.parse(JSON.stringify(modules)) + Object.keys(filterModules).forEach(name => { + const filterModule = filterModules[name] + if (filterModule.attrs.src) { + filterModule.attrs.src = normalizeNodeModules(filterModule.attrs.src) + } + }) + descriptor.template.attrs['filter-modules'] = JSON.stringify(filterModules) + } + + return descriptor +} diff --git a/packages/vue-cli-plugin-uni/packages/@vue/component-compiler-utils/dist/stylePlugins/scoped.d.ts b/packages/vue-cli-plugin-uni/packages/@vue/component-compiler-utils/dist/stylePlugins/scoped.d.ts new file mode 100644 index 0000000000000000000000000000000000000000..20c0dd03f6e42ddf52964afd600ccdbec7c2e491 --- /dev/null +++ b/packages/vue-cli-plugin-uni/packages/@vue/component-compiler-utils/dist/stylePlugins/scoped.d.ts @@ -0,0 +1,3 @@ +import * as postcss from 'postcss'; +declare const _default: postcss.Plugin; +export default _default; diff --git a/packages/vue-cli-plugin-uni/packages/@vue/component-compiler-utils/dist/stylePlugins/scoped.js b/packages/vue-cli-plugin-uni/packages/@vue/component-compiler-utils/dist/stylePlugins/scoped.js new file mode 100644 index 0000000000000000000000000000000000000000..cf11444408e463bd3f1651b1925bb3ecbda5ca2c --- /dev/null +++ b/packages/vue-cli-plugin-uni/packages/@vue/component-compiler-utils/dist/stylePlugins/scoped.js @@ -0,0 +1,99 @@ +"use strict"; +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; + result["default"] = mod; + return result; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const postcss = __importStar(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; + // find the last child node to insert attribute selector + selector.each((n) => { + // ">>>" combinator + // and /deep/ alias for >>>, since >>> doesn't work in SASS + if (n.type === 'combinator' && + (n.value === '>>>' || n.value === '/deep/')) { + n.value = ' '; + n.spaces.before = n.spaces.after = ''; + return false; + } + // in newer versions of sass, /deep/ support is also dropped, so add a ::v-deep alias + if (n.type === 'pseudo' && n.value === '::v-deep') { + n.value = n.spaces.before = n.spaces.after = ''; + return false; + } + if (n.type !== 'pseudo' && n.type !== 'combinator') { + node = n; + } + }); + if (node) { + node.spaces.after = ''; + } + else { + // For deep selectors & standalone pseudo selectors, + // the attribute selectors are prepended rather than appended. + // So all leading spaces must be eliminated to avoid problems. + selector.first.spaces.before = ''; + } + selector.insertAfter(node, selectorParser.attribute({ + attribute: id + })); + }); + }).processSync(node.selector); + }); + // If keyframes are found in this