From 5b4fb6c1cec5fa7ec12fbbb7086c9b67f8b80b5a Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Mon, 12 Sep 2022 11:17:17 -0400 Subject: [PATCH 01/11] fix: serialize route pattern for Netlify edge Co-authored-by: Jackie Macharia --- .../integrations/netlify/src/integration-edge-functions.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/integrations/netlify/src/integration-edge-functions.ts b/packages/integrations/netlify/src/integration-edge-functions.ts index 11a18beb9e70..94972b3d1939 100644 --- a/packages/integrations/netlify/src/integration-edge-functions.ts +++ b/packages/integrations/netlify/src/integration-edge-functions.ts @@ -51,6 +51,10 @@ async function createEdgeManifest(routes: RouteData[], entryFile: string, dir: U path: route.pathname, }); } else { + console.log({ + og: route.pattern.source.toString(), + new: route.pattern.source.replace(/\\\//g, '/').toString(), + }); functions.push({ function: entryFile, // Make route pattern serializable to match expected From 8ee7ad12234753dd567fca85098adb2f596065de Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Fri, 23 Sep 2022 17:14:30 -0400 Subject: [PATCH 02/11] fix: escape import.meta.env in MDX compiler output --- packages/integrations/mdx/src/index.ts | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/packages/integrations/mdx/src/index.ts b/packages/integrations/mdx/src/index.ts index 571fecb678df..b082e5303ee4 100644 --- a/packages/integrations/mdx/src/index.ts +++ b/packages/integrations/mdx/src/index.ts @@ -7,6 +7,7 @@ import { VFile } from 'vfile'; import type { Plugin as VitePlugin } from 'vite'; import { rehypeApplyFrontmatterExport } from './astro-data-utils.js'; import type { MdxOptions } from './utils.js'; +import fs from 'node:fs/promises'; import { getFileInfo, getRehypePlugins, @@ -66,9 +67,13 @@ export default function mdx(mdxOptions: MdxOptions = {}): AstroIntegration { ...mdxPlugin(mdxPluginOpts), // Override transform to alter code before MDX compilation // ex. inject layouts - async transform(code, id) { + async transform(_, id) { if (!id.endsWith('mdx')) return; + // Read code from file manually to prevent Vite from parsing `import.meta.env` expressions + const { fileId } = getFileInfo(id, config); + const code = await fs.readFile(fileId, 'utf-8'); + const { data: frontmatter, content: pageContent } = parseFrontmatter(code, id); const compiled = await mdxCompile(new VFile({ value: pageContent, path: id }), { ...mdxPluginOpts, @@ -79,7 +84,7 @@ export default function mdx(mdxOptions: MdxOptions = {}): AstroIntegration { }); return { - code: String(compiled.value), + code: escapeViteEnvReferences(String(compiled.value)), map: compiled.map, }; }, @@ -123,7 +128,7 @@ export default function mdx(mdxOptions: MdxOptions = {}): AstroIntegration { import.meta.hot.decline(); }`; } - return code; + return escapeViteEnvReferences(code); }, }, ] as VitePlugin[], @@ -133,3 +138,10 @@ export default function mdx(mdxOptions: MdxOptions = {}): AstroIntegration { }, }; } + +// Converts the first dot in `import.meta.env` to its Unicode escape sequence, +// which prevents Vite from replacing strings like `import.meta.env.SITE` +// in our JS representation of loaded Markdown files +function escapeViteEnvReferences(code: string) { + return code.replace(/import\.meta\.env/g, 'import\\u002Emeta.env'); +} From 80673dddd0f0a09aa53af53b64409f601c1d227d Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Fri, 23 Sep 2022 17:36:44 -0400 Subject: [PATCH 03/11] test: env vars in mdx --- .../mdx-env-variables/astro.config.mjs | 8 ++++++ .../fixtures/mdx-env-variables/package.json | 7 +++++ .../src/pages/frontmatter.json.js | 7 +++++ .../src/pages/vite-env-vars.mdx | 11 ++++++++ .../mdx/test/mdx-env-variables.test.js | 27 +++++++++++++++++++ pnpm-lock.yaml | 8 ++++++ 6 files changed, 68 insertions(+) create mode 100644 packages/integrations/mdx/test/fixtures/mdx-env-variables/astro.config.mjs create mode 100644 packages/integrations/mdx/test/fixtures/mdx-env-variables/package.json create mode 100644 packages/integrations/mdx/test/fixtures/mdx-env-variables/src/pages/frontmatter.json.js create mode 100644 packages/integrations/mdx/test/fixtures/mdx-env-variables/src/pages/vite-env-vars.mdx create mode 100644 packages/integrations/mdx/test/mdx-env-variables.test.js diff --git a/packages/integrations/mdx/test/fixtures/mdx-env-variables/astro.config.mjs b/packages/integrations/mdx/test/fixtures/mdx-env-variables/astro.config.mjs new file mode 100644 index 000000000000..e5084bf96ecf --- /dev/null +++ b/packages/integrations/mdx/test/fixtures/mdx-env-variables/astro.config.mjs @@ -0,0 +1,8 @@ +import mdx from '@astrojs/mdx'; + +export default { + markdown: { + syntaxHighlight: false, + }, + integrations: [mdx()], +} diff --git a/packages/integrations/mdx/test/fixtures/mdx-env-variables/package.json b/packages/integrations/mdx/test/fixtures/mdx-env-variables/package.json new file mode 100644 index 000000000000..d282c887ec25 --- /dev/null +++ b/packages/integrations/mdx/test/fixtures/mdx-env-variables/package.json @@ -0,0 +1,7 @@ +{ + "name": "@test/mdx-env-variables", + "dependencies": { + "astro": "workspace:*", + "@astrojs/mdx": "workspace:*" + } +} diff --git a/packages/integrations/mdx/test/fixtures/mdx-env-variables/src/pages/frontmatter.json.js b/packages/integrations/mdx/test/fixtures/mdx-env-variables/src/pages/frontmatter.json.js new file mode 100644 index 000000000000..ce3cf81e5cf8 --- /dev/null +++ b/packages/integrations/mdx/test/fixtures/mdx-env-variables/src/pages/frontmatter.json.js @@ -0,0 +1,7 @@ +import { frontmatter } from './vite-env-vars.mdx'; + +export function get() { + return { + body: JSON.stringify(frontmatter), + } +} diff --git a/packages/integrations/mdx/test/fixtures/mdx-env-variables/src/pages/vite-env-vars.mdx b/packages/integrations/mdx/test/fixtures/mdx-env-variables/src/pages/vite-env-vars.mdx new file mode 100644 index 000000000000..6598116308e7 --- /dev/null +++ b/packages/integrations/mdx/test/fixtures/mdx-env-variables/src/pages/vite-env-vars.mdx @@ -0,0 +1,11 @@ +--- +title: Let's talk about me import.meta.env.SITE +--- + +# About my import.meta.env.SITE + +My `import.meta.env.SITE` is so cool, I can put env variables in code! + +```js +const site = import.meta.env.SITE +``` diff --git a/packages/integrations/mdx/test/mdx-env-variables.test.js b/packages/integrations/mdx/test/mdx-env-variables.test.js new file mode 100644 index 000000000000..d471b3842008 --- /dev/null +++ b/packages/integrations/mdx/test/mdx-env-variables.test.js @@ -0,0 +1,27 @@ +import { expect } from 'chai'; +import { parseHTML } from 'linkedom'; +import { loadFixture } from '../../../astro/test/test-utils.js'; + +describe('MDX - Vite env vars', () => { + let fixture; + before(async () => { + fixture = await loadFixture({ + root: new URL('./fixtures/mdx-env-variables/', import.meta.url), + }); + await fixture.build(); + }); + + it('Avoids transforming `import.meta.env` outside JSX expressions', async () => { + const html = await fixture.readFile('/vite-env-vars/index.html'); + const { document } = parseHTML(html); + console.log(html) + + expect(document.querySelector('h1')?.innerHTML).to.contain('import.meta.env.SITE'); + expect(document.querySelector('code')?.innerHTML).to.contain('import.meta.env.SITE'); + expect(document.querySelector('pre')?.innerHTML).to.contain('import.meta.env.SITE'); + }); + it('Allows referencing `import.meta.env` in frontmatter', async () => { + const { title = '' } = JSON.parse(await fixture.readFile('/frontmatter.json')); + expect(title).to.contain('import.meta.env.SITE'); + }); +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 651e9aa2fc67..42983a65e3ac 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2487,6 +2487,14 @@ importers: remark-shiki-twoslash: 3.1.0 remark-toc: 8.0.1 + packages/integrations/mdx/test/fixtures/mdx-env-variables: + specifiers: + '@astrojs/mdx': workspace:* + astro: workspace:* + dependencies: + '@astrojs/mdx': link:../../.. + astro: link:../../../../../astro + packages/integrations/mdx/test/fixtures/mdx-frontmatter-injection: specifiers: '@astrojs/mdx': workspace:* From b2d36f3137da92871f91824d1443752b545dd885 Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Fri, 23 Sep 2022 17:39:43 -0400 Subject: [PATCH 04/11] chore: changeset --- .changeset/metal-hats-explain.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/metal-hats-explain.md diff --git a/.changeset/metal-hats-explain.md b/.changeset/metal-hats-explain.md new file mode 100644 index 000000000000..9e12b700eb4d --- /dev/null +++ b/.changeset/metal-hats-explain.md @@ -0,0 +1,5 @@ +--- +'@astrojs/mdx': patch +--- + +Avoid parsing import.meta.env in MDX files From 537afc1bda4e8428ff0bc802b99783bbe2c60cdf Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Mon, 26 Sep 2022 15:59:01 -0400 Subject: [PATCH 05/11] deps: estree-util-visit, @types/estree --- packages/integrations/mdx/package.json | 2 ++ pnpm-lock.yaml | 5 ++++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/packages/integrations/mdx/package.json b/packages/integrations/mdx/package.json index 68c272bd3b43..a915ff66a7d3 100644 --- a/packages/integrations/mdx/package.json +++ b/packages/integrations/mdx/package.json @@ -34,6 +34,7 @@ "@mdx-js/rollup": "^2.1.1", "acorn": "^8.8.0", "es-module-lexer": "^0.10.5", + "estree-util-visit": "^1.2.0", "github-slugger": "^1.4.0", "gray-matter": "^4.0.3", "kleur": "^4.1.4", @@ -47,6 +48,7 @@ }, "devDependencies": { "@types/chai": "^4.3.1", + "@types/estree": "^1.0.0", "@types/mocha": "^9.1.1", "@types/yargs-parser": "^21.0.0", "astro": "workspace:*", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 42983a65e3ac..777e20d0278e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2434,6 +2434,7 @@ importers: '@mdx-js/mdx': ^2.1.2 '@mdx-js/rollup': ^2.1.1 '@types/chai': ^4.3.1 + '@types/estree': ^1.0.0 '@types/mocha': ^9.1.1 '@types/yargs-parser': ^21.0.0 acorn: ^8.8.0 @@ -2441,6 +2442,7 @@ importers: astro-scripts: workspace:* chai: ^4.3.6 es-module-lexer: ^0.10.5 + estree-util-visit: ^1.2.0 github-slugger: ^1.4.0 gray-matter: ^4.0.3 kleur: ^4.1.4 @@ -2463,6 +2465,7 @@ importers: '@mdx-js/rollup': 2.1.3 acorn: 8.8.0 es-module-lexer: 0.10.5 + estree-util-visit: 1.2.0 github-slugger: 1.4.0 gray-matter: 4.0.3 kleur: 4.1.5 @@ -2475,6 +2478,7 @@ importers: vfile: 5.3.5 devDependencies: '@types/chai': 4.3.3 + '@types/estree': 1.0.0 '@types/mocha': 9.1.1 '@types/yargs-parser': 21.0.0 astro: link:../../astro @@ -9064,7 +9068,6 @@ packages: /@types/estree/1.0.0: resolution: {integrity: sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==} - dev: false /@types/extend/3.0.1: resolution: {integrity: sha512-R1g/VyKFFI2HLC1QGAeTtCBWCo6n75l41OnsVYNbmKG+kempOESaodf6BeJyUM3Q0rKa/NQcTHbB2+66lNnxLw==} From 5c3590acd74495985ef0b2c06646102e08fda23a Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Mon, 26 Sep 2022 15:59:22 -0400 Subject: [PATCH 06/11] feat: inject import.meta.env w/ recma --- .../integrations/mdx/src/astro-data-utils.ts | 103 ------- packages/integrations/mdx/src/index.ts | 29 +- packages/integrations/mdx/src/plugins.ts | 273 ++++++++++++++++++ packages/integrations/mdx/src/utils.ts | 118 -------- 4 files changed, 294 insertions(+), 229 deletions(-) delete mode 100644 packages/integrations/mdx/src/astro-data-utils.ts create mode 100644 packages/integrations/mdx/src/plugins.ts diff --git a/packages/integrations/mdx/src/astro-data-utils.ts b/packages/integrations/mdx/src/astro-data-utils.ts deleted file mode 100644 index 9be96022e8de..000000000000 --- a/packages/integrations/mdx/src/astro-data-utils.ts +++ /dev/null @@ -1,103 +0,0 @@ -import type { MarkdownAstroData } from 'astro'; -import type { Data, VFile } from 'vfile'; -import { jsToTreeNode } from './utils.js'; - -export function remarkInitializeAstroData() { - return function (tree: any, vfile: VFile) { - if (!vfile.data.astro) { - vfile.data.astro = { frontmatter: {} }; - } - }; -} - -const EXPORT_NAME = 'frontmatter'; - -export function rehypeApplyFrontmatterExport(pageFrontmatter: Record) { - return function (tree: any, vfile: VFile) { - const { frontmatter: injectedFrontmatter } = safelyGetAstroData(vfile.data); - const frontmatter = { ...injectedFrontmatter, ...pageFrontmatter }; - const exportNodes = [ - jsToTreeNode(`export const ${EXPORT_NAME} = ${JSON.stringify(frontmatter)};`), - ]; - if (frontmatter.layout) { - // NOTE(bholmesdev) 08-22-2022 - // Using an async layout import (i.e. `const Layout = (await import...)`) - // Preserves the dev server import cache when globbing a large set of MDX files - // Full explanation: 'https://github.com/withastro/astro/pull/4428' - exportNodes.unshift( - jsToTreeNode( - /** @see 'vite-plugin-markdown' for layout props reference */ - `import { jsx as layoutJsx } from 'astro/jsx-runtime'; - - export default async function ({ children }) { - const Layout = (await import(${JSON.stringify(frontmatter.layout)})).default; - const { layout, ...content } = frontmatter; - content.file = file; - content.url = url; - content.astro = {}; - Object.defineProperty(content.astro, 'headings', { - get() { - throw new Error('The "astro" property is no longer supported! To access "headings" from your layout, try using "Astro.props.headings."') - } - }); - Object.defineProperty(content.astro, 'html', { - get() { - throw new Error('The "astro" property is no longer supported! To access "html" from your layout, try using "Astro.props.compiledContent()."') - } - }); - Object.defineProperty(content.astro, 'source', { - get() { - throw new Error('The "astro" property is no longer supported! To access "source" from your layout, try using "Astro.props.rawContent()."') - } - }); - return layoutJsx(Layout, { - file, - url, - content, - frontmatter: content, - headings: getHeadings(), - 'server:root': true, - children, - }); - };` - ) - ); - } - tree.children = exportNodes.concat(tree.children); - }; -} - -/** - * Copied from markdown utils - * @see "vite-plugin-utils" - */ -function isValidAstroData(obj: unknown): obj is MarkdownAstroData { - if (typeof obj === 'object' && obj !== null && obj.hasOwnProperty('frontmatter')) { - const { frontmatter } = obj as any; - try { - // ensure frontmatter is JSON-serializable - JSON.stringify(frontmatter); - } catch { - return false; - } - return typeof frontmatter === 'object' && frontmatter !== null; - } - return false; -} - -/** - * Copied from markdown utils - * @see "vite-plugin-utils" - */ -export function safelyGetAstroData(vfileData: Data): MarkdownAstroData { - const { astro } = vfileData; - - if (!astro) return { frontmatter: {} }; - if (!isValidAstroData(astro)) { - throw Error( - `[MDX] A remark or rehype plugin tried to add invalid frontmatter. Ensure "astro.frontmatter" is a JSON object!` - ); - } - - return astro; -} diff --git a/packages/integrations/mdx/src/index.ts b/packages/integrations/mdx/src/index.ts index b082e5303ee4..05ef52b4ca57 100644 --- a/packages/integrations/mdx/src/index.ts +++ b/packages/integrations/mdx/src/index.ts @@ -1,20 +1,19 @@ +import type { AstroIntegration } from 'astro'; +import type { Plugin as VitePlugin } from 'vite'; import { compile as mdxCompile } from '@mdx-js/mdx'; import mdxPlugin, { Options as MdxRollupPluginOptions } from '@mdx-js/rollup'; -import type { AstroIntegration } from 'astro'; import { parse as parseESM } from 'es-module-lexer'; import { blue, bold } from 'kleur/colors'; import { VFile } from 'vfile'; -import type { Plugin as VitePlugin } from 'vite'; -import { rehypeApplyFrontmatterExport } from './astro-data-utils.js'; -import type { MdxOptions } from './utils.js'; import fs from 'node:fs/promises'; +import { getFileInfo, handleExtendsNotSupported, parseFrontmatter } from './utils.js'; import { - getFileInfo, + recmaInjectImportMetaEnvPlugin, + rehypeApplyFrontmatterExport, getRehypePlugins, getRemarkPlugins, - handleExtendsNotSupported, - parseFrontmatter, -} from './utils.js'; +} from './plugins.js'; +import { PluggableList } from '@mdx-js/mdx/lib/core.js'; const RAW_CONTENT_ERROR = 'MDX does not support rawContent()! If you need to read the Markdown contents to calculate values (ex. reading time), we suggest injecting frontmatter via remark plugins. Learn more on our docs: https://docs.astro.build/en/guides/integrations-guide/mdx/#inject-frontmatter-via-remark-or-rehype-plugins'; @@ -22,6 +21,19 @@ const RAW_CONTENT_ERROR = const COMPILED_CONTENT_ERROR = 'MDX does not support compiledContent()! If you need to read the HTML contents to calculate values (ex. reading time), we suggest injecting frontmatter via rehype plugins. Learn more on our docs: https://docs.astro.build/en/guides/integrations-guide/mdx/#inject-frontmatter-via-remark-or-rehype-plugins'; +export type MdxOptions = { + remarkPlugins?: PluggableList; + rehypePlugins?: PluggableList; + /** + * Choose which remark and rehype plugins to inherit, if any. + * + * - "markdown" (default) - inherit your project’s markdown plugin config ([see Markdown docs](https://docs.astro.build/en/guides/markdown-content/#configuring-markdown)) + * - "astroDefaults" - inherit Astro’s default plugins only ([see defaults](https://docs.astro.build/en/reference/configuration-reference/#markdownextenddefaultplugins)) + * - false - do not inherit any plugins + */ + extendPlugins?: 'markdown' | 'astroDefaults' | false; +}; + export default function mdx(mdxOptions: MdxOptions = {}): AstroIntegration { return { name: '@astrojs/mdx', @@ -52,6 +64,7 @@ export default function mdx(mdxOptions: MdxOptions = {}): AstroIntegration { const mdxPluginOpts: MdxRollupPluginOptions = { remarkPlugins: await getRemarkPlugins(mdxOptions, config), rehypePlugins: getRehypePlugins(mdxOptions, config), + recmaPlugins: [recmaInjectImportMetaEnvPlugin], jsx: true, jsxImportSource: 'astro', // Note: disable `.md` support diff --git a/packages/integrations/mdx/src/plugins.ts b/packages/integrations/mdx/src/plugins.ts new file mode 100644 index 000000000000..194a55493276 --- /dev/null +++ b/packages/integrations/mdx/src/plugins.ts @@ -0,0 +1,273 @@ +import type { MemberExpression, Literal } from 'estree'; +import type { MarkdownAstroData, AstroConfig } from 'astro'; +import type { Data, VFile } from 'vfile'; +import { visit as estreeVisit } from 'estree-util-visit'; +import { jsToTreeNode } from './utils.js'; +import { nodeTypes } from '@mdx-js/mdx'; +import type { PluggableList } from '@mdx-js/mdx/lib/core.js'; +import type { Options as MdxRollupPluginOptions } from '@mdx-js/rollup'; +import { bold, yellow } from 'kleur/colors'; +import rehypeRaw from 'rehype-raw'; +import remarkGfm from 'remark-gfm'; +import remarkSmartypants from 'remark-smartypants'; +import rehypeCollectHeadings from './rehype-collect-headings.js'; +import remarkPrism from './remark-prism.js'; +import remarkShiki from './remark-shiki.js'; +import { MdxOptions } from './index.js'; + +const importMetaEnv: Record = { + SITE: 'bagels', +}; + +export function recmaInjectImportMetaEnvPlugin() { + return (tree: any) => { + estreeVisit(tree, (node) => { + if (node.type === 'MemberExpression') { + // attempt to get "import.meta.env" variable name + const envVarName = getImportMetaEnvVariableName(node as MemberExpression); + if (typeof envVarName === 'string') { + // clear object keys to replace with envVarLiteral + for (const key in node) { + delete (node as any)[key]; + } + const envVarLiteral: Literal = { + type: 'Literal', + value: importMetaEnv[envVarName], + raw: JSON.stringify(importMetaEnv[envVarName]), + }; + Object.assign(node, envVarLiteral); + } + } + }); + }; +} + +export function remarkInitializeAstroData() { + return function (tree: any, vfile: VFile) { + if (!vfile.data.astro) { + vfile.data.astro = { frontmatter: {} }; + } + }; +} + +const EXPORT_NAME = 'frontmatter'; + +export function rehypeApplyFrontmatterExport(pageFrontmatter: Record) { + return function (tree: any, vfile: VFile) { + const { frontmatter: injectedFrontmatter } = safelyGetAstroData(vfile.data); + const frontmatter = { ...injectedFrontmatter, ...pageFrontmatter }; + const exportNodes = [ + jsToTreeNode(`export const ${EXPORT_NAME} = ${JSON.stringify(frontmatter)};`), + ]; + if (frontmatter.layout) { + // NOTE(bholmesdev) 08-22-2022 + // Using an async layout import (i.e. `const Layout = (await import...)`) + // Preserves the dev server import cache when globbing a large set of MDX files + // Full explanation: 'https://github.com/withastro/astro/pull/4428' + exportNodes.unshift( + jsToTreeNode( + /** @see 'vite-plugin-markdown' for layout props reference */ + `import { jsx as layoutJsx } from 'astro/jsx-runtime'; + + export default async function ({ children }) { + const Layout = (await import(${JSON.stringify(frontmatter.layout)})).default; + const { layout, ...content } = frontmatter; + content.file = file; + content.url = url; + content.astro = {}; + Object.defineProperty(content.astro, 'headings', { + get() { + throw new Error('The "astro" property is no longer supported! To access "headings" from your layout, try using "Astro.props.headings."') + } + }); + Object.defineProperty(content.astro, 'html', { + get() { + throw new Error('The "astro" property is no longer supported! To access "html" from your layout, try using "Astro.props.compiledContent()."') + } + }); + Object.defineProperty(content.astro, 'source', { + get() { + throw new Error('The "astro" property is no longer supported! To access "source" from your layout, try using "Astro.props.rawContent()."') + } + }); + return layoutJsx(Layout, { + file, + url, + content, + frontmatter: content, + headings: getHeadings(), + 'server:root': true, + children, + }); + };` + ) + ); + } + tree.children = exportNodes.concat(tree.children); + }; +} + +const DEFAULT_REMARK_PLUGINS: PluggableList = [remarkGfm, remarkSmartypants]; +const DEFAULT_REHYPE_PLUGINS: PluggableList = []; + +export async function getRemarkPlugins( + mdxOptions: MdxOptions, + config: AstroConfig +): Promise { + let remarkPlugins: PluggableList = [ + // Set "vfile.data.astro" for plugins to inject frontmatter + remarkInitializeAstroData, + ]; + switch (mdxOptions.extendPlugins) { + case false: + break; + case 'astroDefaults': + remarkPlugins = [...remarkPlugins, ...DEFAULT_REMARK_PLUGINS]; + break; + default: + remarkPlugins = [ + ...remarkPlugins, + ...(markdownShouldExtendDefaultPlugins(config) ? DEFAULT_REMARK_PLUGINS : []), + ...ignoreStringPlugins(config.markdown.remarkPlugins ?? []), + ]; + break; + } + if (config.markdown.syntaxHighlight === 'shiki') { + remarkPlugins.push([await remarkShiki(config.markdown.shikiConfig)]); + } + if (config.markdown.syntaxHighlight === 'prism') { + remarkPlugins.push(remarkPrism); + } + + remarkPlugins = [...remarkPlugins, ...(mdxOptions.remarkPlugins ?? [])]; + return remarkPlugins; +} + +export function getRehypePlugins( + mdxOptions: MdxOptions, + config: AstroConfig +): MdxRollupPluginOptions['rehypePlugins'] { + let rehypePlugins: PluggableList = [ + // getHeadings() is guaranteed by TS, so we can't allow user to override + rehypeCollectHeadings, + // rehypeRaw allows custom syntax highlighters to work without added config + [rehypeRaw, { passThrough: nodeTypes }] as any, + ]; + switch (mdxOptions.extendPlugins) { + case false: + break; + case 'astroDefaults': + rehypePlugins = [...rehypePlugins, ...DEFAULT_REHYPE_PLUGINS]; + break; + default: + rehypePlugins = [ + ...rehypePlugins, + ...(markdownShouldExtendDefaultPlugins(config) ? DEFAULT_REHYPE_PLUGINS : []), + ...ignoreStringPlugins(config.markdown.rehypePlugins ?? []), + ]; + break; + } + + rehypePlugins = [...rehypePlugins, ...(mdxOptions.rehypePlugins ?? [])]; + return rehypePlugins; +} + +function markdownShouldExtendDefaultPlugins(config: AstroConfig): boolean { + return ( + config.markdown.extendDefaultPlugins || + (config.markdown.remarkPlugins.length === 0 && config.markdown.rehypePlugins.length === 0) + ); +} + +function ignoreStringPlugins(plugins: any[]) { + let validPlugins: PluggableList = []; + let hasInvalidPlugin = false; + for (const plugin of plugins) { + if (typeof plugin === 'string') { + console.warn(yellow(`[MDX] ${bold(plugin)} not applied.`)); + hasInvalidPlugin = true; + } else if (Array.isArray(plugin) && typeof plugin[0] === 'string') { + console.warn(yellow(`[MDX] ${bold(plugin[0])} not applied.`)); + hasInvalidPlugin = true; + } else { + validPlugins.push(plugin); + } + } + if (hasInvalidPlugin) { + console.warn( + `To inherit Markdown plugins in MDX, please use explicit imports in your config instead of "strings." See Markdown docs: https://docs.astro.build/en/guides/markdown-content/#markdown-plugins` + ); + } + return validPlugins; +} + +/** + * Copied from markdown utils + * @see "vite-plugin-utils" + */ +function isValidAstroData(obj: unknown): obj is MarkdownAstroData { + if (typeof obj === 'object' && obj !== null && obj.hasOwnProperty('frontmatter')) { + const { frontmatter } = obj as any; + try { + // ensure frontmatter is JSON-serializable + JSON.stringify(frontmatter); + } catch { + return false; + } + return typeof frontmatter === 'object' && frontmatter !== null; + } + return false; +} + +/** + * Copied from markdown utils + * @see "vite-plugin-utils" + */ +function safelyGetAstroData(vfileData: Data): MarkdownAstroData { + const { astro } = vfileData; + + if (!astro) return { frontmatter: {} }; + if (!isValidAstroData(astro)) { + throw Error( + `[MDX] A remark or rehype plugin tried to add invalid frontmatter. Ensure "astro.frontmatter" is a JSON object!` + ); + } + + return astro; +} + +/** + * Check if estree entry is "import.meta.env.VARIABLE" + * If it is, return the variable name (i.e. "VARIABLE") + */ +function getImportMetaEnvVariableName(node: MemberExpression): string | Error { + try { + // check for ".[ANYTHING]" + if (node.object.type !== 'MemberExpression' || node.property.type !== 'Identifier') + return new Error(); + + const nestedExpression = node.object; + // check for ".env" + if (nestedExpression.property.type !== 'Identifier' || nestedExpression.property.name !== 'env') + return new Error(); + + const envExpression = nestedExpression.object; + // check for ".meta" + if ( + envExpression.type !== 'MetaProperty' || + envExpression.property.type !== 'Identifier' || + envExpression.property.name !== 'meta' + ) + return new Error(); + + // check for "import" + if (envExpression.meta.name !== 'import') return new Error(); + + return node.property.name; + } catch (e) { + if (e instanceof Error) { + return e; + } + return new Error('Unknown parsing error'); + } +} diff --git a/packages/integrations/mdx/src/utils.ts b/packages/integrations/mdx/src/utils.ts index d4d13ab05ea8..60a50c85a4a0 100644 --- a/packages/integrations/mdx/src/utils.ts +++ b/packages/integrations/mdx/src/utils.ts @@ -1,32 +1,8 @@ -import { nodeTypes } from '@mdx-js/mdx'; -import type { PluggableList } from '@mdx-js/mdx/lib/core.js'; -import type { Options as MdxRollupPluginOptions } from '@mdx-js/rollup'; import type { Options as AcornOpts } from 'acorn'; import { parse } from 'acorn'; import type { AstroConfig, SSRError } from 'astro'; import matter from 'gray-matter'; -import { bold, yellow } from 'kleur/colors'; import type { MdxjsEsm } from 'mdast-util-mdx'; -import rehypeRaw from 'rehype-raw'; -import remarkGfm from 'remark-gfm'; -import remarkSmartypants from 'remark-smartypants'; -import { remarkInitializeAstroData } from './astro-data-utils.js'; -import rehypeCollectHeadings from './rehype-collect-headings.js'; -import remarkPrism from './remark-prism.js'; -import remarkShiki from './remark-shiki.js'; - -export type MdxOptions = { - remarkPlugins?: PluggableList; - rehypePlugins?: PluggableList; - /** - * Choose which remark and rehype plugins to inherit, if any. - * - * - "markdown" (default) - inherit your project’s markdown plugin config ([see Markdown docs](https://docs.astro.build/en/guides/markdown-content/#configuring-markdown)) - * - "astroDefaults" - inherit Astro’s default plugins only ([see defaults](https://docs.astro.build/en/reference/configuration-reference/#markdownextenddefaultplugins)) - * - false - do not inherit any plugins - */ - extendPlugins?: 'markdown' | 'astroDefaults' | false; -}; function appendForwardSlash(path: string) { return path.endsWith('/') ? path : path + '/'; @@ -37,9 +13,6 @@ interface FileInfo { fileUrl: string; } -const DEFAULT_REMARK_PLUGINS: PluggableList = [remarkGfm, remarkSmartypants]; -const DEFAULT_REHYPE_PLUGINS: PluggableList = []; - /** @see 'vite-plugin-utils' for source */ export function getFileInfo(id: string, config: AstroConfig): FileInfo { const sitePathname = appendForwardSlash( @@ -110,97 +83,6 @@ export function jsToTreeNode( }; } -export async function getRemarkPlugins( - mdxOptions: MdxOptions, - config: AstroConfig -): Promise { - let remarkPlugins: PluggableList = [ - // Set "vfile.data.astro" for plugins to inject frontmatter - remarkInitializeAstroData, - ]; - switch (mdxOptions.extendPlugins) { - case false: - break; - case 'astroDefaults': - remarkPlugins = [...remarkPlugins, ...DEFAULT_REMARK_PLUGINS]; - break; - default: - remarkPlugins = [ - ...remarkPlugins, - ...(markdownShouldExtendDefaultPlugins(config) ? DEFAULT_REMARK_PLUGINS : []), - ...ignoreStringPlugins(config.markdown.remarkPlugins ?? []), - ]; - break; - } - if (config.markdown.syntaxHighlight === 'shiki') { - remarkPlugins.push([await remarkShiki(config.markdown.shikiConfig)]); - } - if (config.markdown.syntaxHighlight === 'prism') { - remarkPlugins.push(remarkPrism); - } - - remarkPlugins = [...remarkPlugins, ...(mdxOptions.remarkPlugins ?? [])]; - return remarkPlugins; -} - -export function getRehypePlugins( - mdxOptions: MdxOptions, - config: AstroConfig -): MdxRollupPluginOptions['rehypePlugins'] { - let rehypePlugins: PluggableList = [ - // getHeadings() is guaranteed by TS, so we can't allow user to override - rehypeCollectHeadings, - // rehypeRaw allows custom syntax highlighters to work without added config - [rehypeRaw, { passThrough: nodeTypes }] as any, - ]; - switch (mdxOptions.extendPlugins) { - case false: - break; - case 'astroDefaults': - rehypePlugins = [...rehypePlugins, ...DEFAULT_REHYPE_PLUGINS]; - break; - default: - rehypePlugins = [ - ...rehypePlugins, - ...(markdownShouldExtendDefaultPlugins(config) ? DEFAULT_REHYPE_PLUGINS : []), - ...ignoreStringPlugins(config.markdown.rehypePlugins ?? []), - ]; - break; - } - - rehypePlugins = [...rehypePlugins, ...(mdxOptions.rehypePlugins ?? [])]; - return rehypePlugins; -} - -function markdownShouldExtendDefaultPlugins(config: AstroConfig): boolean { - return ( - config.markdown.extendDefaultPlugins || - (config.markdown.remarkPlugins.length === 0 && config.markdown.rehypePlugins.length === 0) - ); -} - -function ignoreStringPlugins(plugins: any[]) { - let validPlugins: PluggableList = []; - let hasInvalidPlugin = false; - for (const plugin of plugins) { - if (typeof plugin === 'string') { - console.warn(yellow(`[MDX] ${bold(plugin)} not applied.`)); - hasInvalidPlugin = true; - } else if (Array.isArray(plugin) && typeof plugin[0] === 'string') { - console.warn(yellow(`[MDX] ${bold(plugin[0])} not applied.`)); - hasInvalidPlugin = true; - } else { - validPlugins.push(plugin); - } - } - if (hasInvalidPlugin) { - console.warn( - `To inherit Markdown plugins in MDX, please use explicit imports in your config instead of "strings." See Markdown docs: https://docs.astro.build/en/guides/markdown-content/#markdown-plugins` - ); - } - return validPlugins; -} - // TODO: remove for 1.0 export function handleExtendsNotSupported(pluginConfig: any) { if ( From 0e5818ede15aab4736d25884bccd7bfd4e43a6f0 Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Mon, 26 Sep 2022 16:22:25 -0400 Subject: [PATCH 07/11] feat: pull importMetaEnv from vite + astro configs --- packages/integrations/mdx/src/index.ts | 9 ++++++++- packages/integrations/mdx/src/plugins.ts | 10 +++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/packages/integrations/mdx/src/index.ts b/packages/integrations/mdx/src/index.ts index 05ef52b4ca57..8909c8cae9fd 100644 --- a/packages/integrations/mdx/src/index.ts +++ b/packages/integrations/mdx/src/index.ts @@ -64,7 +64,6 @@ export default function mdx(mdxOptions: MdxOptions = {}): AstroIntegration { const mdxPluginOpts: MdxRollupPluginOptions = { remarkPlugins: await getRemarkPlugins(mdxOptions, config), rehypePlugins: getRehypePlugins(mdxOptions, config), - recmaPlugins: [recmaInjectImportMetaEnvPlugin], jsx: true, jsxImportSource: 'astro', // Note: disable `.md` support @@ -72,12 +71,19 @@ export default function mdx(mdxOptions: MdxOptions = {}): AstroIntegration { mdExtensions: [], }; + let importMetaEnv: Record = { + SITE: config.site, + }; + updateConfig({ vite: { plugins: [ { enforce: 'pre', ...mdxPlugin(mdxPluginOpts), + configResolved(resolved) { + importMetaEnv = { ...importMetaEnv, ...resolved.env }; + }, // Override transform to alter code before MDX compilation // ex. inject layouts async transform(_, id) { @@ -94,6 +100,7 @@ export default function mdx(mdxOptions: MdxOptions = {}): AstroIntegration { ...(mdxPluginOpts.rehypePlugins ?? []), () => rehypeApplyFrontmatterExport(frontmatter), ], + recmaPlugins: [() => recmaInjectImportMetaEnvPlugin({ importMetaEnv })], }); return { diff --git a/packages/integrations/mdx/src/plugins.ts b/packages/integrations/mdx/src/plugins.ts index 194a55493276..f6911ba99858 100644 --- a/packages/integrations/mdx/src/plugins.ts +++ b/packages/integrations/mdx/src/plugins.ts @@ -15,11 +15,11 @@ import remarkPrism from './remark-prism.js'; import remarkShiki from './remark-shiki.js'; import { MdxOptions } from './index.js'; -const importMetaEnv: Record = { - SITE: 'bagels', -}; - -export function recmaInjectImportMetaEnvPlugin() { +export function recmaInjectImportMetaEnvPlugin({ + importMetaEnv, +}: { + importMetaEnv: Record; +}) { return (tree: any) => { estreeVisit(tree, (node) => { if (node.type === 'MemberExpression') { From 0aa051eabcda78754917f0dcc9fe48adf6e15cd6 Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Mon, 26 Sep 2022 16:42:54 -0400 Subject: [PATCH 08/11] test: `import.meta.env` in JSX --- .../src/pages/vite-env-vars.mdx | 11 ---- .../astro.config.mjs | 1 + .../package.json | 0 .../src/pages/frontmatter.json.js | 0 .../src/pages/vite-env-vars.mdx | 38 ++++++++++++ .../mdx/test/mdx-env-variables.test.js | 27 --------- .../mdx/test/mdx-vite-env-vars.test.js | 58 +++++++++++++++++++ 7 files changed, 97 insertions(+), 38 deletions(-) delete mode 100644 packages/integrations/mdx/test/fixtures/mdx-env-variables/src/pages/vite-env-vars.mdx rename packages/integrations/mdx/test/fixtures/{mdx-env-variables => mdx-vite-env-vars}/astro.config.mjs (77%) rename packages/integrations/mdx/test/fixtures/{mdx-env-variables => mdx-vite-env-vars}/package.json (100%) rename packages/integrations/mdx/test/fixtures/{mdx-env-variables => mdx-vite-env-vars}/src/pages/frontmatter.json.js (100%) create mode 100644 packages/integrations/mdx/test/fixtures/mdx-vite-env-vars/src/pages/vite-env-vars.mdx delete mode 100644 packages/integrations/mdx/test/mdx-env-variables.test.js create mode 100644 packages/integrations/mdx/test/mdx-vite-env-vars.test.js diff --git a/packages/integrations/mdx/test/fixtures/mdx-env-variables/src/pages/vite-env-vars.mdx b/packages/integrations/mdx/test/fixtures/mdx-env-variables/src/pages/vite-env-vars.mdx deleted file mode 100644 index 6598116308e7..000000000000 --- a/packages/integrations/mdx/test/fixtures/mdx-env-variables/src/pages/vite-env-vars.mdx +++ /dev/null @@ -1,11 +0,0 @@ ---- -title: Let's talk about me import.meta.env.SITE ---- - -# About my import.meta.env.SITE - -My `import.meta.env.SITE` is so cool, I can put env variables in code! - -```js -const site = import.meta.env.SITE -``` diff --git a/packages/integrations/mdx/test/fixtures/mdx-env-variables/astro.config.mjs b/packages/integrations/mdx/test/fixtures/mdx-vite-env-vars/astro.config.mjs similarity index 77% rename from packages/integrations/mdx/test/fixtures/mdx-env-variables/astro.config.mjs rename to packages/integrations/mdx/test/fixtures/mdx-vite-env-vars/astro.config.mjs index e5084bf96ecf..df0e781939e8 100644 --- a/packages/integrations/mdx/test/fixtures/mdx-env-variables/astro.config.mjs +++ b/packages/integrations/mdx/test/fixtures/mdx-vite-env-vars/astro.config.mjs @@ -1,6 +1,7 @@ import mdx from '@astrojs/mdx'; export default { + site: 'https://mdx-is-neat.com/', markdown: { syntaxHighlight: false, }, diff --git a/packages/integrations/mdx/test/fixtures/mdx-env-variables/package.json b/packages/integrations/mdx/test/fixtures/mdx-vite-env-vars/package.json similarity index 100% rename from packages/integrations/mdx/test/fixtures/mdx-env-variables/package.json rename to packages/integrations/mdx/test/fixtures/mdx-vite-env-vars/package.json diff --git a/packages/integrations/mdx/test/fixtures/mdx-env-variables/src/pages/frontmatter.json.js b/packages/integrations/mdx/test/fixtures/mdx-vite-env-vars/src/pages/frontmatter.json.js similarity index 100% rename from packages/integrations/mdx/test/fixtures/mdx-env-variables/src/pages/frontmatter.json.js rename to packages/integrations/mdx/test/fixtures/mdx-vite-env-vars/src/pages/frontmatter.json.js diff --git a/packages/integrations/mdx/test/fixtures/mdx-vite-env-vars/src/pages/vite-env-vars.mdx b/packages/integrations/mdx/test/fixtures/mdx-vite-env-vars/src/pages/vite-env-vars.mdx new file mode 100644 index 000000000000..dae32aed2d8f --- /dev/null +++ b/packages/integrations/mdx/test/fixtures/mdx-vite-env-vars/src/pages/vite-env-vars.mdx @@ -0,0 +1,38 @@ +--- +title: Let's talk about my import.meta.env.SITE +--- + +export const modeWorks = + import.meta.env.MODE === 'production' ? 'MODE works' : 'MODE does not work!'; + +# About my import.meta.env.SITE + +My `import.meta.env.SITE` is so cool, I can put env variables in code! + +```js +const site = import.meta.env.SITE; +``` + +## But I can use import.meta.env properly too + +
+ +I can compute my site, for example: {new URL('/blog/cool-post', import.meta.env.SITE)} + +
+ +
+ +I can also use `import.meta.env` in variable exports: {modeWorks} + +
+ +I can also use vars as HTML attributes: + +
diff --git a/packages/integrations/mdx/test/mdx-env-variables.test.js b/packages/integrations/mdx/test/mdx-env-variables.test.js deleted file mode 100644 index d471b3842008..000000000000 --- a/packages/integrations/mdx/test/mdx-env-variables.test.js +++ /dev/null @@ -1,27 +0,0 @@ -import { expect } from 'chai'; -import { parseHTML } from 'linkedom'; -import { loadFixture } from '../../../astro/test/test-utils.js'; - -describe('MDX - Vite env vars', () => { - let fixture; - before(async () => { - fixture = await loadFixture({ - root: new URL('./fixtures/mdx-env-variables/', import.meta.url), - }); - await fixture.build(); - }); - - it('Avoids transforming `import.meta.env` outside JSX expressions', async () => { - const html = await fixture.readFile('/vite-env-vars/index.html'); - const { document } = parseHTML(html); - console.log(html) - - expect(document.querySelector('h1')?.innerHTML).to.contain('import.meta.env.SITE'); - expect(document.querySelector('code')?.innerHTML).to.contain('import.meta.env.SITE'); - expect(document.querySelector('pre')?.innerHTML).to.contain('import.meta.env.SITE'); - }); - it('Allows referencing `import.meta.env` in frontmatter', async () => { - const { title = '' } = JSON.parse(await fixture.readFile('/frontmatter.json')); - expect(title).to.contain('import.meta.env.SITE'); - }); -}); diff --git a/packages/integrations/mdx/test/mdx-vite-env-vars.test.js b/packages/integrations/mdx/test/mdx-vite-env-vars.test.js new file mode 100644 index 000000000000..9504b7305a3b --- /dev/null +++ b/packages/integrations/mdx/test/mdx-vite-env-vars.test.js @@ -0,0 +1,58 @@ +import { expect } from 'chai'; +import { parseHTML } from 'linkedom'; +import { loadFixture } from '../../../astro/test/test-utils.js'; + +describe('MDX - Vite env vars', () => { + let fixture; + before(async () => { + fixture = await loadFixture({ + root: new URL('./fixtures/mdx-vite-env-vars/', import.meta.url), + }); + await fixture.build(); + }); + + it('Avoids transforming `import.meta.env` outside JSX expressions', async () => { + const html = await fixture.readFile('/vite-env-vars/index.html'); + const { document } = parseHTML(html); + + expect(document.querySelector('h1')?.innerHTML).to.contain('import.meta.env.SITE'); + expect(document.querySelector('code')?.innerHTML).to.contain('import.meta.env.SITE'); + expect(document.querySelector('pre')?.innerHTML).to.contain('import.meta.env.SITE'); + }); + it('Allows referencing `import.meta.env` in frontmatter', async () => { + const { title = '' } = JSON.parse(await fixture.readFile('/frontmatter.json')); + expect(title).to.contain('import.meta.env.SITE'); + }); + it('Transforms `import.meta.env` in {JSX expressions}', async () => { + const html = await fixture.readFile('/vite-env-vars/index.html'); + const { document } = parseHTML(html); + + expect(document.querySelector('[data-env-site]')?.innerHTML).to.contain( + 'https://mdx-is-neat.com/blog/cool-post', + ); + }); + it('Transforms `import.meta.env` in variable exports', async () => { + const html = await fixture.readFile('/vite-env-vars/index.html'); + const { document } = parseHTML(html); + + expect(document.querySelector('[data-env-variable-exports]')?.innerHTML).to.contain( + 'MODE works', + ); + }); + it('Transforms `import.meta.env` in HTML attributes', async () => { + const html = await fixture.readFile('/vite-env-vars/index.html'); + const { document } = parseHTML(html); + + const dataAttrDump = document.querySelector('[data-env-dump]'); + expect(dataAttrDump).to.not.be.null; + + expect(dataAttrDump.getAttribute('data-env-prod')).to.not.be.null; + expect(dataAttrDump.getAttribute('data-env-dev')).to.be.null; + expect(dataAttrDump.getAttribute('data-env-base-url')).to.equal( + '/', + ); + expect(dataAttrDump.getAttribute('data-env-mode')).to.equal( + 'production', + ); + }); +}); From 42a16b8e61c7ff11cda77eb900c52240039b05d5 Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Mon, 26 Sep 2022 16:46:18 -0400 Subject: [PATCH 09/11] fix: lockfile --- pnpm-lock.yaml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a692f02bea27..65787cd0d909 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2497,14 +2497,6 @@ importers: remark-shiki-twoslash: 3.1.0 remark-toc: 8.0.1 - packages/integrations/mdx/test/fixtures/mdx-env-variables: - specifiers: - '@astrojs/mdx': workspace:* - astro: workspace:* - dependencies: - '@astrojs/mdx': link:../../.. - astro: link:../../../../../astro - packages/integrations/mdx/test/fixtures/mdx-frontmatter-injection: specifiers: '@astrojs/mdx': workspace:* @@ -2547,6 +2539,14 @@ importers: '@astrojs/react': link:../../../../react astro: link:../../../../../astro + packages/integrations/mdx/test/fixtures/mdx-vite-env-vars: + specifiers: + '@astrojs/mdx': workspace:* + astro: workspace:* + dependencies: + '@astrojs/mdx': link:../../.. + astro: link:../../../../../astro + packages/integrations/netlify: specifiers: '@astrojs/webapi': ^1.0.0 From bc4ada6c3632aea9956ba36162afccc6910f2d7d Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Mon, 26 Sep 2022 16:47:07 -0400 Subject: [PATCH 10/11] chore: update changeset --- .changeset/metal-hats-explain.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/metal-hats-explain.md b/.changeset/metal-hats-explain.md index 9e12b700eb4d..cb3be9ad7514 100644 --- a/.changeset/metal-hats-explain.md +++ b/.changeset/metal-hats-explain.md @@ -2,4 +2,4 @@ '@astrojs/mdx': patch --- -Avoid parsing import.meta.env in MDX files +Correctly parse import.meta.env in MDX files From 454f5c467c4aeb42bf4b5976fb9850a3e4e67061 Mon Sep 17 00:00:00 2001 From: bholmesdev Date: Mon, 26 Sep 2022 16:49:29 -0400 Subject: [PATCH 11/11] fix: remove stray stashed commit --- .../integrations/netlify/src/integration-edge-functions.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/integrations/netlify/src/integration-edge-functions.ts b/packages/integrations/netlify/src/integration-edge-functions.ts index 94972b3d1939..11a18beb9e70 100644 --- a/packages/integrations/netlify/src/integration-edge-functions.ts +++ b/packages/integrations/netlify/src/integration-edge-functions.ts @@ -51,10 +51,6 @@ async function createEdgeManifest(routes: RouteData[], entryFile: string, dir: U path: route.pathname, }); } else { - console.log({ - og: route.pattern.source.toString(), - new: route.pattern.source.replace(/\\\//g, '/').toString(), - }); functions.push({ function: entryFile, // Make route pattern serializable to match expected