-
-
Notifications
You must be signed in to change notification settings - Fork 8.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat(v2): add support to import assets using relative link in markdow…
…n syntax (#3096) * add a rehyper plugin * fix yarn.lok * add target * convert to remark * add docs * remove unused package * remove file-loader * add test for file-loader * fix test
- Loading branch information
Anshul Goyal
authored
Aug 3, 2020
1 parent
64293bf
commit 3255599
Showing
10 changed files
with
218 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
33 changes: 33 additions & 0 deletions
33
...cusaurus-mdx-loader/src/remark/transformAssets/__tests__/__snapshots__/index.test.js.snap
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
// Jest Snapshot v1, https://goo.gl/fbAQLP | ||
|
||
exports[`transformAsset plugin fail if asset does not exist 1`] = `"Asset packages/docusaurus-mdx-loader/src/remark/transformAssets/__tests__/fixtures/doesNotExist.pdf used in packages/docusaurus-mdx-loader/src/remark/transformAssets/__tests__/fixtures/fail.md not found."`; | ||
|
||
exports[`transformAsset plugin fail if asset url is absent 1`] = `"Markdown link url is mandatory. filePath=packages/docusaurus-mdx-loader/src/remark/transformAssets/__tests__/fixtures/noUrl.md"`; | ||
|
||
exports[`transformAsset plugin pathname protocol 1`] = ` | ||
"[asset](/asset/unchecked.pdf) | ||
" | ||
`; | ||
|
||
exports[`transformAsset plugin transform md links to <a /> 1`] = ` | ||
"[asset](https://example.com/asset.pdf) | ||
<a target=\\"_blank\\" href={require('./asset.pdf').default} ></a> | ||
<a target=\\"_blank\\" href={require('./asset.pdf').default} >asset</a> | ||
[asset](asset.pdf \\"Title\\") ![seet](asset) | ||
## Heading | ||
\`\`\`md | ||
[asset](./asset.pdf) | ||
\`\`\` | ||
<a target=\\"_blank\\" href={require('!file-loader!./asset.pdf').default} >assets</a> | ||
[assets](/github/!file-loader!/assets.pdf) | ||
[asset](asset.pdf) | ||
" | ||
`; |
19 changes: 19 additions & 0 deletions
19
...es/docusaurus-mdx-loader/src/remark/transformAssets/__tests__/fixtures/asset.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
[asset](https://example.com/asset.pdf) | ||
|
||
[](./asset.pdf) | ||
|
||
[asset](./asset.pdf) | ||
|
||
[asset](asset.pdf 'Title') ![seet](asset) | ||
|
||
## Heading | ||
|
||
```md | ||
[asset](./asset.pdf) | ||
``` | ||
|
||
[assets](!file-loader!./asset.pdf) | ||
|
||
[assets](/github/!file-loader!/assets.pdf) | ||
|
||
[asset](asset.pdf) |
Empty file.
1 change: 1 addition & 0 deletions
1
...ges/docusaurus-mdx-loader/src/remark/transformAssets/__tests__/fixtures/fail.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
[asset](./doesNotExist.pdf) |
1 change: 1 addition & 0 deletions
1
...es/docusaurus-mdx-loader/src/remark/transformAssets/__tests__/fixtures/noUrl.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
[asset]() |
1 change: 1 addition & 0 deletions
1
...docusaurus-mdx-loader/src/remark/transformAssets/__tests__/fixtures/pathname.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
[asset](pathname:///asset/unchecked.pdf) |
46 changes: 46 additions & 0 deletions
46
packages/docusaurus-mdx-loader/src/remark/transformAssets/__tests__/index.test.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
/** | ||
* Copyright (c) Facebook, Inc. and its affiliates. | ||
* | ||
* This source code is licensed under the MIT license found in the | ||
* LICENSE file in the root directory of this source tree. | ||
*/ | ||
|
||
import {join} from 'path'; | ||
import remark from 'remark'; | ||
import mdx from 'remark-mdx'; | ||
import vfile from 'to-vfile'; | ||
import plugin from '..'; | ||
import slug from '../../slug'; | ||
|
||
const processFixture = async (name, options) => { | ||
const path = join(__dirname, 'fixtures', `${name}.md`); | ||
const file = await vfile.read(path); | ||
const result = await remark() | ||
.use(slug) | ||
.use(mdx) | ||
.use(plugin, {...options, filePath: path}) | ||
.process(file); | ||
|
||
return result.toString(); | ||
}; | ||
|
||
describe('transformAsset plugin', () => { | ||
test('fail if asset does not exist', async () => { | ||
await expect(processFixture('fail')).rejects.toThrowErrorMatchingSnapshot(); | ||
}); | ||
test('fail if asset url is absent', async () => { | ||
await expect( | ||
processFixture('noUrl'), | ||
).rejects.toThrowErrorMatchingSnapshot(); | ||
}); | ||
|
||
test('transform md links to <a />', async () => { | ||
const result = await processFixture('asset'); | ||
expect(result).toMatchSnapshot(); | ||
}); | ||
|
||
test('pathname protocol', async () => { | ||
const result = await processFixture('pathname'); | ||
expect(result).toMatchSnapshot(); | ||
}); | ||
}); |
91 changes: 91 additions & 0 deletions
91
packages/docusaurus-mdx-loader/src/remark/transformAssets/index.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,91 @@ | ||
/** | ||
* Copyright (c) Facebook, Inc. and its affiliates. | ||
* | ||
* This source code is licensed under the MIT license found in the | ||
* LICENSE file in the root directory of this source tree. | ||
*/ | ||
|
||
const visit = require('unist-util-visit'); | ||
const path = require('path'); | ||
const url = require('url'); | ||
const fs = require('fs-extra'); | ||
|
||
// Needed to throw errors with computer-agnostic path messages | ||
// Absolute paths are too dependant of user FS | ||
function toRelativePath(filePath) { | ||
return path.relative(process.cwd(), filePath); | ||
} | ||
|
||
async function ensureAssetFileExist(assetPath, sourceFilePath) { | ||
const assetExists = await fs.exists(assetPath); | ||
if (!assetExists) { | ||
throw new Error( | ||
`Asset ${toRelativePath(assetPath)} used in ${toRelativePath( | ||
sourceFilePath, | ||
)} not found.`, | ||
); | ||
} | ||
} | ||
|
||
async function processLinkNode(node, index, parent, {filePath}) { | ||
if (!node.url) { | ||
throw new Error( | ||
`Markdown link url is mandatory. filePath=${toRelativePath(filePath)}`, | ||
); | ||
} | ||
const parsedUrl = url.parse(node.url); | ||
const assetPath = node.url; | ||
if (parsedUrl.protocol) { | ||
// pathname:// is an escape hatch, | ||
// in case user does not want his assets to be converted to require calls going through webpack loader | ||
// we don't have to document this for now, | ||
// it's mostly to make next release less risky (2.0.0-alpha.59) | ||
if (parsedUrl.protocol === 'pathname:') { | ||
node.url = node.url.replace('pathname://', ''); | ||
} | ||
return; | ||
} | ||
if ( | ||
assetPath.match(/#|.md|.mdx/) || | ||
path.isAbsolute(assetPath) || | ||
!path.extname(assetPath) || | ||
!assetPath.startsWith('.') | ||
) { | ||
if (!assetPath.startsWith('!')) { | ||
return; | ||
} | ||
} | ||
|
||
const expectedAssetPath = path.join( | ||
path.dirname(filePath), | ||
assetPath.replace(/!.*!/, ''), | ||
); | ||
await ensureAssetFileExist(expectedAssetPath, filePath); | ||
|
||
node.type = 'jsx'; | ||
node.value = `<a target="_blank" ${ | ||
assetPath ? `href={require('${assetPath}').default}` : '' | ||
} ${node.title ? `title={${node.title}}` : ''} >`; | ||
const {children} = node; | ||
delete node.children; | ||
|
||
parent.children.splice(index + 1, 0, { | ||
type: 'paragraph', | ||
children, | ||
}); | ||
|
||
parent.children.splice(index + 2, 0, {type: 'jsx', value: '</a>'}); | ||
} | ||
|
||
const plugin = (options) => { | ||
const transformer = async (root) => { | ||
const promises = []; | ||
visit(root, 'link', (node, index, parent) => { | ||
promises.push(processLinkNode(node, index, parent, options)); | ||
}); | ||
await Promise.all(promises); | ||
}; | ||
return transformer; | ||
}; | ||
|
||
module.exports = plugin; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters