wip: drop class opt for now + move lazy requires to utils
This commit is contained in:
		
							parent
							
								
									46bd9dbab0
								
							
						
					
					
						commit
						7ee07447c5
					
				@ -268,10 +268,8 @@ function dedupeProperties(properties: Property[]): Property[] {
 | 
			
		||||
    const name = prop.key.content
 | 
			
		||||
    const existing = knownProps[name]
 | 
			
		||||
    if (existing) {
 | 
			
		||||
      if (name.startsWith('on') || name === 'style') {
 | 
			
		||||
      if (name.startsWith('on') || name === 'style' || name === 'class') {
 | 
			
		||||
        mergeAsArray(existing, prop)
 | 
			
		||||
      } else if (name === 'class') {
 | 
			
		||||
        mergeClasses(existing, prop)
 | 
			
		||||
      }
 | 
			
		||||
      // unexpected duplicate, should have emitted error during parse
 | 
			
		||||
    } else {
 | 
			
		||||
@ -293,13 +291,6 @@ function mergeAsArray(existing: Property, incoming: Property) {
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Merge dynamic and static class into a single prop
 | 
			
		||||
// :class="expression" class="string"
 | 
			
		||||
// -> class: expression + "string"
 | 
			
		||||
function mergeClasses(existing: Property, incoming: Property) {
 | 
			
		||||
  // TODO
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function createDirectiveArgs(
 | 
			
		||||
  dir: DirectiveNode,
 | 
			
		||||
  context: TransformContext
 | 
			
		||||
 | 
			
		||||
@ -7,9 +7,6 @@
 | 
			
		||||
// - This transform is only applied in non-browser builds because it relies on
 | 
			
		||||
//   an additional JavaScript parser. In the browser, there is no source-map
 | 
			
		||||
//   support and the code is wrapped in `with (this) { ... }`.
 | 
			
		||||
 | 
			
		||||
import { parseScript } from 'meriyah'
 | 
			
		||||
import { walk } from 'estree-walker'
 | 
			
		||||
import { NodeTransform, TransformContext } from '../transform'
 | 
			
		||||
import {
 | 
			
		||||
  NodeTypes,
 | 
			
		||||
@ -20,7 +17,12 @@ import {
 | 
			
		||||
  createCompoundExpression
 | 
			
		||||
} from '../ast'
 | 
			
		||||
import { Node, Function, Identifier, Property } from 'estree'
 | 
			
		||||
import { advancePositionWithClone, isSimpleIdentifier } from '../utils'
 | 
			
		||||
import {
 | 
			
		||||
  advancePositionWithClone,
 | 
			
		||||
  isSimpleIdentifier,
 | 
			
		||||
  parseJS,
 | 
			
		||||
  walkJS
 | 
			
		||||
} from '../utils'
 | 
			
		||||
 | 
			
		||||
export const transformExpression: NodeTransform = (node, context) => {
 | 
			
		||||
  if (node.type === NodeTypes.INTERPOLATION) {
 | 
			
		||||
@ -39,22 +41,13 @@ export const transformExpression: NodeTransform = (node, context) => {
 | 
			
		||||
          dir.exp = processExpression(exp, context, dir.name === 'slot')
 | 
			
		||||
        }
 | 
			
		||||
        if (arg && !arg.isStatic) {
 | 
			
		||||
          if (dir.name === 'class') {
 | 
			
		||||
            // TODO special expression optimization for classes
 | 
			
		||||
            dir.arg = processExpression(arg, context)
 | 
			
		||||
          } else {
 | 
			
		||||
            dir.arg = processExpression(arg, context)
 | 
			
		||||
          }
 | 
			
		||||
          dir.arg = processExpression(arg, context)
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// cache node requires
 | 
			
		||||
let _parseScript: typeof parseScript
 | 
			
		||||
let _walk: typeof walk
 | 
			
		||||
 | 
			
		||||
interface PrefixMeta {
 | 
			
		||||
  prefix?: string
 | 
			
		||||
  start: number
 | 
			
		||||
@ -83,18 +76,12 @@ export function processExpression(
 | 
			
		||||
    return node
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  // lazy require dependencies so that they don't end up in rollup's dep graph
 | 
			
		||||
  // and thus can be tree-shaken in browser builds.
 | 
			
		||||
  const parseScript =
 | 
			
		||||
    _parseScript || (_parseScript = require('meriyah').parseScript)
 | 
			
		||||
  const walk = _walk || (_walk = require('estree-walker').walk)
 | 
			
		||||
 | 
			
		||||
  let ast: any
 | 
			
		||||
  // if the expression is supposed to be used in a function params position
 | 
			
		||||
  // we need to parse it differently.
 | 
			
		||||
  const source = `(${node.content})${asParams ? `=>{}` : ``}`
 | 
			
		||||
  try {
 | 
			
		||||
    ast = parseScript(source, { ranges: true })
 | 
			
		||||
    ast = parseJS(source, { ranges: true })
 | 
			
		||||
  } catch (e) {
 | 
			
		||||
    context.onError(e)
 | 
			
		||||
    return node
 | 
			
		||||
@ -104,7 +91,7 @@ export function processExpression(
 | 
			
		||||
  const knownIds = Object.create(context.identifiers)
 | 
			
		||||
 | 
			
		||||
  // walk the AST and look for identifiers that need to be prefixed with `_ctx.`.
 | 
			
		||||
  walk(ast, {
 | 
			
		||||
  walkJS(ast, {
 | 
			
		||||
    enter(node: Node & PrefixMeta, parent) {
 | 
			
		||||
      if (node.type === 'Identifier') {
 | 
			
		||||
        if (!ids.includes(node)) {
 | 
			
		||||
@ -126,7 +113,7 @@ export function processExpression(
 | 
			
		||||
        // walk function expressions and add its arguments to known identifiers
 | 
			
		||||
        // so that we don't prefix them
 | 
			
		||||
        node.params.forEach(p =>
 | 
			
		||||
          walk(p, {
 | 
			
		||||
          walkJS(p, {
 | 
			
		||||
            enter(child, parent) {
 | 
			
		||||
              if (
 | 
			
		||||
                child.type === 'Identifier' &&
 | 
			
		||||
@ -182,21 +169,24 @@ export function processExpression(
 | 
			
		||||
  const children: CompoundExpressionNode['children'] = []
 | 
			
		||||
  ids.sort((a, b) => a.start - b.start)
 | 
			
		||||
  ids.forEach((id, i) => {
 | 
			
		||||
    // range is offset by -1 due to the wrapping parens when parsed
 | 
			
		||||
    const start = id.start - 1
 | 
			
		||||
    const end = id.end - 1
 | 
			
		||||
    const last = ids[i - 1] as any
 | 
			
		||||
    const leadingText = full.slice(last ? last.end - 1 : 0, id.start - 1)
 | 
			
		||||
    const leadingText = full.slice(last ? last.end - 1 : 0, start)
 | 
			
		||||
    if (leadingText.length || id.prefix) {
 | 
			
		||||
      children.push(leadingText + (id.prefix || ``))
 | 
			
		||||
    }
 | 
			
		||||
    const source = full.slice(id.start - 1, id.end - 1)
 | 
			
		||||
    const source = full.slice(start, end)
 | 
			
		||||
    children.push(
 | 
			
		||||
      createSimpleExpression(id.name, false, {
 | 
			
		||||
        source,
 | 
			
		||||
        start: advancePositionWithClone(node.loc.start, source, id.start - 1),
 | 
			
		||||
        end: advancePositionWithClone(node.loc.start, source, id.end - 1)
 | 
			
		||||
        start: advancePositionWithClone(node.loc.start, source, start),
 | 
			
		||||
        end: advancePositionWithClone(node.loc.start, source, end)
 | 
			
		||||
      })
 | 
			
		||||
    )
 | 
			
		||||
    if (i === ids.length - 1 && id.end - 1 < full.length) {
 | 
			
		||||
      children.push(full.slice(id.end - 1))
 | 
			
		||||
    if (i === ids.length - 1 && end < full.length) {
 | 
			
		||||
      children.push(full.slice(end))
 | 
			
		||||
    }
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,30 @@
 | 
			
		||||
import { SourceLocation, Position } from './ast'
 | 
			
		||||
import { parseScript } from 'meriyah'
 | 
			
		||||
import { walk } from 'estree-walker'
 | 
			
		||||
 | 
			
		||||
// cache node requires
 | 
			
		||||
// lazy require dependencies so that they don't end up in rollup's dep graph
 | 
			
		||||
// and thus can be tree-shaken in browser builds.
 | 
			
		||||
let _parseScript: typeof parseScript
 | 
			
		||||
let _walk: typeof walk
 | 
			
		||||
 | 
			
		||||
export const parseJS: typeof parseScript = (code: string, options: any) => {
 | 
			
		||||
  assert(
 | 
			
		||||
    !__BROWSER__,
 | 
			
		||||
    `Expression AST analysis can only be performed in non-browser builds.`
 | 
			
		||||
  )
 | 
			
		||||
  const parse = _parseScript || (_parseScript = require('meriyah').parseScript)
 | 
			
		||||
  return parse(code, options)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const walkJS: typeof walk = (ast, walker) => {
 | 
			
		||||
  assert(
 | 
			
		||||
    !__BROWSER__,
 | 
			
		||||
    `Expression AST analysis can only be performed in non-browser builds.`
 | 
			
		||||
  )
 | 
			
		||||
  const walk = _walk || (_walk = require('estree-walker').walk)
 | 
			
		||||
  return walk(ast, walker)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const isSimpleIdentifier = (name: string): boolean =>
 | 
			
		||||
  !/^\d|[^\w]/.test(name)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user