@marko/run 0.0.1-beta1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/README.md +267 -0
  2. package/dist/adapter/default-entry.mjs +18 -0
  3. package/dist/adapter/dev-server.d.ts +4 -0
  4. package/dist/adapter/index.cjs +159 -0
  5. package/dist/adapter/index.d.ts +4 -0
  6. package/dist/adapter/index.js +126 -0
  7. package/dist/adapter/server-old.d.ts +3 -0
  8. package/dist/adapter/server.d.ts +6 -0
  9. package/dist/adapters/node/index.d.ts +5 -0
  10. package/dist/adapters/node/server.d.ts +3 -0
  11. package/dist/adapters/static/crawler.d.ts +9 -0
  12. package/dist/adapters/static/default-entry.mjs +1 -0
  13. package/dist/adapters/static/index.cjs +371 -0
  14. package/dist/adapters/static/index.d.ts +5 -0
  15. package/dist/adapters/static/index.js +341 -0
  16. package/dist/adapters/static/server.d.ts +3 -0
  17. package/dist/cli/default.config.mjs +7 -0
  18. package/dist/cli/index.mjs +223 -0
  19. package/dist/runtime/index.cjs +34 -0
  20. package/dist/runtime/index.d.ts +2 -0
  21. package/dist/runtime/index.js +7 -0
  22. package/dist/runtime/request.d.ts +4 -0
  23. package/dist/runtime/router.cjs +39 -0
  24. package/dist/runtime/router.d.ts +4 -0
  25. package/dist/runtime/router.js +12 -0
  26. package/dist/runtime/types.d.ts +22 -0
  27. package/dist/vite/codegen/index.d.ts +5 -0
  28. package/dist/vite/codegen/writer.d.ts +20 -0
  29. package/dist/vite/constants.d.ts +19 -0
  30. package/dist/vite/index.cjs +1394 -0
  31. package/dist/vite/index.d.ts +3 -0
  32. package/dist/vite/index.js +1359 -0
  33. package/dist/vite/plugin.d.ts +3 -0
  34. package/dist/vite/routes/builder.d.ts +7 -0
  35. package/dist/vite/routes/routeTrie.d.ts +2 -0
  36. package/dist/vite/routes/walk.d.ts +14 -0
  37. package/dist/vite/types.d.ts +62 -0
  38. package/dist/vite/utils/ast.d.ts +1 -0
  39. package/dist/vite/utils/config.d.ts +3 -0
  40. package/dist/vite/utils/log.d.ts +3 -0
  41. package/dist/vite/utils/route.d.ts +3 -0
  42. package/dist/vite/utils/server.d.ts +7 -0
  43. package/package.json +93 -0
