diff --git a/packages/runtime/tsconfig.json b/packages/runtime/tsconfig.json
index e5740e5d9..b000a5511 100644
--- a/packages/runtime/tsconfig.json
+++ b/packages/runtime/tsconfig.json
@@ -1,6 +1,6 @@
{
"extends": "../../tsconfig.json",
- "include": ["src/**/*"],
+ "include": ["src/**/*", "../../types/types.d.ts"],
"compilerOptions": {
"outDir": "dist",
"rootDir": "src",
diff --git a/packages/translator/src/__tests__/fixtures/basic-export/__snapshots__/csr.expected.md b/packages/translator/src/__tests__/fixtures/basic-export/__snapshots__/csr.expected.md
new file mode 100644
index 000000000..eafe65bdb
--- /dev/null
+++ b/packages/translator/src/__tests__/fixtures/basic-export/__snapshots__/csr.expected.md
@@ -0,0 +1,11 @@
+# Render {"value":123}
+```html
+
+ 123
+
+```
+
+# Mutations
+```
+inserted div0
+```
\ No newline at end of file
diff --git a/packages/translator/src/__tests__/fixtures/basic-export/__snapshots__/dom.expected.js b/packages/translator/src/__tests__/fixtures/basic-export/__snapshots__/dom.expected.js
new file mode 100644
index 000000000..379a4374e
--- /dev/null
+++ b/packages/translator/src/__tests__/fixtures/basic-export/__snapshots__/dom.expected.js
@@ -0,0 +1,19 @@
+export const v = 123;
+import { data as _data, write as _write, createRenderFn as _createRenderFn } from "@marko/runtime-fluurt/src/dom";
+
+function _apply_value(_scope, value) {
+ if (_write(_scope, 1, value)) _data(_scope[0], value);
+}
+
+export const applyAttrs = function (_scope, {
+ value
+}) {
+ _apply_value(_scope, value);
+};
+export { _apply_value };
+export const template = "
";
+export const walks =
+/* next(1), get, out(1) */
+"D l";
+export const apply = function () {};
+export default _createRenderFn(template, walks, apply, applyAttrs);
\ No newline at end of file
diff --git a/packages/translator/src/__tests__/fixtures/basic-export/__snapshots__/html.expected.js b/packages/translator/src/__tests__/fixtures/basic-export/__snapshots__/html.expected.js
new file mode 100644
index 000000000..9fe89c691
--- /dev/null
+++ b/packages/translator/src/__tests__/fixtures/basic-export/__snapshots__/html.expected.js
@@ -0,0 +1,13 @@
+export const v = 123;
+import { markHydrateNode as _markHydrateNode, escapeXML as _escapeXML, write as _write, nextScopeId as _nextScopeId, createRenderer as _createRenderer } from "@marko/runtime-fluurt/src/html";
+
+const _renderer = ({
+ value
+}) => {
+ const _scope = _nextScopeId();
+
+ _write(`${_markHydrateNode(_scope, 0)}${_escapeXML(value)}
`);
+};
+
+export default _renderer;
+export const render = _createRenderer(_renderer);
\ No newline at end of file
diff --git a/packages/translator/src/__tests__/fixtures/basic-export/__snapshots__/ssr.expected.md b/packages/translator/src/__tests__/fixtures/basic-export/__snapshots__/ssr.expected.md
new file mode 100644
index 000000000..1e0dd20fb
--- /dev/null
+++ b/packages/translator/src/__tests__/fixtures/basic-export/__snapshots__/ssr.expected.md
@@ -0,0 +1,45 @@
+# Write
+ 123
+
+
+# Render "End"
+```html
+
+
+
+
+ 123
+
+
+
+```
+
+# Mutations
+```
+inserted html0
+inserted html0/head0
+inserted html0/body1
+inserted html0/body1/div0
+inserted html0/body1/div0/#comment0
+inserted html0/body1/div0/#text1
+```
+
+
+# Render "Hydrate"
+```html
+
+
+
+
+ 123
+
+
+
+```
+
+# Mutations
+```
+
+```
\ No newline at end of file
diff --git a/packages/translator/src/__tests__/fixtures/basic-export/template.marko b/packages/translator/src/__tests__/fixtures/basic-export/template.marko
new file mode 100644
index 000000000..1f4f81b6f
--- /dev/null
+++ b/packages/translator/src/__tests__/fixtures/basic-export/template.marko
@@ -0,0 +1,4 @@
+export const v = 123;
+
+
+${value}
\ No newline at end of file
diff --git a/packages/translator/src/__tests__/fixtures/basic-export/test.ts b/packages/translator/src/__tests__/fixtures/basic-export/test.ts
new file mode 100644
index 000000000..eca81ed31
--- /dev/null
+++ b/packages/translator/src/__tests__/fixtures/basic-export/test.ts
@@ -0,0 +1,7 @@
+import { v } from "./template.marko";
+
+export const steps = [
+ {
+ value: v,
+ },
+];
diff --git a/packages/translator/src/core/export.ts b/packages/translator/src/core/export.ts
new file mode 100644
index 000000000..fc8c81295
--- /dev/null
+++ b/packages/translator/src/core/export.ts
@@ -0,0 +1,22 @@
+import { parseScript, Tag } from "@marko/babel-utils";
+
+export default {
+ parse(tag) {
+ const { node } = tag;
+ tag.replaceWith(
+ parseScript(tag.hub.file, node.rawValue!, node.start!).body[0]
+ );
+ },
+ parseOptions: {
+ rootOnly: true,
+ rawOpenTag: true,
+ openTagOnly: true,
+ ignoreAttributes: true,
+ relaxRequireCommas: true,
+ },
+ autocomplete: [
+ {
+ displayText: "export ",
+ },
+ ],
+} as Tag;
diff --git a/packages/translator/src/core/index.ts b/packages/translator/src/core/index.ts
index 04b8b4693..5013bdf82 100644
--- a/packages/translator/src/core/index.ts
+++ b/packages/translator/src/core/index.ts
@@ -1,4 +1,5 @@
import ImportTag from "./import";
+import ExportTag from "./export";
import AttrsTag from "./attrs";
import IfTag from "./condition/if";
import ElseIfTag from "./condition/else-if";
@@ -18,6 +19,7 @@ import { taglibId } from "../util/is-core-tag";
export default {
taglibId,
"": ImportTag,
+ "": ExportTag,
"": AttrsTag,
"": IfTag,
"": ElseIfTag,
diff --git a/packages/translator/src/visitors/program/html.ts b/packages/translator/src/visitors/program/html.ts
index e6441129c..70bc4412b 100644
--- a/packages/translator/src/visitors/program/html.ts
+++ b/packages/translator/src/visitors/program/html.ts
@@ -51,6 +51,9 @@ function isStatic(path: t.NodePath) {
if (path.isImportDeclaration()) {
return true;
}
+ if (path.isExportDeclaration()) {
+ return true;
+ }
// TODO include more cases here.
diff --git a/packages/translator/tsconfig.json b/packages/translator/tsconfig.json
index 151a15edd..9e0d2443f 100644
--- a/packages/translator/tsconfig.json
+++ b/packages/translator/tsconfig.json
@@ -1,6 +1,6 @@
{
"extends": "../../tsconfig.json",
- "include": ["src/**/*"],
+ "include": ["src/**/*", "../../types/types.d.ts"],
"compilerOptions": {
"outDir": "dist",
"rootDir": "src",
diff --git a/tsconfig.json b/tsconfig.json
index e04018a53..b3bed4394 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,5 +1,5 @@
{
- "include": ["packages/*/src/**/*"],
+ "include": ["packages/*/src/**/*", "types/types.d.ts"],
"compilerOptions": {
"lib": ["dom", "ESNext"],
"strict": true,
diff --git a/packages/runtime/src/types.d.ts b/types/types.d.ts
similarity index 57%
rename from packages/runtime/src/types.d.ts
rename to types/types.d.ts
index 74cf582bd..407a616e2 100644
--- a/packages/runtime/src/types.d.ts
+++ b/types/types.d.ts
@@ -1 +1,3 @@
declare const MARKO_DEBUG: boolean;
+
+declare module "*.marko";