@geektech/tsone-cli 0.0.1 → 0.1.0
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.
- package/README.md +66 -24
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +16 -9
- package/dist/cli.js.map +3 -3
- package/dist/index-p7jrckn1.js +3258 -0
- package/dist/index-p7jrckn1.js.map +18 -0
- package/dist/index.js +5 -5
- package/dist/index.js.map +1 -1
- package/dist/project.d.ts +1 -1
- package/dist/server.d.ts +6 -2
- package/dist/types.d.ts +2 -0
- package/dist/watch.d.ts +11 -0
- package/package.json +2 -4
- package/dist/index-jmtdrrbw.js +0 -46908
- package/dist/index-jmtdrrbw.js.map +0 -482
package/README.md
CHANGED
|
@@ -41,7 +41,8 @@ app.mount();
|
|
|
41
41
|
```
|
|
42
42
|
|
|
43
43
|
The export must be written as `export const app`; a default export or another
|
|
44
|
-
name is not used by the CLI.
|
|
44
|
+
name is not used by the CLI. `entry` is the root page (served at `/` and built
|
|
45
|
+
to `index.html`).
|
|
45
46
|
|
|
46
47
|
## Configuration
|
|
47
48
|
|
|
@@ -82,6 +83,7 @@ export default defineConfig({
|
|
|
82
83
|
Defaults:
|
|
83
84
|
|
|
84
85
|
- `entry`: `src/main.ts`
|
|
86
|
+
- `pages`: `{}` (no additional pages)
|
|
85
87
|
- `server.host`: `127.0.0.1`
|
|
86
88
|
- `server.port`: `52211`
|
|
87
89
|
- `server.proxy`: `{}`
|
|
@@ -91,34 +93,72 @@ Defaults:
|
|
|
91
93
|
project root itself, an outside path, and a path that escapes through a symlink
|
|
92
94
|
are rejected before the output directory is removed.
|
|
93
95
|
|
|
96
|
+
## Multi-Page Applications
|
|
97
|
+
|
|
98
|
+
Configure additional pages with the `pages` option, mapping each route to a
|
|
99
|
+
page entry. Every page entry must satisfy the same `app` contract as `entry`:
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
import { defineConfig } from '@geektech/tsone-cli';
|
|
103
|
+
|
|
104
|
+
export default defineConfig({
|
|
105
|
+
entry: 'src/main.ts',
|
|
106
|
+
pages: {
|
|
107
|
+
'/about': 'src/about.ts',
|
|
108
|
+
'/docs/guide': 'src/guide.ts',
|
|
109
|
+
},
|
|
110
|
+
});
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
Route keys must start with `/` and may nest; trailing slashes are normalized
|
|
114
|
+
(`'/about/'` is served the same as `'/about'`). The root route `/` cannot be
|
|
115
|
+
redefined in `pages` — use `entry` for it. Each route maps to its own entry,
|
|
116
|
+
so every page bundles and renders independently.
|
|
117
|
+
|
|
118
|
+
During development each configured page is served at its route: `/about/`
|
|
119
|
+
and `/about/index.html` also resolve to `/about`, and every page receives its
|
|
120
|
+
own live-reload injection. `tsone build` emits one HTML document per page,
|
|
121
|
+
using the page route for the filename (`index.html` for `/`, `about.html` for
|
|
122
|
+
`/about`, `docs/guide.html` for `/docs/guide`) with asset URLs relative to that
|
|
123
|
+
document.
|
|
124
|
+
|
|
94
125
|
## Command Line
|
|
95
126
|
|
|
96
127
|
Development and build options are deliberately separate:
|
|
97
128
|
|
|
98
129
|
```text
|
|
99
|
-
tsone dev [--host <host>] [--port <port>]
|
|
130
|
+
tsone dev [--host <host>] [--port <port>] [--no-watch]
|
|
100
131
|
tsone build [--out-dir <path>]
|
|
101
132
|
```
|
|
102
133
|
|
|
103
|
-
`dev` accepts
|
|
104
|
-
Options override `tsone.config.ts`. Both separated and equals
|
|
105
|
-
example `--port 3000`, `--port=3000`, `--out-dir output`, and
|
|
134
|
+
`dev` accepts `--host`, `--port`, and `--no-watch`; `build` accepts only
|
|
135
|
+
`--out-dir`. Options override `tsone.config.ts`. Both separated and equals
|
|
136
|
+
forms work, for example `--port 3000`, `--port=3000`, `--out-dir output`, and
|
|
106
137
|
`--out-dir=output`.
|
|
107
138
|
|
|
108
|
-
`tsone dev`
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
139
|
+
`tsone dev` watches the project by default: when a source, style, or config
|
|
140
|
+
file changes it rebuilds the current page and notifies connected browsers to
|
|
141
|
+
reload over a server-sent events stream at `/__tsone/reload`, so the page
|
|
142
|
+
updates without a manual refresh. A failed rebuild keeps the last working page
|
|
143
|
+
served, and changes to `tsone.config.ts` restart the development server with
|
|
144
|
+
the fresh configuration. Pass `--no-watch` to disable file watching and keep
|
|
145
|
+
the server as a plain on-demand builder.
|
|
146
|
+
|
|
147
|
+
`tsone dev` serves the generated HTML at `/` and `/index.html`, plus one route
|
|
148
|
+
per configured page. Each document build writes an immutable browser ESM
|
|
149
|
+
generation beneath the internal `.tsone/dev/` directory and references exact
|
|
150
|
+
`/dev/<session>/<generation>/...` JavaScript and stylesheet URLs. Bun uses that
|
|
151
|
+
exact generation URL as its public path, so emitted file-asset strings are
|
|
152
|
+
absolute URLs under the same generation and resolve correctly from the document
|
|
153
|
+
URL across concurrent pages. `/bundle.js` remains a compatibility alias that
|
|
154
|
+
rebuilds and redirects to the latest root entry URL. Other unmatched paths
|
|
155
|
+
return 404. The `.tsone/` directory is generated tooling output and can be
|
|
156
|
+
removed while the development server is stopped. A `.tsone` path that resolves
|
|
157
|
+
outside the project through a symlink is rejected before the development server
|
|
158
|
+
starts.
|
|
159
|
+
|
|
160
|
+
`tsone build` writes a Bun browser bundle and one HTML document per page to the
|
|
161
|
+
safe output directory.
|
|
122
162
|
|
|
123
163
|
## Development Proxy
|
|
124
164
|
|
|
@@ -160,7 +200,8 @@ console.log(result.root, result.outDir, result.assetsBuilt);
|
|
|
160
200
|
- `defineConfig(config)` returns the same typed config object.
|
|
161
201
|
- `resolveConfig(options?)` validates and merges defaults, a config file,
|
|
162
202
|
direct config, and host/port/outDir overrides. It returns absolute `root`,
|
|
163
|
-
`entry`, and `build.outDir` values
|
|
203
|
+
`entry`, and `build.outDir` values, the resolved `pages` route map, plus the
|
|
204
|
+
resolved server configuration.
|
|
164
205
|
- `startDevServer(options?)` resolves the configuration and returns the Bun
|
|
165
206
|
server. The caller owns its lifecycle and must call `server.stop()`.
|
|
166
207
|
- `build(options?)` validates the entry and output path, then returns
|
|
@@ -169,7 +210,8 @@ console.log(result.root, result.outDir, result.assetsBuilt);
|
|
|
169
210
|
## Version 1 Scope
|
|
170
211
|
|
|
171
212
|
The development server serves HTTP only. Proxy targets may use HTTP or HTTPS.
|
|
172
|
-
CLI v1 has no config plugins, WebSocket, HMR, SSR, functional config,
|
|
173
|
-
directory copying, or public `minify` and `sourcemap`
|
|
174
|
-
Development bundles use an internal inline source map, while
|
|
175
|
-
minification and source-map controls are intentionally not
|
|
213
|
+
CLI v1 has no config plugins, WebSocket, HMR, SSR, functional config,
|
|
214
|
+
`public/` directory copying, or public `minify` and `sourcemap`
|
|
215
|
+
configuration. Development bundles use an internal inline source map, while
|
|
216
|
+
production build minification and source-map controls are intentionally not
|
|
217
|
+
configurable.
|
package/dist/cli.d.ts
CHANGED
package/dist/cli.js
CHANGED
|
@@ -2,15 +2,16 @@
|
|
|
2
2
|
import {
|
|
3
3
|
build,
|
|
4
4
|
startDevServer
|
|
5
|
-
} from "./index-
|
|
5
|
+
} from "./index-p7jrckn1.js";
|
|
6
6
|
|
|
7
7
|
// src/cli.ts
|
|
8
8
|
var USAGE = [
|
|
9
9
|
"Usage:",
|
|
10
|
-
" tsone dev [--host <host>] [--port <port>]",
|
|
10
|
+
" tsone dev [--host <host>] [--port <port>] [--no-watch]",
|
|
11
11
|
" tsone build [--out-dir <path>]"
|
|
12
12
|
].join(`
|
|
13
13
|
`);
|
|
14
|
+
var FLAG_OPTIONS = new Set(["--no-watch"]);
|
|
14
15
|
function parseCliArgs(argv) {
|
|
15
16
|
const command = argv[0];
|
|
16
17
|
if (command !== "dev" && command !== "build") {
|
|
@@ -28,6 +29,10 @@ function parseCliArgs(argv) {
|
|
|
28
29
|
if (options.has(name)) {
|
|
29
30
|
throw parseError(`Duplicate option: ${name}`);
|
|
30
31
|
}
|
|
32
|
+
if (FLAG_OPTIONS.has(name)) {
|
|
33
|
+
options.set(name, "true");
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
31
36
|
const value = inlineValue ?? argv[index + 1];
|
|
32
37
|
if (value === undefined || value === "" || value.startsWith("--")) {
|
|
33
38
|
throw parseError(`Missing value for option: ${name}`);
|
|
@@ -42,7 +47,8 @@ function parseCliArgs(argv) {
|
|
|
42
47
|
return {
|
|
43
48
|
command,
|
|
44
49
|
...options.has("--host") ? { host: options.get("--host") } : {},
|
|
45
|
-
...port === undefined ? {} : { port: parsePort(port) }
|
|
50
|
+
...port === undefined ? {} : { port: parsePort(port) },
|
|
51
|
+
...options.has("--no-watch") ? { noWatch: true } : {}
|
|
46
52
|
};
|
|
47
53
|
}
|
|
48
54
|
return {
|
|
@@ -55,7 +61,8 @@ async function runCli(argv = process.argv.slice(2)) {
|
|
|
55
61
|
if (args.command === "dev") {
|
|
56
62
|
const server = await startDevServer({
|
|
57
63
|
...args.host === undefined ? {} : { host: args.host },
|
|
58
|
-
...args.port === undefined ? {} : { port: args.port }
|
|
64
|
+
...args.port === undefined ? {} : { port: args.port },
|
|
65
|
+
watch: !args.noWatch
|
|
59
66
|
});
|
|
60
67
|
console.log(`TSone dev server listening at http://${server.hostname}:${server.port}`);
|
|
61
68
|
return;
|
|
@@ -74,13 +81,13 @@ function splitOption(token) {
|
|
|
74
81
|
};
|
|
75
82
|
}
|
|
76
83
|
function assertKnownOption(name) {
|
|
77
|
-
if (name === "--host" || name === "--port" || name === "--out-dir") {
|
|
84
|
+
if (name === "--host" || name === "--port" || name === "--out-dir" || name === "--no-watch") {
|
|
78
85
|
return;
|
|
79
86
|
}
|
|
80
87
|
throw parseError(`Unknown option: ${name}`);
|
|
81
88
|
}
|
|
82
89
|
function assertSupportedOption(command, name) {
|
|
83
|
-
const supported = command === "dev" && (name === "--host" || name === "--port") || command === "build" && name === "--out-dir";
|
|
90
|
+
const supported = command === "dev" && (name === "--host" || name === "--port" || name === "--no-watch") || command === "build" && name === "--out-dir";
|
|
84
91
|
if (!supported) {
|
|
85
92
|
throw parseError(`Option ${name} is not supported for ${command}`);
|
|
86
93
|
}
|
|
@@ -101,9 +108,9 @@ function parseError(message) {
|
|
|
101
108
|
${USAGE}`);
|
|
102
109
|
}
|
|
103
110
|
export {
|
|
104
|
-
|
|
105
|
-
|
|
111
|
+
parseCliArgs,
|
|
112
|
+
runCli
|
|
106
113
|
};
|
|
107
114
|
|
|
108
|
-
//# debugId=
|
|
115
|
+
//# debugId=64176CE47C4D4DED64756E2164756E21
|
|
109
116
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/cli.ts"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import { build } from './build';\nimport { startDevServer } from './server';\n\nconst USAGE = [\n 'Usage:',\n ' tsone dev [--host <host>] [--port <port>]',\n ' tsone build [--out-dir <path>]',\n].join('\\n');\n\nexport interface DevCliArgs {\n command: 'dev';\n host?: string;\n port?: number;\n}\n\nexport interface BuildCliArgs {\n command: 'build';\n outDir?: string;\n}\n\nexport type CliArgs = DevCliArgs | BuildCliArgs;\n\nexport function parseCliArgs(argv: string[]): CliArgs {\n const command = argv[0];\n if (command !== 'dev' && command !== 'build') {\n throw parseError(\n command === undefined ? 'Missing command' : `Unknown command: ${command}`\n );\n }\n\n const options = new Map<string, string>();\n for (let index = 1; index < argv.length; index += 1) {\n const token = argv[index];\n if (!token.startsWith('--')) {\n throw parseError(`Unexpected positional argument: ${token}`);\n }\n\n const { name, inlineValue } = splitOption(token);\n assertKnownOption(name);\n assertSupportedOption(command, name);\n if (options.has(name)) {\n throw parseError(`Duplicate option: ${name}`);\n }\n\n const value = inlineValue ?? argv[index + 1];\n if (value === undefined || value === '' || value.startsWith('--')) {\n throw parseError(`Missing value for option: ${name}`);\n }\n if (inlineValue === undefined) {\n index += 1;\n }\n options.set(name, value);\n }\n\n if (command === 'dev') {\n const port = options.get('--port');\n return {\n command,\n ...(options.has('--host') ? { host: options.get('--host') } : {}),\n ...(port === undefined ? {} : { port: parsePort(port) }),\n };\n }\n\n return {\n command,\n ...(options.has('--out-dir') ? { outDir: options.get('--out-dir') } : {}),\n };\n}\n\nexport async function runCli(\n argv: string[] = process.argv.slice(2)\n): Promise<void> {\n const args = parseCliArgs(argv);\n\n if (args.command === 'dev') {\n const server = await startDevServer({\n ...(args.host === undefined ? {} : { host: args.host }),\n ...(args.port === undefined ? {} : { port: args.port }),\n });\n console.log(\n `TSone dev server listening at http://${server.hostname}:${server.port}`\n );\n return;\n }\n\n const result = await build(\n args.outDir === undefined ? {} : { outDir: args.outDir }\n );\n console.log(\n `TSone build completed: ${result.outDir} (${result.assetsBuilt.length} assets)`\n );\n}\n\nfunction splitOption(token: string): { name: string; inlineValue?: string } {\n const equalsIndex = token.indexOf('=');\n if (equalsIndex === -1) {\n return { name: token };\n }\n\n return {\n name: token.slice(0, equalsIndex),\n inlineValue: token.slice(equalsIndex + 1),\n };\n}\n\nfunction assertKnownOption(name: string): void {\n if (name === '--host'
|
|
5
|
+
"import { build } from './build';\nimport { startDevServer } from './server';\n\nconst USAGE = [\n 'Usage:',\n ' tsone dev [--host <host>] [--port <port>] [--no-watch]',\n ' tsone build [--out-dir <path>]',\n].join('\\n');\n\nconst FLAG_OPTIONS = new Set(['--no-watch']);\n\nexport interface DevCliArgs {\n command: 'dev';\n host?: string;\n port?: number;\n noWatch?: boolean;\n}\n\nexport interface BuildCliArgs {\n command: 'build';\n outDir?: string;\n}\n\nexport type CliArgs = DevCliArgs | BuildCliArgs;\n\nexport function parseCliArgs(argv: string[]): CliArgs {\n const command = argv[0];\n if (command !== 'dev' && command !== 'build') {\n throw parseError(\n command === undefined ? 'Missing command' : `Unknown command: ${command}`\n );\n }\n\n const options = new Map<string, string>();\n for (let index = 1; index < argv.length; index += 1) {\n const token = argv[index];\n if (!token.startsWith('--')) {\n throw parseError(`Unexpected positional argument: ${token}`);\n }\n\n const { name, inlineValue } = splitOption(token);\n assertKnownOption(name);\n assertSupportedOption(command, name);\n if (options.has(name)) {\n throw parseError(`Duplicate option: ${name}`);\n }\n if (FLAG_OPTIONS.has(name)) {\n options.set(name, 'true');\n continue;\n }\n\n const value = inlineValue ?? argv[index + 1];\n if (value === undefined || value === '' || value.startsWith('--')) {\n throw parseError(`Missing value for option: ${name}`);\n }\n if (inlineValue === undefined) {\n index += 1;\n }\n options.set(name, value);\n }\n\n if (command === 'dev') {\n const port = options.get('--port');\n return {\n command,\n ...(options.has('--host') ? { host: options.get('--host') } : {}),\n ...(port === undefined ? {} : { port: parsePort(port) }),\n ...(options.has('--no-watch') ? { noWatch: true } : {}),\n };\n }\n\n return {\n command,\n ...(options.has('--out-dir') ? { outDir: options.get('--out-dir') } : {}),\n };\n}\n\nexport async function runCli(\n argv: string[] = process.argv.slice(2)\n): Promise<void> {\n const args = parseCliArgs(argv);\n\n if (args.command === 'dev') {\n const server = await startDevServer({\n ...(args.host === undefined ? {} : { host: args.host }),\n ...(args.port === undefined ? {} : { port: args.port }),\n watch: !args.noWatch,\n });\n console.log(\n `TSone dev server listening at http://${server.hostname}:${server.port}`\n );\n return;\n }\n\n const result = await build(\n args.outDir === undefined ? {} : { outDir: args.outDir }\n );\n console.log(\n `TSone build completed: ${result.outDir} (${result.assetsBuilt.length} assets)`\n );\n}\n\nfunction splitOption(token: string): { name: string; inlineValue?: string } {\n const equalsIndex = token.indexOf('=');\n if (equalsIndex === -1) {\n return { name: token };\n }\n\n return {\n name: token.slice(0, equalsIndex),\n inlineValue: token.slice(equalsIndex + 1),\n };\n}\n\nfunction assertKnownOption(name: string): void {\n if (\n name === '--host' ||\n name === '--port' ||\n name === '--out-dir' ||\n name === '--no-watch'\n ) {\n return;\n }\n\n throw parseError(`Unknown option: ${name}`);\n}\n\nfunction assertSupportedOption(\n command: CliArgs['command'],\n name: string\n): void {\n const supported =\n (command === 'dev' &&\n (name === '--host' || name === '--port' || name === '--no-watch')) ||\n (command === 'build' && name === '--out-dir');\n\n if (!supported) {\n throw parseError(`Option ${name} is not supported for ${command}`);\n }\n}\n\nfunction parsePort(value: string): number {\n if (!/^\\d+$/.test(value)) {\n throw parseError('Port must be an integer between 0 and 65535');\n }\n\n const port = Number(value);\n if (!Number.isInteger(port) || port < 0 || port > 65535) {\n throw parseError('Port must be an integer between 0 and 65535');\n }\n\n return port;\n}\n\nfunction parseError(message: string): Error {\n return new Error(`${message}\\n\\n${USAGE}`);\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": ";;;;;;;AAGA,IAAM,QAAQ;AAAA,EACZ;AAAA,EACA;AAAA,EACA;AACF,EAAE,KAAK;AAAA,CAAI;
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "64176CE47C4D4DED64756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|