Skip to content

Commit

Permalink
Added LD+JSON asset and test case (#1936)
Browse files Browse the repository at this point in the history
  • Loading branch information
bre7 authored and devongovett committed Sep 23, 2018
1 parent e6c29bc commit 809925b
Show file tree
Hide file tree
Showing 9 changed files with 146 additions and 6 deletions.
1 change: 1 addition & 0 deletions packages/core/parcel-bundler/src/Parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class Parser {
this.registerExtension('vue', './assets/VueAsset');
this.registerExtension('json', './assets/JSONAsset');
this.registerExtension('json5', './assets/JSONAsset');
this.registerExtension('jsonld', './assets/JSONLDAsset');
this.registerExtension('yaml', './assets/YAMLAsset');
this.registerExtension('yml', './assets/YAMLAsset');
this.registerExtension('toml', './assets/TOMLAsset');
Expand Down
1 change: 1 addition & 0 deletions packages/core/parcel-bundler/src/Pipeline.js
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ class Pipeline {
if (rendition.meta) {
for (let res of processed) {
res.meta = rendition.meta;
res.isMain = res.type === subAsset.type;
}
}

Expand Down
16 changes: 10 additions & 6 deletions packages/core/parcel-bundler/src/assets/HTMLAsset.js
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,8 @@ const META = {
'msapplication-square310x310logo',
'msapplication-square70x70logo',
'msapplication-wide310x150logo',
'msapplication-TileImage'
'msapplication-TileImage',
'msapplication-config'
],
itemprop: [
'image',
Expand All @@ -65,6 +66,7 @@ const SCRIPT_TYPES = {
'application/javascript': 'js',
'text/javascript': 'js',
'application/json': false,
'application/ld+json': 'jsonld',
'text/html': false
};

Expand Down Expand Up @@ -251,15 +253,17 @@ class HTMLAsset extends Asset {
if (type === 'attr' && rendition.type === 'css') {
node.attrs.style = rendition.value;
} else if (type === 'tag') {
if (
(rendition.type === 'js' && node.tag === 'script') ||
(rendition.type === 'css' && node.tag === 'style')
) {
if (rendition.isMain) {
node.content = rendition.value;
}

// Delete "type" attribute, since CSS and JS are the defaults.
if (node.attrs) {
// Unless it's application/ld+json
if (
node.attrs &&
(node.tag === 'style' ||
(node.attrs.type && SCRIPT_TYPES[node.attrs.type] === 'js'))
) {
delete node.attrs.type;
}
}
Expand Down
76 changes: 76 additions & 0 deletions packages/core/parcel-bundler/src/assets/JSONLDAsset.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
const urlJoin = require('../utils/urlJoin');
const isURL = require('../utils/is-url');
const Asset = require('../Asset');
const logger = require('../Logger');

// A list of all attributes in a schema that may produce a dependency
// Based on https://schema.org/ImageObject
// Section "Instances of ImageObject may appear as values for the following properties"
const SCHEMA_ATTRS = [
'logo',
'photo',
'image',
'thumbnail',
'screenshot',
'primaryImageOfPage',
'embedUrl',
'thumbnailUrl',
'video',
'contentUrl'
];

class JSONLDAsset extends Asset {
constructor(name, options) {
super(name, options);
this.type = 'jsonld';
}

parse(content) {
return JSON.parse(content.trim());
}

collectDependencies() {
if (!this.options.publicURL.startsWith('http')) {
logger.warn(
"Please specify a publicURL using --public-url, otherwise schema assets won't be collected"
);
return;
}

for (let schemaKey in this.ast) {
if (SCHEMA_ATTRS.includes(schemaKey)) {
this.collectFromKey(this.ast, schemaKey);
this.isAstDirty = true;
}
}
}

// Auxiliary method for collectDependencies() to use for recursion
collectFromKey(schema, schemaKey) {
if (!schema.hasOwnProperty(schemaKey)) {
return;
}
// values can be strings or objects
// if it's not a string, it should have a url
if (typeof schema[schemaKey] === 'string') {
let assetPath = this.addURLDependency(schema[schemaKey]);
if (!isURL(assetPath)) {
// paths aren't allowed, values must be urls
assetPath = urlJoin(this.options.publicURL, assetPath);
}
schema[schemaKey] = assetPath;
} else {
this.collectFromKey(schema[schemaKey], 'url');
}
}

generate() {
if (this.options.production) {
return JSON.stringify(this.ast);
} else {
return JSON.stringify(this.ast, null, 2);
}
}
}

module.exports = JSONLDAsset;
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<html>
<head>
<title>hi</title>
<link rel="stylesheet" href="other.css">
</head>
<body>

<p>text 123</p>

<script type="application/ld+json">
{
"@context": "http://schema.org",
"@type": "LocalBusiness",
"description": "This is your business description.",
"name": "Parcel's parcel",
"telephone": "555-111-2345",
"openingHours": "Mo,Tu,We,Th,Fr 09:00-17:00",
"logo": {
"@type": "ImageObject",
"url": "images/logo.png",
"width": 180,
"height": 120
},
"image": "images/image.jpeg"
}
</script>

</body>
</html>
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
.other {
color: green;
}
26 changes: 26 additions & 0 deletions packages/core/parcel-bundler/test/schema-jsonld.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
const {bundle, assertBundleTree} = require('./utils');

describe('schema ld+json', function() {
it('Should parse a LD+JSON schema and collect dependencies', async function() {
let b = await bundle(__dirname + '/integration/schema-jsonld/index.html', {
production: true,
publicURL: 'https://place.holder/'
});

await assertBundleTree(b, {
name: 'index.html',
assets: ['index.html'],
childBundles: [
{
type: 'jpeg'
},
{
type: 'png'
},
{
type: 'css'
}
]
});
});
});

0 comments on commit 809925b

Please sign in to comment.