From 9ae57ed82c89e37ced68945478919f3a1e204559 Mon Sep 17 00:00:00 2001
From: Rodrigo Pombo 
Date: Wed, 30 Apr 2025 11:41:16 +0200
Subject: [PATCH 1/5] More flexible !from directive
---
 .changeset/silent-shoes-add.md                |  5 ++
 apps/web/content/docs/concepts/code.mdx       |  2 +-
 .../src/mdx/0.import-code-from-path.ts        | 26 +++++----
 packages/codehike/tests/md-suite/_readme.md   |  7 +++
 .../codehike/tests/md-suite/assets/test.py    |  5 +-
 .../codehike/tests/md-suite/import-code.0.mdx | 11 ++++
 .../tests/md-suite/import-code.0.render.tsx   | 21 ++++++++
 .../md-suite/import-code.7.compiled-jsx.jsx   | 12 +++--
 .../md-suite/import-code.9.rendered.html      | 53 +++++++++++++++++++
 9 files changed, 124 insertions(+), 18 deletions(-)
 create mode 100644 .changeset/silent-shoes-add.md
 create mode 100644 packages/codehike/tests/md-suite/import-code.0.render.tsx
 create mode 100644 packages/codehike/tests/md-suite/import-code.9.rendered.html
diff --git a/.changeset/silent-shoes-add.md b/.changeset/silent-shoes-add.md
new file mode 100644
index 00000000..ba028c66
--- /dev/null
+++ b/.changeset/silent-shoes-add.md
@@ -0,0 +1,5 @@
+---
+"codehike": patch
+---
+
+More flexible `!from` directive
diff --git a/apps/web/content/docs/concepts/code.mdx b/apps/web/content/docs/concepts/code.mdx
index 2ee60e27..7b97cdeb 100644
--- a/apps/web/content/docs/concepts/code.mdx
+++ b/apps/web/content/docs/concepts/code.mdx
@@ -129,7 +129,7 @@ You can use the [Theme Editor](https://themes.codehike.org/editor) to customize
 To include code from a file in your markdown codeblocks, you can use the `!from` directive followed by the path to the file (relative to the markdown file).
 
 ````txt
-```js index.js
+```js
 !from ./assets/index.js
 ```
 ````
diff --git a/packages/codehike/src/mdx/0.import-code-from-path.ts b/packages/codehike/src/mdx/0.import-code-from-path.ts
index 4129c399..addb211b 100644
--- a/packages/codehike/src/mdx/0.import-code-from-path.ts
+++ b/packages/codehike/src/mdx/0.import-code-from-path.ts
@@ -1,13 +1,8 @@
 import { Code, Root } from "mdast"
 import { visit } from "unist-util-visit"
-
 /**
- * Find all codeblocks like:
- *
- * ```jsx
- * !from ./foo/bar.js
- * ```
- * and replace the value with the content of the referenced file.
+ * Find all codeblocks that contain lines starting with !from
+ * and replace those lines with the content from the referenced files.
  */
 export async function transformImportedCode(
   tree: Root,
@@ -15,7 +10,7 @@ export async function transformImportedCode(
 ) {
   const nodes: Code[] = []
   visit(tree, "code", (node) => {
-    if (node.value?.startsWith("!from ")) {
+    if (node.value?.includes("\n!from ") || node.value?.startsWith("!from ")) {
       nodes.push(node)
     }
   })
@@ -27,9 +22,18 @@ export async function transformImportedCode(
   const mdxPath = file?.history ? file.history[file.history.length - 1] : null
   await Promise.all(
     nodes.map(async (code) => {
-      const fromData = code.value.slice(6).trim()
-      const [codepath, range] = fromData?.split(/\s+/) || []
-      code.value = await readFile(codepath, mdxPath, range)
+      const lines = code.value.split("\n")
+      const newLines = await Promise.all(
+        lines.map(async (line) => {
+          if (line.startsWith("!from ")) {
+            const fromData = line.slice(6).trim()
+            const [codepath, range] = fromData?.split(/\s+/) || []
+            return await readFile(codepath, mdxPath, range)
+          }
+          return line
+        }),
+      )
+      code.value = newLines.join("\n")
     }),
   )
 
diff --git a/packages/codehike/tests/md-suite/_readme.md b/packages/codehike/tests/md-suite/_readme.md
index 16a104d8..0e2fe35b 100644
--- a/packages/codehike/tests/md-suite/_readme.md
+++ b/packages/codehike/tests/md-suite/_readme.md
@@ -13,13 +13,20 @@ snapshots:
   - after-rehype
   - before-recma-compiled-js
   - before-recma-compiled-jsx
+  - before-recma-compiled-function
   - before-recma-js
+  - before-recma-js-dev
   - before-recma-jsx
   - after-recma-js
+  - after-recma-js-dev
   - after-recma-jsx
   - compiled-js
+  - compiled-js-dev
   - compiled-jsx
+  - compiled-function
   - parsed-jsx
+  - rendered
+  - rendered-dev
 ---
 ```
 
diff --git a/packages/codehike/tests/md-suite/assets/test.py b/packages/codehike/tests/md-suite/assets/test.py
index 91a4fc94..dde0f6d5 100644
--- a/packages/codehike/tests/md-suite/assets/test.py
+++ b/packages/codehike/tests/md-suite/assets/test.py
@@ -1,4 +1,3 @@
+# !mark inside
 import random
-
-my_list = [1, 'a', 32, 'c', 'd', 31]
-print(random.choice(my_list))
\ No newline at end of file
+my_list = []
\ No newline at end of file
diff --git a/packages/codehike/tests/md-suite/import-code.0.mdx b/packages/codehike/tests/md-suite/import-code.0.mdx
index a2d2556c..15928f99 100644
--- a/packages/codehike/tests/md-suite/import-code.0.mdx
+++ b/packages/codehike/tests/md-suite/import-code.0.mdx
@@ -1,6 +1,7 @@
 ---
 snapshots:
   - compiled-jsx
+  - rendered
 ---
 
 hello
@@ -12,3 +13,13 @@ hello
 ```py !
 !from ./assets/test.py
 ```
+
+```py
+# !mark(2) bar
+!from ./assets/test.py
+
+def hello():
+    print("hello")
+
+!from ./assets/test.py
+```
diff --git a/packages/codehike/tests/md-suite/import-code.0.render.tsx b/packages/codehike/tests/md-suite/import-code.0.render.tsx
new file mode 100644
index 00000000..091c9917
--- /dev/null
+++ b/packages/codehike/tests/md-suite/import-code.0.render.tsx
@@ -0,0 +1,21 @@
+import { MDXContent } from "mdx/types"
+import { AnnotationHandler, highlight, Pre, RawCode } from "../../src/code"
+import React from "react"
+
+export function render(Content: MDXContent) {
+  // @ts-ignore
+  return 
+}
+
+async function MyCode({ codeblock }: { codeblock: RawCode }) {
+  const highlighted = await highlight(codeblock, "github-dark")
+  return 
+}
+
+const mark: AnnotationHandler = {
+  name: "mark",
+  Pre: ({ _stack, ...props }) => ,
+  Block: ({ children, annotation }) => (
+    {children}
+  ),
+}
diff --git a/packages/codehike/tests/md-suite/import-code.7.compiled-jsx.jsx b/packages/codehike/tests/md-suite/import-code.7.compiled-jsx.jsx
index 10141e78..5dbb03be 100644
--- a/packages/codehike/tests/md-suite/import-code.7.compiled-jsx.jsx
+++ b/packages/codehike/tests/md-suite/import-code.7.compiled-jsx.jsx
@@ -11,10 +11,17 @@ function _createMdxContent(props) {
     children: (
       <>
         <_components.p>{"hello"}
+        
         hello
+
+  
+    
+      import
+      random
+    
+  
+  
+    my_list
+    =
+    []
+  
+
+
+  
+    
+      import
+      random
+    
+  
+  
+    
+      my_list
+      =
+      []
+    
+  
+  
+  
+    def
+    hello
+    ():
+  
+  
+    print
+    (
+    "hello"
+    )
+  
+  
+  
+    
+      import
+      random
+    
+  
+  
+    my_list
+    =
+    []
+  
+
From 6f221af07e8037820c68eeb6d51876c9578281d0 Mon Sep 17 00:00:00 2001
From: Rodrigo Pombo 
Date: Wed, 30 Apr 2025 11:53:24 +0200
Subject: [PATCH 2/5] Add fake imported file
---
 apps/web/content/docs/concepts/assets/index.js | 1 +
 1 file changed, 1 insertion(+)
 create mode 100644 apps/web/content/docs/concepts/assets/index.js
diff --git a/apps/web/content/docs/concepts/assets/index.js b/apps/web/content/docs/concepts/assets/index.js
new file mode 100644
index 00000000..6fa78b74
--- /dev/null
+++ b/apps/web/content/docs/concepts/assets/index.js
@@ -0,0 +1 @@
+!from ./assets/index.js
\ No newline at end of file
From c8815fa63f1b1ece57f3aac7f73f30dfb710ac81 Mon Sep 17 00:00:00 2001
From: Rodrigo Pombo 
Date: Thu, 1 May 2025 11:10:00 +0200
Subject: [PATCH 3/5] Better turbopack support
---
 .changeset/rotten-stingrays-play.md |  5 +++++
 packages/recma/index.js             |  2 ++
 packages/recma/package.json         | 12 ++++++++++++
 packages/remark/index.js            |  2 ++
 packages/remark/package.json        | 12 ++++++++++++
 5 files changed, 33 insertions(+)
 create mode 100644 .changeset/rotten-stingrays-play.md
 create mode 100644 packages/recma/index.js
 create mode 100644 packages/recma/package.json
 create mode 100644 packages/remark/index.js
 create mode 100644 packages/remark/package.json
diff --git a/.changeset/rotten-stingrays-play.md b/.changeset/rotten-stingrays-play.md
new file mode 100644
index 00000000..b59ef88c
--- /dev/null
+++ b/.changeset/rotten-stingrays-play.md
@@ -0,0 +1,5 @@
+---
+"codehike": patch
+---
+
+Better turbopack support
diff --git a/packages/recma/index.js b/packages/recma/index.js
new file mode 100644
index 00000000..1dc0ba08
--- /dev/null
+++ b/packages/recma/index.js
@@ -0,0 +1,2 @@
+import { recmaCodeHike } from "codehike/mdx"
+export default recmaCodeHike
diff --git a/packages/recma/package.json b/packages/recma/package.json
new file mode 100644
index 00000000..3bdab687
--- /dev/null
+++ b/packages/recma/package.json
@@ -0,0 +1,12 @@
+{
+  "name": "recma-codehike",
+  "version": "0.0.1",
+  "main": "index.js",
+  "type": "module",
+  "sideEffects": false,
+  "license": "MIT",
+  "repository": "code-hike/codehike",
+  "dependencies": {
+    "codehike": "*"
+  }
+}
diff --git a/packages/remark/index.js b/packages/remark/index.js
new file mode 100644
index 00000000..f5c9dc16
--- /dev/null
+++ b/packages/remark/index.js
@@ -0,0 +1,2 @@
+import { remarkCodeHike } from "codehike/mdx"
+export default remarkCodeHike
diff --git a/packages/remark/package.json b/packages/remark/package.json
new file mode 100644
index 00000000..3e4b11cc
--- /dev/null
+++ b/packages/remark/package.json
@@ -0,0 +1,12 @@
+{
+  "name": "remark-codehike",
+  "version": "0.0.1",
+  "main": "index.js",
+  "type": "module",
+  "sideEffects": false,
+  "license": "MIT",
+  "repository": "code-hike/codehike",
+  "dependencies": {
+    "codehike": "*"
+  }
+}
From f71f54dbe61ec447a299083a47e61587cd7327c4 Mon Sep 17 00:00:00 2001
From: Rodrigo Pombo 
Date: Thu, 1 May 2025 11:12:11 +0200
Subject: [PATCH 4/5] Update lockfile
---
 pnpm-lock.yaml | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 90afdf7a..e766e637 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -254,6 +254,18 @@ importers:
         specifier: ^3.22.4
         version: 3.22.4
 
+  packages/recma:
+    dependencies:
+      codehike:
+        specifier: '*'
+        version: 1.0.5
+
+  packages/remark:
+    dependencies:
+      codehike:
+        specifier: '*'
+        version: 1.0.5
+
 packages:
 
   '@actions/exec@1.1.1':
@@ -2107,6 +2119,9 @@ packages:
     resolution: {integrity: sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==}
     engines: {node: '>= 4.0'}
 
+  codehike@1.0.5:
+    resolution: {integrity: sha512-y3lL/3nPcvT7GNuEKw687AIip1Mg864lA/knWcCGn7Yp2FBQovsPqPTCpf/aodzWZ12HjWGfli+oxaSeuSyFXg==}
+
   collapse-white-space@2.1.0:
     resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==}
 
@@ -6519,6 +6534,16 @@ snapshots:
       chalk: 2.4.2
       q: 1.5.1
 
+  codehike@1.0.5:
+    dependencies:
+      '@code-hike/lighter': 1.0.1
+      diff: 5.1.0
+      estree-util-visit: 2.0.0
+      mdast-util-mdx-jsx: 3.0.0
+      unist-util-visit: 5.0.0
+    transitivePeerDependencies:
+      - supports-color
+
   collapse-white-space@2.1.0: {}
 
   color-convert@1.9.3:
From 4b5484de0aa063f6617a5e3de0e3a96812090fcd Mon Sep 17 00:00:00 2001
From: "github-actions[bot]" 
Date: Thu, 1 May 2025 09:16:55 +0000
Subject: [PATCH 5/5] codehike@1.0.6
---
 .changeset/rotten-stingrays-play.md | 5 -----
 .changeset/silent-shoes-add.md      | 5 -----
 packages/codehike/CHANGELOG.md      | 8 ++++++++
 packages/codehike/package.json      | 2 +-
 4 files changed, 9 insertions(+), 11 deletions(-)
 delete mode 100644 .changeset/rotten-stingrays-play.md
 delete mode 100644 .changeset/silent-shoes-add.md
diff --git a/.changeset/rotten-stingrays-play.md b/.changeset/rotten-stingrays-play.md
deleted file mode 100644
index b59ef88c..00000000
--- a/.changeset/rotten-stingrays-play.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"codehike": patch
----
-
-Better turbopack support
diff --git a/.changeset/silent-shoes-add.md b/.changeset/silent-shoes-add.md
deleted file mode 100644
index ba028c66..00000000
--- a/.changeset/silent-shoes-add.md
+++ /dev/null
@@ -1,5 +0,0 @@
----
-"codehike": patch
----
-
-More flexible `!from` directive
diff --git a/packages/codehike/CHANGELOG.md b/packages/codehike/CHANGELOG.md
index a5246ad8..3b52c94e 100644
--- a/packages/codehike/CHANGELOG.md
+++ b/packages/codehike/CHANGELOG.md
@@ -1,5 +1,13 @@
 # codehike
 
+## 1.0.6
+
+### Patch Changes
+
+- [#513](https://github.com/code-hike/codehike/pull/513) [`c8815fa`](https://github.com/code-hike/codehike/commit/c8815fa63f1b1ece57f3aac7f73f30dfb710ac81) Thanks [@pomber](https://github.com/pomber)! - Better turbopack support
+
+- [#510](https://github.com/code-hike/codehike/pull/510) [`9ae57ed`](https://github.com/code-hike/codehike/commit/9ae57ed82c89e37ced68945478919f3a1e204559) Thanks [@pomber](https://github.com/pomber)! - More flexible `!from` directive
+
 ## 1.0.5
 
 ### Patch Changes
diff --git a/packages/codehike/package.json b/packages/codehike/package.json
index f8eb0164..9fe5a12d 100644
--- a/packages/codehike/package.json
+++ b/packages/codehike/package.json
@@ -1,6 +1,6 @@
 {
   "name": "codehike",
-  "version": "1.0.5",
+  "version": "1.0.6",
   "description": "Build rich content websites with Markdown and React",
   "keywords": [
     "react",