From db74ddcf908fd3bb6b94428575a05a4f87ea6029 Mon Sep 17 00:00:00 2001 From: Titus Wormer Date: Fri, 19 Nov 2021 09:34:53 +0100 Subject: [PATCH 1/6] Fix resolve base in esbuild loader Related to mdx-js/mdx#1821. --- lib/integration/esbuild.js | 15 ++++++++++++++- test/esbuild.js | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 1 deletion(-) diff --git a/lib/integration/esbuild.js b/lib/integration/esbuild.js index c935775..d0db52a 100644 --- a/lib/integration/esbuild.js +++ b/lib/integration/esbuild.js @@ -13,7 +13,9 @@ * @typedef {ProcessorOptions & {allowDangerousRemoteMdx?: boolean}} Options */ +import assert from 'node:assert' import {promises as fs} from 'node:fs' +import path from 'node:path' import process from 'node:process' import got from 'got' import {VFile} from 'vfile' @@ -48,6 +50,7 @@ export function esbuild(options = {}) { const filter = extnamesToRegex(extnames) /* eslint-disable-next-line security/detect-non-literal-regexp */ const filterHttp = new RegExp('^https?:\\/{2}.+' + filter.source) + const http = /^https?:\/{2}/ const filterHttpOrRelative = /^(https?:\/{2}|.{1,2}\/).*/ if (allowDangerousRemoteMdx) { @@ -197,9 +200,19 @@ export function esbuild(options = {}) { }) } + // Safety check: the file has a path, so there has to be a `dirname`. + assert(file.dirname, 'expected `dirname` to be defined') + // V8 on Erbium. /* c8 ignore next 2 */ - return {contents: value, errors, warnings, resolveDir: p.cwd()} + return { + contents: value, + errors, + warnings, + resolveDir: http.test(file.path) + ? p.cwd() + : path.resolve(file.cwd, file.dirname) + } } } } diff --git a/test/esbuild.js b/test/esbuild.js index 382ee4f..7d0fe39 100644 --- a/test/esbuild.js +++ b/test/esbuild.js @@ -47,6 +47,43 @@ test('xdm (esbuild)', async (t) => { await fs.unlink(path.join(base, 'esbuild.mdx')) await fs.unlink(path.join(base, 'esbuild.js')) + // Resolve directory. + await fs.writeFile( + path.join(base, 'esbuild-resolve.mdx'), + 'import Content from "./folder/file.mdx"\n\n' + ) + await fs.mkdir(path.join(base, 'folder')) + await fs.writeFile( + path.join(base, 'folder', 'file.mdx'), + 'import {data} from "./file.js"\n\n{data}' + ) + await fs.writeFile( + path.join(base, 'folder', 'file.js'), + 'export const data = 0.1' + ) + await esbuild.build({ + bundle: true, + define: {'process.env.NODE_ENV': '"development"'}, + entryPoints: [path.join(base, 'esbuild-resolve.mdx')], + outfile: path.join(base, 'esbuild-resolve.js'), + format: 'esm', + plugins: [esbuildXdm()] + }) + /** @type {MDXContent} */ + Content = + /* @ts-expect-error file is dynamically generated */ + (await import('./context/esbuild-resolve.js')).default // type-coverage:ignore-line + + t.equal( + renderToStaticMarkup(React.createElement(Content)), + '0.1', + 'should compile' + ) + + await fs.unlink(path.join(base, 'esbuild-resolve.mdx')) + await fs.unlink(path.join(base, 'esbuild-resolve.js')) + await fs.rmdir(path.join(base, 'folder'), {recursive: true}) + // Markdown. await fs.writeFile(path.join(base, 'esbuild.md'), '\ta') From 179f23357649c3d700ebafe0f3f1e6ae3dddf9e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?M=C3=A1ximo=20Mussini?= Date: Fri, 19 Nov 2021 05:49:56 -0300 Subject: [PATCH 2/6] Use `let` for components in output Related to GH-97. Closes GH-102. Reviewed-by: Titus Wormer --- lib/plugin/recma-jsx-rewrite.js | 2 +- readme.md | 16 ++++++++-------- test/core.js | 16 ++++++++-------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/lib/plugin/recma-jsx-rewrite.js b/lib/plugin/recma-jsx-rewrite.js index a815e24..c89b5ee 100644 --- a/lib/plugin/recma-jsx-rewrite.js +++ b/lib/plugin/recma-jsx-rewrite.js @@ -362,7 +362,7 @@ export function recmaJsxRewrite(options = {}) { const statements = [ { type: 'VariableDeclaration', - kind: 'const', + kind: 'let', declarations } ] diff --git a/readme.md b/readme.md index 296fd0a..370d776 100644 --- a/readme.md +++ b/readme.md @@ -172,12 +172,12 @@ import {Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs} from 'react/jsx-runti export const Thing = () => _jsx(_Fragment, {children: 'World!'}) function MDXContent(props = {}) { - const {wrapper: MDXLayout} = props.components || ({}) + let {wrapper: MDXLayout} = props.components || ({}) return MDXLayout ? _jsx(MDXLayout, Object.assign({}, props, {children: _jsx(_createMdxContent, {})})) : _createMdxContent() function _createMdxContent() { - const _components = Object.assign({h1: 'h1'}, props.components) + let _components = Object.assign({h1: 'h1'}, props.components) return _jsxs(_components.h1, {children: ['Hello, ', _jsx(Thing, {})]}) } } @@ -623,14 +623,14 @@ compile(file, {providerImportSource: '@mdx-js/react'}) export const Thing = () => _jsx(_Fragment, {children: 'World!'}) function MDXContent(props = {}) { -- const {wrapper: MDXLayout} = props.components || ({}) -+ const {wrapper: MDXLayout} = Object.assign({}, _provideComponents(), props.components) +- let {wrapper: MDXLayout} = props.components || ({}) ++ let {wrapper: MDXLayout} = Object.assign({}, _provideComponents(), props.components) return MDXLayout ? _jsx(MDXLayout, Object.assign({}, props, {children: _jsx(_createMdxContent, {})})) : _createMdxContent() function _createMdxContent() { -- const _components = Object.assign({h1: 'h1'}, props.components) -+ const _components = Object.assign({h1: 'h1'}, _provideComponents(), props.components) +- let _components = Object.assign({h1: 'h1'}, props.components) ++ let _components = Object.assign({h1: 'h1'}, _provideComponents(), props.components) return _jsxs(_components.h1, {children: ['Hello, ', _jsx(Thing, {})]}) } } @@ -665,13 +665,13 @@ compile(file, {jsx: true}) +export const Thing = () => <>World! function MDXContent(props = {}) { - const {wrapper: MDXLayout} = props.components || ({}) + let {wrapper: MDXLayout} = props.components || ({}) return MDXLayout - ? _jsx(MDXLayout, Object.assign({}, props, {children: _jsx(_createMdxContent, {})})) + ? <_createMdxContent /> : _createMdxContent() function _createMdxContent() { - const _components = Object.assign({h1: 'h1'}, props.components) + let _components = Object.assign({h1: 'h1'}, props.components) - return _jsxs(_components.h1, {children: ['Hello, ', _jsx(Thing, {})]}) + return <_components.h1>{"Hello, "} } diff --git a/test/core.js b/test/core.js index 84f60a9..500d964 100644 --- a/test/core.js +++ b/test/core.js @@ -735,10 +735,10 @@ test('jsx', async (t) => { [ '/*@jsxRuntime automatic @jsxImportSource react*/', 'function MDXContent(props = {}) {', - ' const {wrapper: MDXLayout} = props.components || ({});', + ' let {wrapper: MDXLayout} = props.components || ({});', ' return MDXLayout ? <_createMdxContent /> : _createMdxContent();', ' function _createMdxContent() {', - ' const _components = Object.assign({', + ' let _components = Object.assign({', ' p: "p",', ' em: "em"', ' }, props.components);', @@ -756,7 +756,7 @@ test('jsx', async (t) => { [ '/*@jsxRuntime automatic @jsxImportSource react*/', 'function MDXContent(props = {}) {', - ' const {wrapper: MDXLayout} = props.components || ({});', + ' let {wrapper: MDXLayout} = props.components || ({});', ' return MDXLayout ? <_createMdxContent /> : _createMdxContent();', ' function _createMdxContent() {', ' return ;', @@ -773,10 +773,10 @@ test('jsx', async (t) => { [ '/*@jsxRuntime automatic @jsxImportSource react*/', 'function MDXContent(props = {}) {', - ' const {wrapper: MDXLayout} = props.components || ({});', + ' let {wrapper: MDXLayout} = props.components || ({});', ' return MDXLayout ? <_createMdxContent /> : _createMdxContent();', ' function _createMdxContent() {', - ' const {c} = props.components || ({});', + ' let {c} = props.components || ({});', ' if (!c) _missingMdxReference("c", false);', ' if (!c.d) _missingMdxReference("c.d", true);', ' return <><>;', @@ -797,7 +797,7 @@ test('jsx', async (t) => { '/*@jsxRuntime automatic @jsxImportSource react*/', '/*1*/', 'function MDXContent(props = {}) {', - ' const {wrapper: MDXLayout} = props.components || ({});', + ' let {wrapper: MDXLayout} = props.components || ({});', ' return MDXLayout ? <_createMdxContent /> : _createMdxContent();', ' function _createMdxContent() {', ' return <><>{"a "}{}{" b"};', @@ -814,10 +814,10 @@ test('jsx', async (t) => { [ '/*@jsxRuntime automatic @jsxImportSource react*/', 'function MDXContent(props = {}) {', - ' const {wrapper: MDXLayout} = props.components || ({});', + ' let {wrapper: MDXLayout} = props.components || ({});', ' return MDXLayout ? <_createMdxContent /> : _createMdxContent();', ' function _createMdxContent() {', - ' const _components = Object.assign({', + ' let _components = Object.assign({', ' p: "p"', ' }, props.components);', ' return <_components.p>{"Hello "}{props.name};', From 9f458ea254a135e5661b534c5106bf3d098c03c7 Mon Sep 17 00:00:00 2001 From: Christian Murphy Date: Sun, 21 Nov 2021 08:11:43 -0700 Subject: [PATCH 3/6] Fix build by pinning TypeScript to `~4.4` Closes GH-103. Reviewed-by: Titus Wormer --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 929d773..9439d22 100644 --- a/package.json +++ b/package.json @@ -106,7 +106,7 @@ "tape": "^5.0.0", "theme-ui": "^0.12.0", "type-coverage": "^2.0.0", - "typescript": "^4.0.0", + "typescript": "~4.4.0", "vue": "^3.0.0", "webpack": "^5.0.0", "xo": "^0.46.0" From 5220d991835b3ffdfb2c047ae6d177c56f627c47 Mon Sep 17 00:00:00 2001 From: Titus Wormer Date: Sun, 21 Nov 2021 16:16:38 +0100 Subject: [PATCH 4/6] Fix coverage on Erbium --- lib/integration/esbuild.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/integration/esbuild.js b/lib/integration/esbuild.js index d0db52a..7da5772 100644 --- a/lib/integration/esbuild.js +++ b/lib/integration/esbuild.js @@ -204,7 +204,7 @@ export function esbuild(options = {}) { assert(file.dirname, 'expected `dirname` to be defined') // V8 on Erbium. - /* c8 ignore next 2 */ + /* c8 ignore next 10 */ return { contents: value, errors, From f2281ed8ceab50c5001d442bf3bbec8c88fbc08d Mon Sep 17 00:00:00 2001 From: Titus Wormer Date: Fri, 3 Dec 2021 12:59:33 +0100 Subject: [PATCH 5/6] Update dev-dependencies --- esm-loader.js | 3 ++- package.json | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/esm-loader.js b/esm-loader.js index b46330a..c0964db 100644 --- a/esm-loader.js +++ b/esm-loader.js @@ -2,4 +2,5 @@ import {createLoader} from './lib/integration/node.js' const {load, getFormat, transformSource} = createLoader() -export {load, getFormat, transformSource, createLoader} +export {load, getFormat, transformSource} +export {createLoader} from './lib/integration/node.js' diff --git a/package.json b/package.json index 9439d22..e66a9b7 100644 --- a/package.json +++ b/package.json @@ -109,7 +109,7 @@ "typescript": "~4.4.0", "vue": "^3.0.0", "webpack": "^5.0.0", - "xo": "^0.46.0" + "xo": "^0.47.0" }, "scripts": { "prepack": "npm run build && npm run format", @@ -137,6 +137,7 @@ ], "prettier": true, "rules": { + "unicorn/no-await-expression-member": "off", "capitalized-comments": "off", "complexity": "off", "max-depth": "off", From 7e3ad05ff5744b580e5760733a019695699be99c Mon Sep 17 00:00:00 2001 From: Titus Wormer Date: Fri, 3 Dec 2021 13:03:01 +0100 Subject: [PATCH 6/6] 3.3.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e66a9b7..5d45459 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "xdm", - "version": "3.3.0", + "version": "3.3.1", "description": "an MDX compiler", "license": "MIT", "keywords": [