@@ -0,0 +1,3 @@
1
+ /// <reference types="node" />
2
+ import { type Server } from "http";
3
+ export default function (dir?: string): Promise<Server>;
@@ -0,0 +1,7 @@
1
+ import { defineConfig } from "vite";
2
+ import marko from "@marko/run/vite";
3
+ import staticAdapter from "@marko/run/adapter";
4
+
5
+ export default defineConfig({
6
+ plugins: [marko({ adapter: staticAdapter() })],
7
+ });
@@ -0,0 +1,223 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/cli/index.ts
4
+ import path from "path";
5
+ import fs from "fs";
6
+ import { fileURLToPath } from "url";
7
+ import { build as viteBuild, resolveConfig } from "vite";
8
+ import sade from "sade";
9
+
10
+ // src/vite/utils/config.ts
11
+ var KEY = "__MARKO_SERVE_OPTIONS__";
12
+ function getMarkoServeOptions(viteConfig) {
13
+ return viteConfig[KEY];
14
+ }
15
+ function setMarkoServeOptions(viteConfig, options) {
16
+ viteConfig[KEY] = options;
17
+ return viteConfig;
18
+ }
19
+
20
+ // src/cli/index.ts
21
+ import { MemoryStore } from "@marko/vite";
22
+
23
+ // src/vite/utils/server.ts
24
+ import net from "net";
25
+ import cp from "child_process";
26
+ async function spawnServer(cmd, port = 0, cwd2 = process.cwd(), wait = 3e4) {
27
+ if (port <= 0) {
28
+ port = await getAvailablePort();
29
+ }
30
+ const proc = cp.spawn(cmd, {
31
+ cwd: cwd2,
32
+ shell: true,
33
+ stdio: "inherit",
34
+ windowsHide: true,
35
+ env: { NODE_ENV: "development", ...process.env, PORT: `${port}` }
36
+ });
37
+ const close = () => {
38
+ proc.unref();
39
+ proc.kill();
40
+ };
41
+ let remaining = wait > 0 ? wait : Infinity;
42
+ while (!await isPortInUse(port)) {
43
+ if (remaining >= 100) {
44
+ remaining -= 100;
45
+ await sleep(100);
46
+ } else {
47
+ close();
48
+ throw new Error(
49
+ `site-write: timeout while wating for server to start on port "${port}".`
50
+ );
51
+ }
52
+ }
53
+ return {
54
+ port,
55
+ close
56
+ };
57
+ }
58
+ async function isPortInUse(port) {
59
+ return new Promise((resolve) => {
60
+ const connection = net.connect(port).setNoDelay(true).setKeepAlive(false).on("error", () => done(false)).on("connect", () => done(true));
61
+ function done(connected) {
62
+ connection.end();
63
+ resolve(connected);
64
+ }
65
+ });
66
+ }
67
+ async function getAvailablePort() {
68
+ return new Promise((resolve) => {
69
+ const server = net.createServer().listen(0, () => {
70
+ const { port } = server.address();
71
+ server.close(() => resolve(port));
72
+ });
73
+ });
74
+ }
75
+ function sleep(ms) {
76
+ return new Promise((resolve) => setTimeout(resolve, ms));
77
+ }
78
+
79
+ // src/cli/index.ts
80
+ var __dirname = fileURLToPath(new URL(".", import.meta.url));
81
+ var cwd = process.cwd();
82
+ var defaultPort = +process.env.PORT || 3e3;
83
+ var prog = sade("marko-run").version("0.0.1").option("-c, --config", "Provide path to a Vite config");
84
+ prog.command("preview [entry]", "", { default: true }).describe("Start production-like server against built assets").option("-o, --output", "Directory to serve files").option("-p, --port", "Port to use for dev server").option("-f, --file", "Output file to start").action(async (entry, opts) => {
85
+ const config = await getViteConfig(cwd, opts.config);
86
+ await build(entry, config, opts.output);
87
+ await preview(opts.entry, config, opts.port, opts.output);
88
+ });
89
+ prog.command("dev [entry]").describe("Start dev server").option("-p, --port", "Port to use for dev server").example("dev --config vite.config.js").action(async (entry, opts) => {
90
+ const cmd = opts._.length ? `${entry} ${opts._.join(" ")}` : entry ? `node ${entry}` : void 0;
91
+ const config = await getViteConfig(cwd, opts.config);
92
+ await dev(cmd, config, opts.port);
93
+ });
94
+ prog.command("build [entry]").describe("Build the application").option("-o, --output", "Directory to ouput built files").option("--skip-client", "Skip the client build").example("build --config vite.config.js").action(async (entry, opts) => {
95
+ const config = await getViteConfig(cwd, opts.config);
96
+ await build(entry, config, opts.ouput, opts["skip-client"]);
97
+ });
98
+ prog.parse(process.argv);
99
+ async function preview(entry, configFile, port, outDir) {
100
+ const resolvedConfig = await resolveConfig(
101
+ { root: cwd, configFile, build: { outDir } },
102
+ "serve"
103
+ );
104
+ if (port === void 0) {
105
+ port = resolvedConfig.preview.port ?? defaultPort;
106
+ }
107
+ const adapter = await resolveAdapter(resolvedConfig);
108
+ if (!adapter) {
109
+ throw new Error("No adapter specified for serve command");
110
+ } else if (!adapter.startPreview) {
111
+ throw new Error(`Adapter ${adapter.name} does not support serve command`);
112
+ }
113
+ const dir = path.resolve(cwd, resolvedConfig.build.outDir);
114
+ const entryFile = entry ? path.join(dir, entry) : await findFileWithExt(dir, "index", [".mjs", ".js"]);
115
+ await adapter.startPreview(dir, entryFile, port);
116
+ }
117
+ async function dev(cmd, configFile, port) {
118
+ const resolvedConfig = await resolveConfig(
119
+ { root: cwd, configFile },
120
+ "build"
121
+ );
122
+ if (port === void 0) {
123
+ port = resolvedConfig.preview.port ?? defaultPort;
124
+ }
125
+ if (cmd) {
126
+ await spawnServer(cmd, port);
127
+ } else {
128
+ const adapter = await resolveAdapter(resolvedConfig);
129
+ if (!adapter) {
130
+ throw new Error(
131
+ "No adapter specified for dev command without custom target"
132
+ );
133
+ } else if (!adapter.startDev) {
134
+ throw new Error(`Adapter ${adapter.name} does not support serve command`);
135
+ } else {
136
+ await adapter.startDev(configFile, port);
137
+ }
138
+ }
139
+ }
140
+ async function build(entry, configFile, outDir, skipClient = false) {
141
+ var _a;
142
+ if (!entry) {
143
+ const resolvedConfig = await resolveConfig(
144
+ { root: cwd, configFile },
145
+ "build"
146
+ );
147
+ const adapter = await resolveAdapter(resolvedConfig);
148
+ if (!adapter) {
149
+ throw new Error("No adapter specified for build command without entry");
150
+ }
151
+ entry = await ((_a = adapter.getEntryFile) == null ? void 0 : _a.call(adapter));
152
+ if (!entry) {
153
+ throw new Error(
154
+ `Adapter ${adapter.name} does not support build command without entry`
155
+ );
156
+ }
157
+ }
158
+ const buildConfig = setMarkoServeOptions(
159
+ {
160
+ root: cwd,
161
+ configFile,
162
+ build: {
163
+ ssr: false,
164
+ outDir
165
+ }
166
+ },
167
+ {
168
+ store: new MemoryStore()
169
+ }
170
+ );
171
+ await viteBuild({
172
+ ...buildConfig,
173
+ build: {
174
+ ...buildConfig.build,
175
+ ssr: entry,
176
+ rollupOptions: {
177
+ output: {
178
+ entryFileNames: "index.mjs"
179
+ }
180
+ }
181
+ }
182
+ });
183
+ if (!skipClient) {
184
+ await viteBuild({
185
+ ...buildConfig,
186
+ build: {
187
+ ...buildConfig.build,
188
+ sourcemap: true
189
+ }
190
+ });
191
+ }
192
+ }
193
+ function findFileWithExt(dir, base, extensions = [".js", ".cjs", ".mjs", ".ts", ".mts"]) {
194
+ for (const ext of extensions) {
195
+ const filePath = path.join(dir, base + ext);
196
+ if (fs.existsSync(filePath)) {
197
+ return filePath;
198
+ }
199
+ }
200
+ return void 0;
201
+ }
202
+ async function getViteConfig(dir, configFile, bases = ["serve.config", "vite.config"]) {
203
+ if (configFile) {
204
+ if (!fs.existsSync(path.join(dir, configFile))) {
205
+ throw new Error(`Unable to load config file '${configFile}' from ${dir}`);
206
+ }
207
+ return configFile;
208
+ }
209
+ for (const base of bases) {
210
+ configFile = findFileWithExt(dir, base);
211
+ if (configFile) {
212
+ return configFile;
213
+ }
214
+ }
215
+ return path.join(__dirname, "default.config.mjs");
216
+ }
217
+ async function resolveAdapter(config) {
218
+ const options = getMarkoServeOptions(config);
219
+ if (!options) {
220
+ throw new Error("Unable to resolve Marko Serve options");
221
+ }
222
+ return options.adapter;
223
+ }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/runtime/index.ts
21
+ var runtime_exports = {};
22
+ __export(runtime_exports, {
23
+ getMatchedRoute: () => import_router.getMatchedRoute,
24
+ handler: () => import_router.handler,
25
+ router: () => import_router.router
26
+ });
27
+ module.exports = __toCommonJS(runtime_exports);
28
+ var import_router = require("@marko/run/router");
29
+ // Annotate the CommonJS export names for ESM import in node:
30
+ 0 && (module.exports = {
31
+ getMatchedRoute,
32
+ handler,
33
+ router
34
+ });
@@ -0,0 +1,2 @@
1
+ export { router, getMatchedRoute, handler } from '@marko/run/router';
2
+ export type { MatchedRoute, Handler, RouteContext, RouteHandler, RouteMatcher, Router } from './types';
@@ -0,0 +1,7 @@
1
+ // src/runtime/index.ts
2
+ import { router, getMatchedRoute, handler } from "@marko/run/router";
3
+ export {
4
+ getMatchedRoute,
5
+ handler,
6
+ router
7
+ };
@@ -0,0 +1,4 @@
1
+ /// <reference types="node" />
2
+ import type { ServerResponse, IncomingMessage } from "http";
3
+ export declare function createWebRequest<NodeRequest extends IncomingMessage = IncomingMessage>(nodeRequest: NodeRequest, url: URL): Request;
4
+ export declare function applyWebResponse<NodeRequest extends IncomingMessage = IncomingMessage>(nodeResponse: ServerResponse<NodeRequest>, webResponse: Response): Promise<void>;
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/runtime/router.ts
21
+ var router_exports = {};
22
+ __export(router_exports, {
23
+ getMatchedRoute: () => getMatchedRoute,
24
+ handler: () => handler,
25
+ router: () => router
26
+ });
27
+ module.exports = __toCommonJS(router_exports);
28
+ function notImplemented() {
29
+ throw new Error("This should have been replaced by the @marko/run plugin at build/dev time");
30
+ }
31
+ var handler = notImplemented;
32
+ var router = notImplemented;
33
+ var getMatchedRoute = notImplemented;
34
+ // Annotate the CommonJS export names for ESM import in node:
35
+ 0 && (module.exports = {
36
+ getMatchedRoute,
37
+ handler,
38
+ router
39
+ });
@@ -0,0 +1,4 @@
1
+ import type { Handler, RouteMatcher, Router } from './types';
2
+ export declare const handler: Handler;
3
+ export declare const router: Router;
4
+ export declare const getMatchedRoute: RouteMatcher;
@@ -0,0 +1,12 @@
1
+ // src/runtime/router.ts
2
+ function notImplemented() {
3
+ throw new Error("This should have been replaced by the @marko/run plugin at build/dev time");
4
+ }
5
+ var handler = notImplemented;
6
+ var router = notImplemented;
7
+ var getMatchedRoute = notImplemented;
8
+ export {
9
+ getMatchedRoute,
10
+ handler,
11
+ router
12
+ };
@@ -0,0 +1,22 @@
1
+ import type { AdapterRequestContext } from '@hattip/core';
2
+ export interface RouteContext<Params extends Record<string, string> = {}, Meta = unknown> {
3
+ request: Request;
4
+ url: URL;
5
+ params: Params;
6
+ meta: Meta;
7
+ error?: unknown;
8
+ }
9
+ export declare type RouteHandler<Params extends Record<string, string> = {}, Meta = unknown> = (context: RouteContext<Params, Meta>) => Promise<Response>;
10
+ export interface MatchedRoute<Params extends Record<string, string> = {}, Meta = unknown> {
11
+ handler: RouteHandler;
12
+ params: Params;
13
+ meta: Meta;
14
+ invoke: Router;
15
+ }
16
+ export declare type Router = (request: Request) => Promise<Response>;
17
+ export declare type RouteMatcher = (method: string, url: URL) => MatchedRoute | null;
18
+ export declare type Handler = (context: AdapterRequestContext) => Promise<Response>;
19
+ export interface Runtime {
20
+ router: Router;
21
+ getMatchedRoute: RouteMatcher;
22
+ }
@@ -0,0 +1,5 @@
1
+ import type { Route, BuiltRoutes, CodegenOptions } from "../types";
2
+ export declare const DefaultCodegenOptions: CodegenOptions;
3
+ export declare function renderRouteTemplate(route: Route): string;
4
+ export declare function renderRouteEntry(route: Route): string;
5
+ export declare function renderRouter(routes: BuiltRoutes, options?: CodegenOptions): string;
@@ -0,0 +1,20 @@
1
+ export interface Writer {
2
+ indent: number;
3
+ branch(name: string): Writer;
4
+ join(closeBranches?: boolean): void;
5
+ write(data: string): Writer;
6
+ writeLines(...lines: string[]): Writer;
7
+ writeBlockStart(data: string): Writer;
8
+ writeBlockEnd(data: string): Writer;
9
+ writeBlock(start: string, lines: string[], end: string): Writer;
10
+ }
11
+ export interface WriterOptions {
12
+ indentWith?: string;
13
+ onJoin?: (writer: Writer) => void;
14
+ }
15
+ export declare function createWriter(sink: (data: string) => void, options?: WriterOptions): Writer;
16
+ interface StringWriter extends Writer {
17
+ end(): string;
18
+ }
19
+ export declare function createStringWriter(opts?: WriterOptions): StringWriter;
20
+ export {};
@@ -0,0 +1,19 @@
1
+ declare type ValuesOf<T> = T[keyof T];
2
+ export declare const markoServeFilePrefix = "__marko-serve__";
3
+ export declare const virtualFilePrefix = "virtual:marko-serve";
4
+ export declare const virtualRoutesPrefix: string;
5
+ export declare const httpVerbs: readonly ["get", "post", "put", "delete"];
6
+ export declare const serverEntryQuery = "?marko-server-entry";
7
+ export declare const browserEntryQuery = "?marko-browser-entry";
8
+ export declare const RoutableFileTypes: {
9
+ readonly Page: "page";
10
+ readonly Layout: "layout";
11
+ readonly Handler: "handler";
12
+ readonly Middleware: "middleware";
13
+ readonly Meta: "meta";
14
+ readonly NotFound: "404";
15
+ readonly Error: "500";
16
+ };
17
+ export declare type RoutableFileType = ValuesOf<typeof RoutableFileTypes>;
18
+ export declare type HttpVerb = typeof httpVerbs[number];
19
+ export {};