lecodes-cli 0.20.2 → 2.0.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 +56 -57
- package/dist/index.js +11052 -7592
- package/package.json +14 -8
- package/runtime/materials/decal-relief.mat +12 -1
- package/runtime/materials/decal.mat +17 -3
- package/runtime/materials/lightmap.mat +117 -138
- package/runtime/materials/particles-quad.mat +6 -2
- package/runtime/materials/terrain-lightmap.mat +123 -0
- package/runtime/materials/terrain.mat +36 -55
- package/runtime/sdk-types.json +1 -1
- package/runtime/web/VERSION.json +5 -0
- package/runtime/web/assets/camera-5XOM8eHl.js +1 -0
- package/runtime/web/assets/creator-2d-D9WKYM6h.js +1 -0
- package/runtime/web/assets/creator-2d-ukvEmNEp.wasm +0 -0
- package/runtime/web/assets/creator-full-BBXzQlhq.js +1 -0
- package/runtime/web/assets/creator-full-D2dSDdDj.wasm +0 -0
- package/runtime/web/assets/creator-full.js-BYswGsqR.symbols +8124 -0
- package/runtime/web/assets/creator-ui-DIc92ion.wasm +0 -0
- package/runtime/web/assets/creator-ui-_1Z_AX2M.js +1 -0
- package/runtime/web/assets/geolocation-BjTKN9_P.js +1 -0
- package/runtime/web/assets/inspect-C7x78PNs.js +2 -0
- package/runtime/web/assets/map-CyBxOSV0.js +1 -0
- package/runtime/web/assets/map-XzoOFt0E.js +2 -0
- package/runtime/web/assets/mapImpl-bxvQ2h1Z.js +823 -0
- package/runtime/web/assets/maplibre-gl-worker-B7LXXUkR.js +8 -0
- package/runtime/web/assets/materials-uri4FvPE.bin +0 -0
- package/runtime/web/assets/materials-world-CQWt8TAm.bin +0 -0
- package/runtime/web/assets/qr-scanner-CK_cYoJR.js +1 -0
- package/runtime/web/assets/uberarchive-DLH-kBhM.bin +0 -0
- package/runtime/web/index.html +36 -0
- package/runtime/web/player.js +21 -0
- package/runtime/web-page/index.html +41 -0
- package/runtime/web-page/page.css +1 -0
- package/runtime/web-page/page.js +31 -0
- package/src/api.ts +1 -302
- package/src/cli/args.ts +37 -0
- package/src/cli/command.ts +113 -0
- package/src/cli/errors.ts +13 -0
- package/src/cli/help.ts +158 -0
- package/src/cli/index.ts +7 -0
- package/src/cli/output.ts +102 -0
- package/src/cli/run.ts +106 -0
- package/src/commands/{appAndroid.ts → app/android.ts} +454 -43
- package/src/commands/{appDesktop.ts → app/desktop.ts} +64 -33
- package/src/commands/{appDesktopMac.ts → app/desktopMac.ts} +34 -27
- package/src/commands/{appIcon.ts → app/icon.ts} +11 -8
- package/src/commands/{app.ts → app/index.ts} +400 -290
- package/src/commands/{appShared.ts → app/shared.ts} +43 -44
- package/src/commands/{appTemplatesAndroid.ts → app/templates/android.ts} +72 -39
- package/src/commands/{appTemplatesGradlew.ts → app/templates/gradlew.ts} +1 -1
- package/src/commands/{appTemplates.ts → app/templates/ios.ts} +2 -2
- package/src/commands/assets.ts +23 -21
- package/src/commands/clone.ts +48 -51
- package/src/commands/compile.ts +76 -89
- package/src/commands/create.ts +46 -47
- package/src/commands/design/comments.ts +361 -0
- package/src/commands/design/context.ts +101 -0
- package/src/commands/design/index.ts +391 -0
- package/src/commands/design/snapshot.ts +134 -0
- package/src/commands/{designTemplates.ts → design/templates.ts} +4 -3
- package/src/commands/desktop.ts +94 -82
- package/src/commands/dev.ts +260 -182
- package/src/commands/diff.ts +39 -51
- package/src/commands/index.ts +64 -0
- package/src/commands/{init.ts → init/index.ts} +195 -191
- package/src/commands/{projectTemplates.ts → init/templates.ts} +64 -21
- package/src/commands/install.ts +80 -67
- package/src/commands/lightmap.ts +543 -252
- package/src/commands/link.ts +87 -94
- package/src/commands/login.ts +25 -23
- package/src/commands/navmesh.ts +169 -139
- package/src/commands/plugin.ts +46 -0
- package/src/commands/pn.ts +201 -244
- package/src/commands/pull.ts +49 -56
- package/src/commands/push.ts +48 -54
- package/src/commands/render.ts +176 -111
- package/src/commands/scene.ts +63 -55
- package/src/commands/serve.ts +58 -0
- package/src/commands/{shaders.ts → shaders/index.ts} +61 -42
- package/src/commands/{shadersNew.ts → shaders/new.ts} +3 -3
- package/src/commands/shared.ts +79 -0
- package/src/commands/status.ts +22 -26
- package/src/commands/test.ts +94 -63
- package/src/commands/thumbs.ts +185 -175
- package/src/commands/update/index.ts +226 -0
- package/src/commands/{types.ts → update/types.ts} +31 -22
- package/src/compile/collect.ts +5 -5
- package/src/compile/collectLocal.ts +3 -3
- package/src/compile/designCompile.ts +4 -4
- package/src/compile/headlessBundle.ts +16 -12
- package/src/compile/nativeStack.ts +1 -1
- package/src/compile/projectCompile.ts +12 -4
- package/src/compile/sceneCompile.ts +14 -26
- package/src/compile/screenEntry.ts +123 -127
- package/src/compile/shaders.ts +3 -3
- package/src/{lecodes-3d-editor.d.ts → declarations/lecodes-3d-editor.d.ts} +4 -0
- package/src/{lecodes-assets.d.ts → declarations/lecodes-assets.d.ts} +1 -1
- package/src/{lecodes-renderer.d.ts → declarations/lecodes-headless.d.ts} +3 -3
- package/src/dev/androidDev.ts +1 -1
- package/src/dev/clientTemplates.ts +18 -14
- package/src/dev/devServer.ts +78 -41
- package/src/dev/iosDev.ts +180 -0
- package/src/dev/webRunner.ts +83 -15
- package/src/{cmgenTool.ts → hosts/cmgenTool.ts} +2 -2
- package/src/{desktopRenderer.ts → hosts/desktopRenderer.ts} +104 -32
- package/src/{desktopScript.ts → hosts/desktopScript.ts} +151 -36
- package/src/{distRoot.ts → hosts/distRoot.ts} +9 -5
- package/src/{matcTool.ts → hosts/matcTool.ts} +2 -2
- package/src/{peerInstall.ts → hosts/peerInstall.ts} +7 -7
- package/src/{peers.ts → hosts/peers.ts} +2 -2
- package/src/{releases.ts → hosts/releases.ts} +1 -1
- package/src/index.ts +35 -480
- package/src/platform/api.ts +302 -0
- package/src/{browserAuth.ts → platform/browserAuth.ts} +1 -1
- package/src/{config.ts → platform/config.ts} +1 -1
- package/src/{serverDiff.ts → platform/serverDiff.ts} +3 -3
- package/src/plugin/contract.ts +438 -0
- package/src/plugin/emitKotlin.ts +357 -0
- package/src/plugin/emitSdk.ts +259 -0
- package/src/plugin/emitSwift.ts +336 -0
- package/src/plugin/emitWeb.ts +383 -0
- package/src/plugin/generate.ts +157 -0
- package/src/plugin/lines.ts +28 -0
- package/src/plugin/lower.ts +231 -0
- package/src/plugin/manifest.ts +192 -0
- package/src/{projectEnv.ts → project/env.ts} +33 -2
- package/src/{ignore.ts → project/ignore.ts} +164 -163
- package/src/{localFiles.ts → project/localFiles.ts} +1 -1
- package/src/{manifest.ts → project/manifest.ts} +1 -1
- package/src/{project.ts → project/materialize.ts} +2 -2
- package/src/project/paths.ts +20 -0
- package/src/{textDiff.ts → project/textDiff.ts} +1 -1
- package/src/{types.ts → project/types.ts} +0 -0
- package/runtime/materials/lightmap-baked-lite.mat +0 -175
- package/runtime/materials/lightmap-baked.mat +0 -176
- package/runtime/scene-harness.json +0 -1
- package/runtime/web/assets/__vite-browser-external-BIHI7g3E.js +0 -1
- package/runtime/web/assets/basis-C64VHDVD.js +0 -1
- package/runtime/web/assets/basis_transcoder-VXdx5NbI.wasm +0 -0
- package/runtime/web/assets/createViewerLite-Ct_PZdof.js +0 -852
- package/runtime/web/assets/draco-BiISTFcR.js +0 -118
- package/runtime/web/assets/draco_decoder-DsQ12WqX.wasm +0 -0
- package/runtime/web/assets/index-BMt7AnC5.js +0 -2
- package/runtime/web/assets/mapViewImpl-B2JcES8l.js +0 -810
- package/runtime/web/assets/maplibre-gl-worker-CJfwIrte.js +0 -8
- package/runtime/web/assets/worker-Caf-yYEI.js +0 -2
- package/runtime/web/embed.html +0 -32
- package/runtime/web/embed.js +0 -171
- package/src/commands/design.ts +0 -846
- package/src/commands/update.ts +0 -211
- package/src/util.ts +0 -146
- /package/src/{lecodes-design.d.ts → declarations/lecodes-design.d.ts} +0 -0
- /package/src/{qrcode-terminal.d.ts → declarations/qrcode-terminal.d.ts} +0 -0
- /package/src/{designMeta.ts → project/designMeta.ts} +0 -0
package/src/commands/desktop.ts
CHANGED
|
@@ -1,26 +1,19 @@
|
|
|
1
1
|
import { basename } from "node:path"
|
|
2
|
-
import { CliError,
|
|
3
|
-
import { findProjectRoot } from "../manifest"
|
|
4
|
-
import { buildBundle } from "./compile"
|
|
5
|
-
import { assertRendererSupportsBundle, desktopPluginLibraries, readAppConfigAt, resolveDesktopRenderer } from "./appShared"
|
|
6
|
-
import { buildDesktop } from "./appDesktop"
|
|
2
|
+
import { CliError, bool, c, defineCommand, log, note, num, str } from "../cli"
|
|
7
3
|
import {
|
|
8
|
-
DESKTOP_RENDERER_VERSION,
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
updateDesktop,
|
|
16
|
-
} from "../desktopRenderer"
|
|
4
|
+
DESKTOP_RENDERER_VERSION, fetchDesktopManifest, findMacHostExe, installedDesktopVersions, runDesktopApp,
|
|
5
|
+
selectedDesktopVersion, semverNewer, updateDesktop,
|
|
6
|
+
} from "../hosts/desktopRenderer"
|
|
7
|
+
import { desktopBuild } from "./app/desktop"
|
|
8
|
+
import { desktopPluginLibraries, readAppConfigAt, resolveDesktopRenderer } from "./app/shared"
|
|
9
|
+
import { buildBundle } from "./compile"
|
|
10
|
+
import { bundleFlags, bundleOptions, localProject } from "./shared"
|
|
17
11
|
|
|
18
12
|
/*
|
|
19
|
-
* `lecodes desktop` —
|
|
13
|
+
* `lecodes desktop` — the desktop target, the host `lecodes render --desktop` uses too.
|
|
20
14
|
* (no args) status: the version renders use, what's cached, what's published
|
|
21
15
|
* run compile the current project and open it in a real desktop window
|
|
22
|
-
* build stage a portable app folder (the same
|
|
23
|
-
* which stays for symmetry with the ios/android shells)
|
|
16
|
+
* build stage a portable app folder (the same as `lecodes app build desktop`)
|
|
24
17
|
* update move the host to the newest published release (downloads it if needed)
|
|
25
18
|
* The binary cache lives in ~/.lecodes/renderer/; LECODES_DESKTOP_EXE overrides everything.
|
|
26
19
|
*/
|
|
@@ -32,9 +25,7 @@ export const resolveScale = (flag: string | undefined, cfg: number | "fit" | "sy
|
|
|
32
25
|
if (raw === undefined || raw === "system") return undefined
|
|
33
26
|
if (raw === "fit") return "fit"
|
|
34
27
|
const n = Number(raw)
|
|
35
|
-
if (!Number.isFinite(n) || n < 0.5 || n > 4) {
|
|
36
|
-
throw new CliError(`scale must be a number 0.5..4, "fit" or "system" (got "${raw}")`)
|
|
37
|
-
}
|
|
28
|
+
if (!Number.isFinite(n) || n < 0.5 || n > 4) throw new CliError(`scale must be a number 0.5..4, "fit" or "system" (got "${raw}")`)
|
|
38
29
|
return n
|
|
39
30
|
}
|
|
40
31
|
|
|
@@ -46,55 +37,75 @@ export const resolveRenderScale = (flag: string | undefined, cfg: number | undef
|
|
|
46
37
|
return n
|
|
47
38
|
}
|
|
48
39
|
|
|
49
|
-
const run =
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
//
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
:
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
40
|
+
const run = defineCommand({
|
|
41
|
+
name: "run",
|
|
42
|
+
summary: "Compile the current project and open it in a desktop window",
|
|
43
|
+
description: "Window size / min size / title default from app.json's desktop block; asset() resources load from the working tree. Multiplayer: --server starts the host as a dedicated server, --connect joins one — both only set Net.launch (the app decides).",
|
|
44
|
+
flags: {
|
|
45
|
+
width: num("window width (logical px)"),
|
|
46
|
+
height: num("window height (logical px)"),
|
|
47
|
+
title: str("window title", { value: "<s>" }),
|
|
48
|
+
fullscreen: bool("force fullscreen (over app.json)"),
|
|
49
|
+
windowed: bool("force windowed (over app.json)"),
|
|
50
|
+
scale: str('display scale: 0.5..4, "fit" (size a 1080p-designed app to the monitor), or "system"', { value: "<n|fit>" }),
|
|
51
|
+
"render-scale": str("3D render resolution 0.25..1 (over app.json desktop.renderScale)", { value: "<n>" }),
|
|
52
|
+
renderer: str("host + shader variant: gl | vulkan (default: app.json desktop.renderer, else gl)", { value: "<gl|vulkan>" }),
|
|
53
|
+
fps: bool("draw the host's frame counter in the corner (composited fps + the 3D fps when they diverge)"),
|
|
54
|
+
perf: bool("the host's profiler: a [perf] line a second (GPU frame time, CPU split, what the camera sees) + a second overlay row; implies --fps"),
|
|
55
|
+
server: bool("launch as a multiplayer server"),
|
|
56
|
+
port: num("(--server) listen port"),
|
|
57
|
+
"max-clients": num("(--server) client cap"),
|
|
58
|
+
connect: str("join a server as a client", { value: "<ip:port>" }),
|
|
59
|
+
...bundleFlags,
|
|
60
|
+
},
|
|
61
|
+
examples: ["lecodes desktop run", "lecodes desktop run --scale fit --fps", "lecodes desktop run --perf", "lecodes desktop run --server --port 7777"],
|
|
62
|
+
run: async ({ flags, raw }) => {
|
|
63
|
+
// Window defaults come from app.json's desktop block (flags win); standalone projects
|
|
64
|
+
// without an app.json keep the host's built-in 1280×720.
|
|
65
|
+
const { root } = localProject()
|
|
66
|
+
const appCfg = readAppConfigAt(root)
|
|
67
|
+
const win = appCfg?.desktop?.window
|
|
68
|
+
// ONE renderer decision per run: it picks the host binary AND which .filamat gets staged beside
|
|
69
|
+
// the bundle. Reading the config twice is how a Vulkan exe ends up next to an OpenGL shader.
|
|
70
|
+
const renderer = resolveDesktopRenderer(root, flags.renderer)
|
|
71
|
+
const { js, resources } = await buildBundle(bundleOptions(flags), { localAssets: true, desktopRenderer: renderer })
|
|
72
|
+
// Native plugins: the project's plugins/ dir + declared plugin libraries, scanned by the host.
|
|
73
|
+
const { dirs: pluginDirs, files: pluginFiles } = desktopPluginLibraries(root)
|
|
74
|
+
if (pluginFiles.length > 0) note(`Native plugins: ${pluginFiles.map((f) => basename(f)).join(", ")}`)
|
|
75
|
+
note(`Launching LeCodes Desktop${renderer === "vulkan" ? " (Vulkan)" : ""}… (close the window to return)`)
|
|
76
|
+
await runDesktopApp(js, resources, {
|
|
77
|
+
renderer,
|
|
78
|
+
pluginDirs,
|
|
79
|
+
width: flags.width || win?.width,
|
|
80
|
+
height: flags.height || win?.height,
|
|
81
|
+
minWidth: win?.minWidth,
|
|
82
|
+
minHeight: win?.minHeight,
|
|
83
|
+
resizable: win?.resizable,
|
|
84
|
+
title: flags.title ?? win?.title ?? appCfg?.name,
|
|
85
|
+
storageScope: appCfg?.name,
|
|
86
|
+
// --fullscreen forces it on; --windowed forces it off (over app.json); else the config decides.
|
|
87
|
+
fullscreen: flags.fullscreen ? true : flags.windowed ? false : win?.fullscreen,
|
|
88
|
+
scale: resolveScale(flags.scale, win?.scale),
|
|
89
|
+
// 3D render resolution: --render-scale wins over app.json desktop.renderScale; the cap comes
|
|
90
|
+
// from app.json only. Both are desktop-level (the machine/app), not window-level.
|
|
91
|
+
renderScale: resolveRenderScale(flags["render-scale"], appCfg?.desktop?.renderScale),
|
|
92
|
+
maxRenderSize: appCfg?.desktop?.maxRenderSize,
|
|
93
|
+
// Frame-rate cap (app.json only — like renderScale it is a property of the app, not of a run).
|
|
94
|
+
frameRate: appCfg?.desktop?.frameRate,
|
|
95
|
+
mouseEmulateTouch: appCfg?.desktop?.mouseEmulateTouch,
|
|
96
|
+
virtualKeyboard: appCfg?.desktop?.virtualKeyboard,
|
|
97
|
+
// --fps: the host's own corner counter. A flag and not app.json on purpose — it is something you
|
|
98
|
+
// switch on while looking at a frame, not a property of the app.
|
|
99
|
+
fps: flags.fps,
|
|
100
|
+
perf: flags.perf,
|
|
101
|
+
net: flags.server
|
|
102
|
+
? { role: "server", port: flags.port, maxClients: flags["max-clients"] }
|
|
103
|
+
: flags.connect ? { role: "client", address: flags.connect } : undefined,
|
|
104
|
+
})
|
|
105
|
+
},
|
|
106
|
+
})
|
|
96
107
|
|
|
97
|
-
const status = async () => {
|
|
108
|
+
const status = async (): Promise<void> => {
|
|
98
109
|
const selected = selectedDesktopVersion()
|
|
99
110
|
const installed = installedDesktopVersions()
|
|
100
111
|
log(`renders with ${selected}${installed.includes(selected) ? "" : c.dim(" (not downloaded yet — fetched on first render)")}`)
|
|
@@ -103,28 +114,29 @@ const status = async () => {
|
|
|
103
114
|
if (process.env.LECODES_DESKTOP_EXE) log(`override LECODES_DESKTOP_EXE=${process.env.LECODES_DESKTOP_EXE}`)
|
|
104
115
|
if (process.platform === "darwin") {
|
|
105
116
|
// The cache is what runs/builds use; a hand-installed app only steps in when the manifest is unreachable.
|
|
106
|
-
const
|
|
107
|
-
log(`installed ${
|
|
117
|
+
const mac = findMacHostExe()
|
|
118
|
+
log(`installed ${mac ?? c.dim("none")} ${c.dim("(offline fallback only)")}`)
|
|
108
119
|
}
|
|
109
120
|
try {
|
|
110
121
|
const { latest } = await fetchDesktopManifest()
|
|
111
122
|
const hint = semverNewer(selected, latest) > 0
|
|
112
123
|
? c.yellow("(newer — run `lecodes desktop update`)")
|
|
113
|
-
: latest === selected
|
|
114
|
-
? c.dim("(up to date)")
|
|
115
|
-
: c.dim("(older than the CLI's minimum — this desktop release isn't published yet)")
|
|
124
|
+
: latest === selected ? c.dim("(up to date)") : c.dim("(older than the CLI's minimum — this desktop release isn't published yet)")
|
|
116
125
|
log(`published ${latest} ${hint}`)
|
|
117
126
|
} catch {
|
|
118
127
|
log(`published ${c.dim("unknown (couldn't reach the release manifest)")}`)
|
|
119
128
|
}
|
|
120
129
|
}
|
|
121
130
|
|
|
122
|
-
export
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
}
|
|
131
|
+
export default defineCommand({
|
|
132
|
+
name: "desktop",
|
|
133
|
+
summary: "The desktop host: status, run the project in a window, build a portable app, update",
|
|
134
|
+
description: "Bare `lecodes desktop` prints the version status: the host renders use, what is cached in ~/.lecodes/renderer, the newest published one. LECODES_DESKTOP_EXE points every desktop command at a local host build instead.",
|
|
135
|
+
commands: [
|
|
136
|
+
run,
|
|
137
|
+
// `buildDesktop` is shared with `lecodes app build desktop`; its flags live there.
|
|
138
|
+
desktopBuild,
|
|
139
|
+
defineCommand({ name: "update", summary: "Move the host to the newest published release", run: () => updateDesktop() }),
|
|
140
|
+
],
|
|
141
|
+
run: () => status(),
|
|
142
|
+
})
|