code: function valueGetter({ attrs, attributeBlocks }) {
        let values = null;
        return function getValue(name) {
          if (!values) {
            values = new Map();
            // Look in &attributes(...) style attribute blocks for any known values.
            // eslint-disable-next-line no-unused-vars
            for (const attributeBlock of attributeBlocks) {
              const jsAst = parseExpression(attributeBlock.val);
              if (jsAst.type === 'ObjectExpression' && jsAst.properties) {
                for (const property of jsAst.properties) {
                  if (property.type !== 'ObjectProperty' || property.method || property.computed) {
                    // Can't sanitize getters or methods, or spread elements.
                    continue;
                  }
                  const attrName = property.key.name || property.key.value;
                  const { code: valueExpression } = generate(property.value);
                  if (constantinople(valueExpression)) {
                    values.set(attrName, constantinople.toConstant(valueExpression));
                  }
                }
              }
            }
            // Find any known values among the (attr=expr, ...) style attributes.
            for (const attr of attrs) {
              if (constantinople(attr.val)) {
                values.set(attr.name, constantinople.toConstant(attr.val));
              }
            }
          }
  
          name = String(name).toLowerCase();
          return values.get(name);
        };
      }
docs: Sometimes the type for one attribute depends on another. For example, the sensitivity of <link href> depends on the value of rel.