summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Matthew Phillips <matthew@matthewphillips.info> 2021-06-04 14:19:01 -0400
committerGravatar GitHub <noreply@github.com> 2021-06-04 14:19:01 -0400
commit50e6f491ad2258689ba8735a3f98a0d99e4ba336 (patch)
treecc2c1284b3632d6447d3c9bab3b5c1aa461c35cf
parenta2594ef572c41ce05dd01ef095e8595ffcd35842 (diff)
downloadastro-50e6f491ad2258689ba8735a3f98a0d99e4ba336.tar.gz
astro-50e6f491ad2258689ba8735a3f98a0d99e4ba336.tar.zst
astro-50e6f491ad2258689ba8735a3f98a0d99e4ba336.zip
Use npm package names to load internal deps (#294)
* Use npm package names to load internal deps This is necessary so that published Astro components work. These components will be built by esinstall and therefore they cannot rely on `_astro_internal`. The fix is to use npm specifiers everywhere. * Move most of frontend to internal * Mark astro/internal/markdown.js as external * Move markdown stuff to its own package This moves the markdown stuff to its own package so that we can externalize it in the markdown component. * Add the changeset
-rw-r--r--.changeset/forty-apricots-film.md6
-rw-r--r--package.json2
-rw-r--r--packages/astro/components/Markdown.astro2
-rw-r--r--packages/astro/package.json16
-rw-r--r--packages/astro/snowpack-plugin.cjs2
-rw-r--r--packages/astro/src/compiler/codegen/index.ts10
-rw-r--r--packages/astro/src/compiler/index.ts9
-rw-r--r--packages/astro/src/compiler/markdown/micromark.d.ts14
-rw-r--r--packages/astro/src/compiler/markdown/remark-mdx-lite.ts30
-rw-r--r--packages/astro/src/compiler/utils.ts69
-rw-r--r--packages/astro/src/external.ts2
-rw-r--r--packages/astro/src/frontend/markdown.ts1
-rw-r--r--packages/astro/src/internal/__astro_component.ts (renamed from packages/astro/src/frontend/__astro_component.ts)2
-rw-r--r--packages/astro/src/internal/h.ts (renamed from packages/astro/src/frontend/h.ts)0
-rw-r--r--packages/astro/src/internal/renderer-astro.ts (renamed from packages/astro/src/frontend/renderer-astro.ts)0
-rw-r--r--packages/astro/src/runtime.ts4
-rw-r--r--packages/astro/src/search.ts2
-rw-r--r--packages/astro/test/astro-children.test.js1
-rw-r--r--packages/markdown-support/package.json23
-rw-r--r--packages/markdown-support/src/codeblock.ts (renamed from packages/astro/src/compiler/markdown/codeblock.ts)0
-rw-r--r--packages/markdown-support/src/index.ts69
-rw-r--r--packages/markdown-support/src/rehype-collect-headers.ts (renamed from packages/astro/src/compiler/markdown/rehype-collect-headers.ts)0
-rw-r--r--packages/markdown-support/src/remark-scoped-styles.ts (renamed from packages/astro/src/compiler/markdown/remark-scoped-styles.ts)0
-rw-r--r--packages/markdown-support/src/types.ts6
-rw-r--r--packages/markdown-support/tsconfig.json10
-rw-r--r--yarn.lock8
26 files changed, 136 insertions, 152 deletions
diff --git a/.changeset/forty-apricots-film.md b/.changeset/forty-apricots-film.md
new file mode 100644
index 000000000..38b5843e9
--- /dev/null
+++ b/.changeset/forty-apricots-film.md
@@ -0,0 +1,6 @@
+---
+'astro': patch
+'@astrojs/markdown-support': patch
+---
+
+Fixes issues with using astro via the create script
diff --git a/package.json b/package.json
index 435578589..ed48cccea 100644
--- a/package.json
+++ b/package.json
@@ -6,7 +6,7 @@
"release": "yarn build && yarn changeset publish",
"benchmark": "yarn workspace astro run benchmark",
"build": "yarn build:core",
- "build:core": "lerna run build --scope astro --scope astro-parser",
+ "build:core": "lerna run build --scope astro --scope astro-parser --scope @astrojs/markdown-support",
"build:vscode": "lerna run build --scope astro-languageserver --scope astro-vscode --scope astro-parser",
"dev:vscode": "lerna run dev --scope astro-languageserver --scope astro-vscode --scope astro-parser --parallel --stream",
"format": "prettier -w \"**/*.{js,jsx,ts,tsx,md,json}\"",
diff --git a/packages/astro/components/Markdown.astro b/packages/astro/components/Markdown.astro
index ae27876a9..cb0f9c003 100644
--- a/packages/astro/components/Markdown.astro
+++ b/packages/astro/components/Markdown.astro
@@ -1,5 +1,5 @@
---
-import { renderMarkdown } from 'astro/dist/frontend/markdown.js';
+import { renderMarkdown } from '@astrojs/markdown-support';
export let content: string;
export let $scope: string;
diff --git a/packages/astro/package.json b/packages/astro/package.json
index 3932d831f..1e4d0a1af 100644
--- a/packages/astro/package.json
+++ b/packages/astro/package.json
@@ -12,7 +12,7 @@
"./components": "./components/index.js",
"./components/*": "./components/*",
"./runtime/svelte": "./dist/frontend/runtime/svelte.js",
- "./dist/frontend/markdown.js": "./dist/frontend/markdown.js"
+ "./internal/*": "./dist/internal/*"
},
"imports": {
"#astro/compiler": "./dist/compiler/index.js",
@@ -28,13 +28,14 @@
"astro.mjs"
],
"scripts": {
- "build": "astro-scripts build \"src/*.ts\" \"src/compiler/index.ts\" \"src/frontend/**/*.ts\" && tsc",
+ "build": "astro-scripts build \"src/*.ts\" \"src/compiler/index.ts\" \"src/frontend/**/*.ts\" \"src/internal/**/*.ts\" && tsc",
"postbuild": "astro-scripts copy \"src/**/*.astro\"",
"dev": "astro-scripts dev \"src/**/*.ts\"",
"benchmark": "node test/benchmark/dev.bench.js && node test/benchmark/build.bench.js",
"test": "uvu test -i fixtures -i benchmark -i test-utils.js"
},
"dependencies": {
+ "@astrojs/markdown-support": "0.1.0",
"@astrojs/renderer-preact": "0.1.0",
"@astrojs/renderer-react": "0.1.0",
"@astrojs/renderer-svelte": "0.1.0",
@@ -60,7 +61,6 @@
"fast-xml-parser": "^3.19.0",
"fdir": "^5.0.0",
"find-up": "^5.0.0",
- "github-slugger": "^1.3.0",
"gray-matter": "^4.0.2",
"gzip-size": "^6.0.0",
"hast-to-hyperscript": "~9.0.0",
@@ -76,9 +76,6 @@
"postcss": "^8.2.15",
"postcss-icss-keyframes": "^0.2.1",
"prismjs": "^1.23.0",
- "rehype-parse": "^7.0.1",
- "rehype-raw": "^5.1.0",
- "rehype-stringify": "^8.0.0",
"remark-footnotes": "^3.0.0",
"remark-gfm": "^1.0.0",
"remark-parse": "^9.0.0",
@@ -89,11 +86,10 @@
"sass": "^1.32.13",
"shorthash": "^0.0.2",
"slash": "^4.0.0",
- "snowpack": "^3.5.4",
+ "snowpack": "^3.5.5",
"source-map-support": "^0.5.19",
"string-width": "^5.0.0",
"tiny-glob": "^0.2.8",
- "unified": "^9.2.1",
"yargs-parser": "^20.2.7"
},
"devDependencies": {
@@ -103,13 +99,11 @@
"@types/babel__parser": "^7.1.1",
"@types/babel__traverse": "^7.11.1",
"@types/estree": "0.0.46",
- "@types/github-slugger": "^1.3.0",
"@types/mime": "^2.0.3",
"@types/node": "^14.14.31",
"@types/sass": "^1.16.0",
"@types/yargs-parser": "^20.2.0",
- "astro-scripts": "0.0.1",
- "unist-util-visit": "^3.1.0"
+ "astro-scripts": "0.0.1"
},
"engines": {
"node": ">=14.0.0",
diff --git a/packages/astro/snowpack-plugin.cjs b/packages/astro/snowpack-plugin.cjs
index 9a208e262..b1098917f 100644
--- a/packages/astro/snowpack-plugin.cjs
+++ b/packages/astro/snowpack-plugin.cjs
@@ -33,7 +33,7 @@ module.exports = (snowpackConfig, { resolvePackageUrl, hmrPort, renderers, astro
*/
async transform({contents, id, fileExt}) {
if (fileExt === '.js' && /__astro_component\.js/g.test(id)) {
- const rendererServerPackages = await Promise.all(renderers.map(({ server }) => resolvePackageUrl(server)));
+ const rendererServerPackages = renderers.map(({ server }) => server);
const rendererClientPackages = await Promise.all(renderers.map(({ client }) => resolvePackageUrl(client)));
const result = `${rendererServerPackages.map((pkg, i) => `import __renderer_${i} from "${pkg}";`).join('\n')}
let __rendererSources = [${rendererClientPackages.map(pkg => `"${pkg}"`).join(', ')}];
diff --git a/packages/astro/src/compiler/codegen/index.ts b/packages/astro/src/compiler/codegen/index.ts
index a37861a28..41044ffe7 100644
--- a/packages/astro/src/compiler/codegen/index.ts
+++ b/packages/astro/src/compiler/codegen/index.ts
@@ -17,7 +17,8 @@ import { error, warn } from '../../logger.js';
import { fetchContent } from './content.js';
import { isFetchContent } from './utils.js';
import { yellow } from 'kleur/colors';
-import { isComponentTag, renderMarkdown } from '../utils';
+import { isComponentTag } from '../utils';
+import { renderMarkdown } from '@astrojs/markdown-support';
import { transform } from '../transform/index.js';
import { PRISM_IMPORT } from '../transform/prism.js';
@@ -41,11 +42,6 @@ interface CodeGenOptions {
fileID: string;
}
-/** Format Astro internal import URL */
-function internalImport(internalPath: string) {
- return `/_astro_internal/${internalPath}`;
-}
-
/** Retrieve attributes from TemplateNode */
function getAttributes(attrs: Attribute[]): Record<string, string> {
let result: Record<string, string> = {};
@@ -169,7 +165,7 @@ function getComponentWrapper(_name: string, { url, importSpecifier }: ComponentI
const importInfo = kind ? { componentUrl: getComponentUrl(), componentExport: getComponentExport() } : {};
return {
wrapper: `__astro_component(${name}, ${JSON.stringify({ hydrate: kind, displayName: _name, ...importInfo })})`,
- wrapperImport: `import {__astro_component} from '${internalImport('__astro_component.js')}';`,
+ wrapperImport: `import {__astro_component} from 'astro/internal/__astro_component.js';`,
};
}
diff --git a/packages/astro/src/compiler/index.ts b/packages/astro/src/compiler/index.ts
index ac107ae7a..1ef4079c5 100644
--- a/packages/astro/src/compiler/index.ts
+++ b/packages/astro/src/compiler/index.ts
@@ -3,7 +3,7 @@ import type { CompileResult, TransformResult } from '../@types/astro';
import type { CompileOptions } from '../@types/compiler.js';
import path from 'path';
-import { renderMarkdownWithFrontmatter } from './utils.js';
+import { renderMarkdownWithFrontmatter } from '@astrojs/markdown-support';
import { parse } from 'astro-parser';
import { transform } from './transform/index.js';
@@ -11,11 +11,6 @@ import { codegen } from './codegen/index.js';
export { scopeRule } from './transform/postcss-scoped-styles/index.js';
-/** Return Astro internal import URL */
-function internalImport(internalPath: string) {
- return `/_astro_internal/${internalPath}`;
-}
-
interface ConvertAstroOptions {
compileOptions: CompileOptions;
filename: string;
@@ -119,7 +114,7 @@ import fetch from 'node-fetch';
${result.imports.join('\n')}
// \`__render()\`: Render the contents of the Astro module.
-import { h, Fragment } from '${internalImport('h.js')}';
+import { h, Fragment } from 'astro/internal/h.js';
const __astroRequestSymbol = Symbol('astro.request');
async function __render(props, ...children) {
const Astro = {
diff --git a/packages/astro/src/compiler/markdown/micromark.d.ts b/packages/astro/src/compiler/markdown/micromark.d.ts
deleted file mode 100644
index e0832e31c..000000000
--- a/packages/astro/src/compiler/markdown/micromark.d.ts
+++ /dev/null
@@ -1,14 +0,0 @@
-declare module '@silvenon/remark-smartypants' {
- export default function (): any;
-}
-
-declare module 'mdast-util-mdx';
-declare module 'micromark-extension-mdxjs';
-
-declare module 'mdast-util-mdx/from-markdown.js' {
- export default function (): any;
-}
-
-declare module 'mdast-util-mdx/to-markdown.js' {
- export default function (): any;
-}
diff --git a/packages/astro/src/compiler/markdown/remark-mdx-lite.ts b/packages/astro/src/compiler/markdown/remark-mdx-lite.ts
deleted file mode 100644
index 6075134a7..000000000
--- a/packages/astro/src/compiler/markdown/remark-mdx-lite.ts
+++ /dev/null
@@ -1,30 +0,0 @@
-import syntaxMdxjs from 'micromark-extension-mdxjs';
-import { fromMarkdown, toMarkdown } from 'mdast-util-mdx';
-
-/**
- * Add the micromark and mdast extensions for MDX.js (JS aware MDX).
- *
- * @this {Processor}
- * @param {MdxOptions} [options]
- * @return {void}
- */
-export function remarkMdx(this: any, options: any) {
- let data = this.data();
-
- add('micromarkExtensions', syntaxMdxjs(options));
- add('fromMarkdownExtensions', fromMarkdown);
- add('toMarkdownExtensions', toMarkdown);
-
- /**
- * @param {string} field
- * @param {unknown} value
- */
- function add(field: string, value: any) {
- // Other extensions defined before this.
- // Useful when externalizing.
- /* c8 ignore next 2 */
- // @ts-ignore Assume it’s an array.
- if (data[field]) data[field].push(value);
- else data[field] = [value];
- }
-}
diff --git a/packages/astro/src/compiler/utils.ts b/packages/astro/src/compiler/utils.ts
index 2b7438d87..acbdf9c96 100644
--- a/packages/astro/src/compiler/utils.ts
+++ b/packages/astro/src/compiler/utils.ts
@@ -1,72 +1,3 @@
-import type { AstroMarkdownOptions } from '../@types/astro';
-import createCollectHeaders from './markdown/rehype-collect-headers.js';
-import scopedStyles from './markdown/remark-scoped-styles.js';
-import { remarkCodeBlock, rehypeCodeBlock } from './markdown/codeblock.js';
-import raw from 'rehype-raw';
-
-import unified from 'unified';
-import markdown from 'remark-parse';
-import markdownToHtml from 'remark-rehype';
-// import smartypants from '@silvenon/remark-smartypants';
-import rehypeStringify from 'rehype-stringify';
-
-export interface MarkdownRenderingOptions extends Partial<AstroMarkdownOptions> {
- $?: {
- scopedClassName: string | null;
- };
- mode: 'md' | 'astro-md';
-}
-
-/** Internal utility for rendering a full markdown file and extracting Frontmatter data */
-export async function renderMarkdownWithFrontmatter(contents: string, opts?: MarkdownRenderingOptions | null) {
- // Dynamic import to ensure that "gray-matter" isn't built by Snowpack
- const { default: matter } = await import('gray-matter');
- const { data: frontmatter, content } = matter(contents);
- const value = await renderMarkdown(content, { ...opts, mode: 'md' });
- return { ...value, frontmatter };
-}
-
-/** Shared utility for rendering markdown */
-export async function renderMarkdown(content: string, opts?: MarkdownRenderingOptions | null) {
- const { $: { scopedClassName = null } = {}, mode = 'astro-md', footnotes: useFootnotes = true, gfm: useGfm = true } = opts ?? {};
- const { headers, rehypeCollectHeaders } = createCollectHeaders();
-
- let parser = unified().use(markdown).use(remarkCodeBlock());
-
- if (scopedClassName) {
- parser = parser.use(scopedStyles(scopedClassName));
- }
-
- if (useGfm) {
- const { default: gfm } = await import('remark-gfm');
- parser = parser.use(gfm);
- }
-
- if (useFootnotes) {
- const { default: footnotes } = await import('remark-footnotes');
- parser = parser.use(footnotes);
- }
-
- let result: string;
- try {
- const vfile = await parser
- .use(markdownToHtml, { allowDangerousHtml: true, passThrough: ['raw'] })
- .use(raw)
- .use(rehypeCollectHeaders)
- .use(rehypeCodeBlock())
- .use(rehypeStringify)
- .process(content);
- result = vfile.contents.toString();
- } catch (err) {
- throw err;
- }
-
- return {
- astro: { headers, source: content },
- content: result.toString(),
- };
-}
-
/** Is the given string a valid component tag */
export function isComponentTag(tag: string) {
return /^[A-Z]/.test(tag) || /^[a-z]+\./.test(tag);
diff --git a/packages/astro/src/external.ts b/packages/astro/src/external.ts
index 63abeffad..a6ab86bea 100644
--- a/packages/astro/src/external.ts
+++ b/packages/astro/src/external.ts
@@ -17,7 +17,7 @@ const isAstroRenderer = (name: string) => {
// These packages should NOT be built by `esinstall`
// But might not be explicit dependencies of `astro`
-const denyList = ['prismjs/components/index.js', '@vue/server-renderer', 'astro/dist/frontend/markdown.js'];
+const denyList = ['prismjs/components/index.js', '@vue/server-renderer', '@astrojs/markdown-support'];
export default Object.keys(pkg.dependencies)
// Filter out packages that should be loaded threw Snowpack
diff --git a/packages/astro/src/frontend/markdown.ts b/packages/astro/src/frontend/markdown.ts
deleted file mode 100644
index d85635334..000000000
--- a/packages/astro/src/frontend/markdown.ts
+++ /dev/null
@@ -1 +0,0 @@
-export { renderMarkdown } from '../compiler/utils';
diff --git a/packages/astro/src/frontend/__astro_component.ts b/packages/astro/src/internal/__astro_component.ts
index f5e029f7c..191b05cc7 100644
--- a/packages/astro/src/frontend/__astro_component.ts
+++ b/packages/astro/src/internal/__astro_component.ts
@@ -56,7 +56,7 @@ async function generateHydrateScript({ renderer, astroId, props }: any, { hydrat
const rendererSource = __rendererSources[__renderers.findIndex((r) => r === renderer)];
const script = `<script type="module">
-import setup from '/_astro_internal/hydrate/${hydrate}.js';
+import setup from '/_astro_frontend/hydrate/${hydrate}.js';
setup("${astroId}", async () => {
const [{ ${componentExport.value}: Component }, { default: hydrate }] = await Promise.all([import("${componentUrl}"), import("${rendererSource}")]);
return (el, children) => hydrate(el)(Component, ${serialize(props)}, children);
diff --git a/packages/astro/src/frontend/h.ts b/packages/astro/src/internal/h.ts
index bcfb4833f..bcfb4833f 100644
--- a/packages/astro/src/frontend/h.ts
+++ b/packages/astro/src/internal/h.ts
diff --git a/packages/astro/src/frontend/renderer-astro.ts b/packages/astro/src/internal/renderer-astro.ts
index 10af2a5a9..10af2a5a9 100644
--- a/packages/astro/src/frontend/renderer-astro.ts
+++ b/packages/astro/src/internal/renderer-astro.ts
diff --git a/packages/astro/src/runtime.ts b/packages/astro/src/runtime.ts
index a73df33d6..931837910 100644
--- a/packages/astro/src/runtime.ts
+++ b/packages/astro/src/runtime.ts
@@ -310,7 +310,7 @@ async function createSnowpack(astroConfig: AstroConfig, options: CreateSnowpackO
const { projectRoot, pages: pagesRoot, renderers = DEFAULT_RENDERERS } = astroConfig;
const { env, mode, resolvePackageUrl, target } = options;
- const internalPath = new URL('./frontend/', import.meta.url);
+ const frontendPath = new URL('./frontend/', import.meta.url);
const resolveDependency = (dep: string) => resolve.sync(dep, { basedir: fileURLToPath(projectRoot) });
const isHmrEnabled = mode === 'development' && target === 'backend';
@@ -329,7 +329,7 @@ async function createSnowpack(astroConfig: AstroConfig, options: CreateSnowpackO
const mountOptions = {
[fileURLToPath(pagesRoot)]: '/_astro/pages',
...(existsSync(astroConfig.public) ? { [fileURLToPath(astroConfig.public)]: '/' } : {}),
- [fileURLToPath(internalPath)]: '/_astro_internal',
+ [fileURLToPath(frontendPath)]: '/_astro_frontend',
[fileURLToPath(projectRoot)]: '/_astro', // must be last (greediest)
};
diff --git a/packages/astro/src/search.ts b/packages/astro/src/search.ts
index 693b2a481..233298991 100644
--- a/packages/astro/src/search.ts
+++ b/packages/astro/src/search.ts
@@ -97,7 +97,7 @@ export function searchForPage(url: URL, pagesRoot: URL): SearchResult {
statusCode: 200,
location: {
fileURL: new URL('./frontend/500.astro', import.meta.url),
- snowpackURL: `/_astro_internal/500.astro.js`,
+ snowpackURL: `/_astro_frontend/500.astro.js`,
},
pathname: reqPath,
};
diff --git a/packages/astro/test/astro-children.test.js b/packages/astro/test/astro-children.test.js
index bb96a750d..f986887de 100644
--- a/packages/astro/test/astro-children.test.js
+++ b/packages/astro/test/astro-children.test.js
@@ -10,7 +10,6 @@ setupBuild(ComponentChildren, './fixtures/astro-children');
ComponentChildren('Passes string children to framework components', async ({ runtime }) => {
let result = await runtime.load('/strings');
- console.log(JSON.stringify(result, null, 2));
if (result.error) throw new Error(result);
const $ = doc(result.contents);
diff --git a/packages/markdown-support/package.json b/packages/markdown-support/package.json
new file mode 100644
index 000000000..88c8cd1c8
--- /dev/null
+++ b/packages/markdown-support/package.json
@@ -0,0 +1,23 @@
+{
+ "name": "@astrojs/markdown-support",
+ "version": "0.1.0",
+ "main": "./dist/index.js",
+ "type": "commonjs",
+ "exports": {
+ ".": "./dist/index.js"
+ },
+ "scripts": {
+ "prepublish": "yarn build",
+ "build": "astro-scripts build --format cjs \"src/**/*.ts\" && tsc -p tsconfig.json",
+ "dev": "astro-scripts dev \"src/**/*.ts\""
+ },
+ "devDependencies": {
+ "@types/github-slugger": "^1.3.0",
+ "github-slugger": "^1.3.0",
+ "rehype-parse": "^7.0.1",
+ "rehype-raw": "^5.1.0",
+ "rehype-stringify": "^8.0.0",
+ "unified": "^9.2.1",
+ "unist-util-visit": "^3.1.0"
+ }
+}
diff --git a/packages/astro/src/compiler/markdown/codeblock.ts b/packages/markdown-support/src/codeblock.ts
index 2f48c6631..2f48c6631 100644
--- a/packages/astro/src/compiler/markdown/codeblock.ts
+++ b/packages/markdown-support/src/codeblock.ts
diff --git a/packages/markdown-support/src/index.ts b/packages/markdown-support/src/index.ts
new file mode 100644
index 000000000..4db3089ba
--- /dev/null
+++ b/packages/markdown-support/src/index.ts
@@ -0,0 +1,69 @@
+import type { AstroMarkdownOptions } from './types';
+
+import createCollectHeaders from './rehype-collect-headers.js';
+import scopedStyles from './remark-scoped-styles.js';
+import { remarkCodeBlock, rehypeCodeBlock } from './codeblock.js';
+import raw from 'rehype-raw';
+
+import unified from 'unified';
+import markdown from 'remark-parse';
+import markdownToHtml from 'remark-rehype';
+// import smartypants from '@silvenon/remark-smartypants';
+import rehypeStringify from 'rehype-stringify';
+
+export interface MarkdownRenderingOptions extends Partial<AstroMarkdownOptions> {
+ $?: {
+ scopedClassName: string | null;
+ };
+ mode: 'md' | 'astro-md';
+}
+
+/** Internal utility for rendering a full markdown file and extracting Frontmatter data */
+export async function renderMarkdownWithFrontmatter(contents: string, opts?: MarkdownRenderingOptions | null) {
+ // Dynamic import to ensure that "gray-matter" isn't built by Snowpack
+ const { default: matter } = await import('gray-matter');
+ const { data: frontmatter, content } = matter(contents);
+ const value = await renderMarkdown(content, { ...opts, mode: 'md' });
+ return { ...value, frontmatter };
+}
+
+/** Shared utility for rendering markdown */
+export async function renderMarkdown(content: string, opts?: MarkdownRenderingOptions | null) {
+ const { $: { scopedClassName = null } = {}, mode = 'astro-md', footnotes: useFootnotes = true, gfm: useGfm = true } = opts ?? {};
+ const { headers, rehypeCollectHeaders } = createCollectHeaders();
+
+ let parser = unified().use(markdown).use(remarkCodeBlock());
+
+ if (scopedClassName) {
+ parser = parser.use(scopedStyles(scopedClassName));
+ }
+
+ if (useGfm) {
+ const { default: gfm } = await import('remark-gfm');
+ parser = parser.use(gfm);
+ }
+
+ if (useFootnotes) {
+ const { default: footnotes } = await import('remark-footnotes');
+ parser = parser.use(footnotes);
+ }
+
+ let result: string;
+ try {
+ const vfile = await parser
+ .use(markdownToHtml, { allowDangerousHtml: true, passThrough: ['raw'] })
+ .use(raw)
+ .use(rehypeCollectHeaders)
+ .use(rehypeCodeBlock())
+ .use(rehypeStringify)
+ .process(content);
+ result = vfile.contents.toString();
+ } catch (err) {
+ throw err;
+ }
+
+ return {
+ astro: { headers, source: content },
+ content: result.toString(),
+ };
+} \ No newline at end of file
diff --git a/packages/astro/src/compiler/markdown/rehype-collect-headers.ts b/packages/markdown-support/src/rehype-collect-headers.ts
index edfcd29bc..edfcd29bc 100644
--- a/packages/astro/src/compiler/markdown/rehype-collect-headers.ts
+++ b/packages/markdown-support/src/rehype-collect-headers.ts
diff --git a/packages/astro/src/compiler/markdown/remark-scoped-styles.ts b/packages/markdown-support/src/remark-scoped-styles.ts
index 9ca70c029..9ca70c029 100644
--- a/packages/astro/src/compiler/markdown/remark-scoped-styles.ts
+++ b/packages/markdown-support/src/remark-scoped-styles.ts
diff --git a/packages/markdown-support/src/types.ts b/packages/markdown-support/src/types.ts
new file mode 100644
index 000000000..e86535567
--- /dev/null
+++ b/packages/markdown-support/src/types.ts
@@ -0,0 +1,6 @@
+export interface AstroMarkdownOptions {
+ /** Enable or disable footnotes syntax extension */
+ footnotes: boolean;
+ /** Enable or disable GitHub-flavored Markdown syntax extension */
+ gfm: boolean;
+} \ No newline at end of file
diff --git a/packages/markdown-support/tsconfig.json b/packages/markdown-support/tsconfig.json
new file mode 100644
index 000000000..13d42008a
--- /dev/null
+++ b/packages/markdown-support/tsconfig.json
@@ -0,0 +1,10 @@
+{
+ "extends": "../../tsconfig.base.json",
+ "include": ["src"],
+ "compilerOptions": {
+ "allowJs": true,
+ "target": "ES2020",
+ "module": "CommonJS",
+ "outDir": "./dist"
+ }
+}
diff --git a/yarn.lock b/yarn.lock
index 7ca6b4208..919e96315 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -8906,10 +8906,10 @@ smartwrap@^1.2.3:
wcwidth "^1.0.1"
yargs "^15.1.0"
-snowpack@^3.5.4:
- version "3.5.4"
- resolved "https://registry.yarnpkg.com/snowpack/-/snowpack-3.5.4.tgz#6f341714825f4080aeb2f7aa40a778c04c55934d"
- integrity sha512-knm8Xv1Zh1/UW0jLuqu2f0VARN5WjZVeRWsFoSzdoXTsXaxctROVungRRirr++m4KhzHC32EG9K4+y28p1nknA==
+snowpack@^3.5.5:
+ version "3.5.5"
+ resolved "https://registry.yarnpkg.com/snowpack/-/snowpack-3.5.5.tgz#80729286d5f1d7db57e13aff44af750888155f3b"
+ integrity sha512-Ij+ETrYo6S1/AQ4O+AVixbXmbBHb+iOzmM9WWLLIu9QE4U12Im05lWobqbEBBXG9V4dNwQKdGe5rP1d40JnglA==
dependencies:
cli-spinners "^2.5.0"
default-browser-id "^2.0.0"