@oxprotocol/cli 0.1.6 → 0.1.8
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/dist/cli.js +2 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/create.d.ts.map +1 -1
- package/dist/commands/create.js +7 -0
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +102 -9
- package/dist/commands/dev.js.map +1 -1
- package/dist/lib/ide-launch.d.ts +7 -0
- package/dist/lib/ide-launch.d.ts.map +1 -0
- package/dist/lib/ide-launch.js +159 -0
- package/dist/lib/ide-launch.js.map +1 -0
- package/package.json +5 -4
- package/templates/hello-html/.oxpignore +17 -0
- package/templates/hello-html/README.md +29 -7
- package/templates/hello-html/build.mjs +95 -0
- package/templates/hello-html/oxp.json +3 -2
- package/templates/hello-html/package.json +21 -0
- package/templates/hello-html/src/App.tsx +54 -0
- package/templates/hello-html/src/main.tsx +7 -0
- package/templates/hello-html/src/styles.css +146 -0
- package/templates/hello-html/tsconfig.json +21 -0
- package/vendor/oxp-vscode.json +5 -0
- package/vendor/oxp-vscode.vsix +0 -0
- package/templates/hello-html/ui/index.html +0 -43
package/dist/cli.js
CHANGED
|
@@ -43,7 +43,8 @@ const HELP = `oxp ${VERSION} — Open eXtensions Protocol
|
|
|
43
43
|
|
|
44
44
|
Usage:
|
|
45
45
|
oxp create [-t TPL] <name> Scaffold a new extension in ./<name>
|
|
46
|
-
Templates: hello-html (default),
|
|
46
|
+
Templates: hello-html (React+TS, default),
|
|
47
|
+
hello-code, hello-tree, hello-rust
|
|
47
48
|
oxp dev [dir] Watch + repack + serve over ws/http (default port 7373)
|
|
48
49
|
oxp pack [dir] Build dist/<slug>-<version>.oxp from <dir> (default: cwd)
|
|
49
50
|
oxp login Sign in (email + password in terminal)
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAChD,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,SAAS,WAAW;IAClB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,gCAAgC;QAChC,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CACpB,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAC/B,CAAC;QAC1B,OAAO,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;AAE9B,MAAM,IAAI,GAAG,OAAO,OAAO
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AA0BA;;;GAGG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AA0BA;;;GAGG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CA8G5D"}
|
package/dist/commands/create.js
CHANGED
|
@@ -106,8 +106,10 @@ export async function create(args) {
|
|
|
106
106
|
info(` oxp pack && oxp publish # ship it`);
|
|
107
107
|
}
|
|
108
108
|
else {
|
|
109
|
+
// hello-html: React + TypeScript + esbuild
|
|
109
110
|
info(`Next steps:`);
|
|
110
111
|
info(` cd ${name}`);
|
|
112
|
+
info(` npm install # one-time`);
|
|
111
113
|
info(` oxp dev # live reload in IDE`);
|
|
112
114
|
info(` oxp pack && oxp publish # ship it`);
|
|
113
115
|
}
|
|
@@ -182,12 +184,17 @@ const TEXT_EXT = new Set([
|
|
|
182
184
|
".md",
|
|
183
185
|
".txt",
|
|
184
186
|
".js",
|
|
187
|
+
".mjs",
|
|
188
|
+
".cjs",
|
|
185
189
|
".ts",
|
|
190
|
+
".tsx",
|
|
191
|
+
".jsx",
|
|
186
192
|
".css",
|
|
187
193
|
".toml",
|
|
188
194
|
".rs",
|
|
189
195
|
".wit",
|
|
190
196
|
".gitignore",
|
|
197
|
+
".oxpignore",
|
|
191
198
|
]);
|
|
192
199
|
async function copyTree(src, dest, transform) {
|
|
193
200
|
await fs.mkdir(dest, { recursive: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAEtE;;;;;;;;;;GAUG;AACH,MAAM,SAAS,GAAG;IAChB,YAAY;IACZ,YAAY;IACZ,YAAY;IACZ,YAAY;CACJ,CAAC;AAEX,MAAM,gBAAgB,GAAiB,YAAY,CAAC;AAEpD;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAc;IACzC,IAAI,QAAQ,GAAiB,gBAAgB,CAAC;IAC9C,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACnB,IAAI,CAAC,KAAK,YAAY,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACrC,MAAM,CAAC,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,CAAC;gBAAE,IAAI,CAAC,+CAA+C,CAAC,CAAC;YAC9D,cAAc,CAAC,CAAC,CAAC,CAAC;YAClB,QAAQ,GAAG,CAAC,CAAC;QACf,CAAC;aAAM,IAAI,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,EAAE,CAAC;YACvC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YACxC,cAAc,CAAC,CAAC,CAAC,CAAC;YAClB,QAAQ,GAAG,CAAC,CAAC;QACf,CAAC;aAAM,IAAI,CAAC,KAAK,kBAAkB,EAAE,CAAC;YACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;YAClD,OAAO,CAAC,CAAC;QACX,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,CAAC,IAAI;QACP,IAAI,CACF,mDAAmD;YACjD,gBAAgB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACzC,CAAC;IAEJ,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAChC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,IAAI,CACF,IAAI,IAAI,gEAAgE,CACzE,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IAC1C,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC,gBAAgB,IAAI,kBAAkB,CAAC,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;IACT,CAAC;IAED,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5C,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACzD,IAAI,CAAC,WAAW;QAAE,IAAI,CAAC,4BAA4B,QAAQ,GAAG,CAAC,CAAC;IAEhE,MAAM,SAAS,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC3C,MAAM,WAAW,GAAG,IAAI;SACrB,KAAK,CAAC,SAAS,CAAC;SAChB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAE,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC5C,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,0DAA0D;IAC1D,MAAM,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IAChD,qEAAqE;IACrE,oEAAoE;IACpE,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;IAE7B,MAAM,QAAQ,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CACxC,GAAG;SACA,UAAU,CAAC,eAAe,EAAE,SAAS,CAAC;SACtC,UAAU,CAAC,sBAAsB,EAAE,eAAe,CAAC;SACnD,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC;SAC5B,UAAU,CAAC,kBAAkB,EAAE,WAAW,CAAC;SAC3C,UAAU,CAAC,aAAa,EAAE,MAAM,CAAC,CACrC,CAAC;IAEF,IAAI,CAAC,aAAa,IAAI,oBAAoB,QAAQ,GAAG,CAAC,CAAC;IACvD,IAAI,CAAC,iBAAiB,SAAS,EAAE,CAAC,CAAC;IACnC,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC;IAC7B,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;QAC9B,IAAI,CAAC,aAAa,CAAC,CAAC;QACpB,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QACrB,IAAI,CACF,+EAA+E,CAChF,CAAC;QACF,IAAI,CACF,qFAAqF,CACtF,CAAC;QACF,IAAI,CACF,8EAA8E,CAC/E,CAAC;IACJ,CAAC;SAAM,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;QACrC,IAAI,CAAC,aAAa,CAAC,CAAC;QACpB,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QACrB,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACvB,IAAI,CACF,yFAAyF,CAC1F,CAAC;QACF,IAAI,CACF,8EAA8E,CAC/E,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,2CAA2C;QAC3C,IAAI,CAAC,aAAa,CAAC,CAAC;QACpB,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC;QACrB,IAAI,CACF,+EAA+E,CAChF,CAAC;QACF,IAAI,CACF,yFAAyF,CAC1F,CAAC;QACF,IAAI,CACF,8EAA8E,CAC/E,CAAC;IACJ,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;;;;;GASG;AACH,KAAK,UAAU,gBAAgB;IAC7B,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,KAAK,CAAC;SACjE,WAAW,EAAE;SACb,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;IAE/B,MAAM,KAAK,GAAG,MAAM,eAAe,EAAE,CAAC;IACtC,IAAI,CAAC,KAAK;QAAE,OAAO,QAAQ,CAAC;IAE5B,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,KAAK,CAAC,CAAC;QAC1D,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,WAAW,EAAE,qBAAqB,EAAE;YAC7D,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,KAAK,EAAE,EAAE;YAC7C,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;QAEtC,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,QAAQ,CAAC;QAC7B,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA4C,CAAC;QAC3E,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC,MAAM,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,+CAA+C;IACjD,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,cAAc,CAAC,CAAS;IAC/B,IAAI,CAAE,SAA+B,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,IAAI,CAAC,qBAAqB,CAAC,iBAAiB,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACtE,CAAC;AACH,CAAC;AAED,KAAK,UAAU,cAAc,CAC3B,QAAgB,EAChB,QAAgB;IAEhB,IAAI,GAAG,GAAG,QAAQ,CAAC;IACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACzB,MAAM,UAAU,GAAG;YACjB,IAAI,CAAC,GAAG,EAAE,WAAW,EAAE,QAAQ,CAAC;YAChC,IAAI,CAAC,GAAG,EAAE,wBAAwB,EAAE,QAAQ,CAAC;SAC9C,CAAC;QACF,IAAI,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC9B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,+BAA+B,CAAC,CAAC,CAAC;QAC9D,CAAC;QACD,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;gBAC7C,OAAO,SAAS,CAAC;YACnB,CAAC;YAAC,MAAM,CAAC;gBACP,eAAe;YACjB,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC;IACvB,OAAO;IACP,OAAO;IACP,KAAK;IACL,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,KAAK;IACL,MAAM;IACN,MAAM;IACN,MAAM;IACN,OAAO;IACP,KAAK;IACL,MAAM;IACN,YAAY;IACZ,YAAY;CACb,CAAC,CAAC;AAEH,KAAK,UAAU,QAAQ,CACrB,GAAW,EACX,IAAY,EACZ,SAAgC;IAEhC,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QACnE,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACjC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,QAAQ,CAAC,EAAE,EAAE,EAAE,EAAE,SAAS,CAAC,CAAC;QACpC,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;YAC1B,MAAM,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;YAC1D,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACtB,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;gBAC1C,MAAM,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;YACzC,CAAC;iBAAM,CAAC;gBACN,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dev.d.ts","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"AAsCA,wBAAsB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAuMzD"}
|
package/dist/commands/dev.js
CHANGED
|
@@ -1,12 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `oxp dev [dir]` — watch a project, re-pack on changes, and serve the bundle
|
|
3
|
+
* over WebSocket + HTTP so a host can hot-load the extension without going
|
|
4
|
+
* through publish.
|
|
5
|
+
*
|
|
6
|
+
* Hosts that opt-in to dev mode (hosts/vscode/src/dev.ts, hosts/piye/src/dev.ts)
|
|
7
|
+
* connect to:
|
|
8
|
+
*
|
|
9
|
+
* ws://localhost:<port>/dev → JSON {kind:"reload", manifest, digest, bundle:base64}
|
|
10
|
+
* GET http://localhost:<port>/manifest → oxp.json
|
|
11
|
+
* GET http://localhost:<port>/bundle → raw .oxp bytes
|
|
12
|
+
* GET http://localhost:<port>/info → {dev:true, manifest, digest, bundleSize}
|
|
13
|
+
*
|
|
14
|
+
* IMPORTANT: dev mode SKIPS Ed25519 signing for speed. The host displays a
|
|
15
|
+
* loud "DEV: signature bypass" badge while connected. Production publish flow
|
|
16
|
+
* is unchanged.
|
|
17
|
+
*/
|
|
18
|
+
import { promises as fs } from "node:fs";
|
|
19
|
+
import { spawn } from "node:child_process";
|
|
1
20
|
import { createServer, } from "node:http";
|
|
2
|
-
import { resolve } from "node:path";
|
|
21
|
+
import { join, resolve } from "node:path";
|
|
3
22
|
import chokidar from "chokidar";
|
|
4
23
|
import { WebSocketServer } from "ws";
|
|
5
24
|
import { packBundle } from "@oxprotocol/bundle";
|
|
6
25
|
import { findProjectRoot, fail, info } from "../util.js";
|
|
26
|
+
import { launchIdeForDev } from "../lib/ide-launch.js";
|
|
7
27
|
export async function dev(args) {
|
|
8
|
-
// Parse args: [--port N] [dir]
|
|
28
|
+
// Parse args: [--port N] [--no-ide] [dir]
|
|
9
29
|
let port = Number(process.env.OXP_DEV_PORT ?? 7373);
|
|
30
|
+
let openIde = process.env.OXP_DEV_NO_IDE !== "1";
|
|
10
31
|
const positional = [];
|
|
11
32
|
for (let i = 0; i < args.length; i++) {
|
|
12
33
|
const a = args[i];
|
|
@@ -19,6 +40,9 @@ export async function dev(args) {
|
|
|
19
40
|
else if (a.startsWith("--port=")) {
|
|
20
41
|
port = Number(a.slice("--port=".length));
|
|
21
42
|
}
|
|
43
|
+
else if (a === "--no-ide") {
|
|
44
|
+
openIde = false;
|
|
45
|
+
}
|
|
22
46
|
else {
|
|
23
47
|
positional.push(a);
|
|
24
48
|
}
|
|
@@ -42,6 +66,18 @@ export async function dev(args) {
|
|
|
42
66
|
building = true;
|
|
43
67
|
try {
|
|
44
68
|
const t0 = Date.now();
|
|
69
|
+
// Run the manifest's build hook (e.g. `npm run build`) before
|
|
70
|
+
// packing, so React/TS templates that compile to ui/ get fresh
|
|
71
|
+
// output. Skipped if no scripts.build is set. Mirrors `oxp pack`.
|
|
72
|
+
const buildCmd = await readBuildScript(root);
|
|
73
|
+
if (buildCmd) {
|
|
74
|
+
const code = await runShell(buildCmd, root);
|
|
75
|
+
if (code !== 0) {
|
|
76
|
+
info(`✖ scripts.build exited ${code} — keeping previous bundle`);
|
|
77
|
+
broadcast({ kind: "error", message: `build hook exit ${code}` });
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
45
81
|
const r = await packBundle(root, {});
|
|
46
82
|
state = {
|
|
47
83
|
manifest: r.manifest,
|
|
@@ -104,9 +140,21 @@ export async function dev(args) {
|
|
|
104
140
|
ws.send(json);
|
|
105
141
|
}
|
|
106
142
|
}
|
|
143
|
+
// If the project has a `scripts.build` hook the `ui/` directory is
|
|
144
|
+
// generated output (see hello-html template). Watching it would cause
|
|
145
|
+
// an infinite rebuild loop. We watch `src/` and other source dirs
|
|
146
|
+
// instead — chokidar still picks them up via the root walk.
|
|
147
|
+
const hasBuildHook = (await readBuildScript(root)) != null;
|
|
107
148
|
// ── chokidar watch ───────────────────────────────────────────────────────
|
|
108
149
|
const watcher = chokidar.watch(root, {
|
|
109
|
-
ignored: (p) => /(^|[\\/])(\.git|node_modules|dist\/.*\.oxp|\.next|\.oxp-cache)([\\/]|$)/.test(p)
|
|
150
|
+
ignored: (p) => /(^|[\\/])(\.git|node_modules|dist\/.*\.oxp|\.next|\.oxp-cache)([\\/]|$)/.test(p) ||
|
|
151
|
+
// Generated build outputs — would cause infinite rebuild loops.
|
|
152
|
+
// When a build hook exists, ignore the entire `ui/` tree (it's
|
|
153
|
+
// 100% generated). Otherwise only ignore obvious bundler artefacts
|
|
154
|
+
// so authors who hand-write `ui/index.html` still get hot reload.
|
|
155
|
+
(hasBuildHook
|
|
156
|
+
? /(^|[\\/])ui([\\/]|$)/.test(p)
|
|
157
|
+
: /[\\/]ui[\\/](main|index)\.(js|css|html)(\.map)?$/.test(p)),
|
|
110
158
|
ignoreInitial: true,
|
|
111
159
|
});
|
|
112
160
|
let debounce = null;
|
|
@@ -120,13 +168,31 @@ export async function dev(args) {
|
|
|
120
168
|
// ── Initial build + start ────────────────────────────────────────────────
|
|
121
169
|
await rebuild("initial");
|
|
122
170
|
await new Promise((r) => http.listen(port, "127.0.0.1", r));
|
|
171
|
+
// Machine-readable line so IDE hosts can auto-detect when we're ready
|
|
172
|
+
// (used by VS Code's "OXP: Start Dev Session" command).
|
|
173
|
+
info(`OXP_DEV_READY port=${port}`);
|
|
123
174
|
info("");
|
|
124
|
-
info("
|
|
125
|
-
info(
|
|
126
|
-
info(
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
175
|
+
info("oxp dev — backend ready. ⚠ DEV mode (signature bypass, do not ship)");
|
|
176
|
+
info(` watching: ${root}`);
|
|
177
|
+
info("");
|
|
178
|
+
if (openIde) {
|
|
179
|
+
const ok = launchIdeForDev(root);
|
|
180
|
+
info("");
|
|
181
|
+
if (ok) {
|
|
182
|
+
info("Your IDE is opening. Click the OXP icon in the activity bar (or press F5)");
|
|
183
|
+
info("to attach the running extension. The UI renders inside the IDE.");
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
info("Render the extension inside your IDE:");
|
|
187
|
+
info(" • VS Code / Cursor: install the OXP host, then run \u201cOXP: Start Dev Session\u201d");
|
|
188
|
+
info(" • JetBrains / Neovim: see hosts/<ide>/README.md");
|
|
189
|
+
info("");
|
|
190
|
+
info("Disable IDE auto-launch with --no-ide (or env OXP_DEV_NO_IDE=1).");
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
else {
|
|
194
|
+
info("IDE auto-launch disabled (--no-ide). Attach manually from your IDE.");
|
|
195
|
+
}
|
|
130
196
|
info("");
|
|
131
197
|
info("Press Ctrl+C to stop.");
|
|
132
198
|
// Keep alive until SIGINT.
|
|
@@ -188,4 +254,31 @@ function send(res, status, body) {
|
|
|
188
254
|
res.setHeader("content-type", "application/json");
|
|
189
255
|
res.end(JSON.stringify(body));
|
|
190
256
|
}
|
|
257
|
+
// ── Build hook helpers (mirror pack.ts) ───────────────────────────────────
|
|
258
|
+
async function readBuildScript(root) {
|
|
259
|
+
try {
|
|
260
|
+
const raw = await fs.readFile(join(root, "oxp.json"), "utf8");
|
|
261
|
+
const m = JSON.parse(raw);
|
|
262
|
+
const cmd = m?.scripts?.build;
|
|
263
|
+
if (typeof cmd === "string" && cmd.trim().length > 0)
|
|
264
|
+
return cmd;
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
/* ignore */
|
|
268
|
+
}
|
|
269
|
+
return null;
|
|
270
|
+
}
|
|
271
|
+
function runShell(cmd, cwd) {
|
|
272
|
+
return new Promise((resolveExit) => {
|
|
273
|
+
info(`▸ ${cmd}`);
|
|
274
|
+
const child = spawn(cmd, {
|
|
275
|
+
cwd,
|
|
276
|
+
shell: true,
|
|
277
|
+
stdio: "inherit",
|
|
278
|
+
env: process.env,
|
|
279
|
+
});
|
|
280
|
+
child.on("exit", (code) => resolveExit(code ?? 1));
|
|
281
|
+
child.on("error", () => resolveExit(1));
|
|
282
|
+
});
|
|
283
|
+
}
|
|
191
284
|
//# sourceMappingURL=dev.js.map
|
package/dist/commands/dev.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dev.js","sourceRoot":"","sources":["../../src/commands/dev.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public entry point. Idempotent: if the host is already installed at the
|
|
3
|
+
* expected version we just open the IDE. Returns true on success, false
|
|
4
|
+
* if no supported IDE was found (caller should print fallback hints).
|
|
5
|
+
*/
|
|
6
|
+
export declare function launchIdeForDev(projectRoot: string): boolean;
|
|
7
|
+
//# sourceMappingURL=ide-launch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ide-launch.d.ts","sourceRoot":"","sources":["../../src/lib/ide-launch.ts"],"names":[],"mappings":"AAoJA;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAiC5D"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-launch a supported IDE with the OXP host extension installed.
|
|
3
|
+
*
|
|
4
|
+
* Goal: a developer running `oxp dev` should not need to know what an
|
|
5
|
+
* "extension host" is. We:
|
|
6
|
+
* 1. Detect a supported IDE (VS Code, Cursor, VS Code Insiders).
|
|
7
|
+
* 2. Make sure the OXP host extension is installed at the version we
|
|
8
|
+
* bundle alongside the CLI (`vendor/oxp-vscode.vsix`).
|
|
9
|
+
* 3. Open the project folder in that IDE so the host's
|
|
10
|
+
* `workspaceContains:oxp.json` activation event fires and the OXP
|
|
11
|
+
* activity-bar view appears.
|
|
12
|
+
*
|
|
13
|
+
* The dev backend is still the CLI; the IDE attaches via WebSocket.
|
|
14
|
+
* No browser, no manual install step.
|
|
15
|
+
*/
|
|
16
|
+
import { spawn, spawnSync as nodeSpawnSync } from "node:child_process";
|
|
17
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
18
|
+
import { dirname, join } from "node:path";
|
|
19
|
+
import { fileURLToPath } from "node:url";
|
|
20
|
+
import { info } from "../util.js";
|
|
21
|
+
const SUPPORTED_IDES = [
|
|
22
|
+
{ name: "Cursor", bin: "cursor" },
|
|
23
|
+
{ name: "VS Code", bin: "code" },
|
|
24
|
+
{ name: "VS Code Insiders", bin: "code-insiders" },
|
|
25
|
+
];
|
|
26
|
+
const HOST_EXTENSION_ID = "oxp.oxp-vscode";
|
|
27
|
+
/**
|
|
28
|
+
* Locate the VSIX shipped inside the CLI npm package
|
|
29
|
+
* (`<cli>/vendor/oxp-vscode.vsix`). When the CLI is run from source the
|
|
30
|
+
* vendor dir lives next to dist/, so we walk up from this module's path.
|
|
31
|
+
*/
|
|
32
|
+
function locateVendoredVsix() {
|
|
33
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
34
|
+
// dist/lib/ide-launch.js → ../../vendor (built)
|
|
35
|
+
// src/lib/ide-launch.ts → ../../vendor (tsx)
|
|
36
|
+
const candidates = [
|
|
37
|
+
join(here, "..", "..", "vendor"),
|
|
38
|
+
join(here, "..", "..", "..", "vendor"),
|
|
39
|
+
];
|
|
40
|
+
for (const dir of candidates) {
|
|
41
|
+
const manifestPath = join(dir, "oxp-vscode.json");
|
|
42
|
+
if (!existsSync(manifestPath))
|
|
43
|
+
continue;
|
|
44
|
+
try {
|
|
45
|
+
const m = JSON.parse(readFileSync(manifestPath, "utf8"));
|
|
46
|
+
const vsix = join(dir, m.vsixFile);
|
|
47
|
+
if (!existsSync(vsix))
|
|
48
|
+
continue;
|
|
49
|
+
return {
|
|
50
|
+
vsixPath: vsix,
|
|
51
|
+
version: m.version,
|
|
52
|
+
extensionId: m.extensionId,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return null;
|
|
60
|
+
}
|
|
61
|
+
function pickIde() {
|
|
62
|
+
for (const ide of SUPPORTED_IDES) {
|
|
63
|
+
if (commandExists(ide.bin))
|
|
64
|
+
return ide;
|
|
65
|
+
}
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
function commandExists(bin) {
|
|
69
|
+
try {
|
|
70
|
+
const r = spawnSync("which", [bin]);
|
|
71
|
+
return r.status === 0;
|
|
72
|
+
}
|
|
73
|
+
catch {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
function spawnSync(cmd, args) {
|
|
78
|
+
const r = nodeSpawnSync(cmd, args, { encoding: "utf8" });
|
|
79
|
+
return {
|
|
80
|
+
status: r.status,
|
|
81
|
+
stdout: r.stdout ?? "",
|
|
82
|
+
stderr: r.stderr ?? "",
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function isHostInstalled(ide, expectedVersion) {
|
|
86
|
+
const r = spawnSync(ide.bin, ["--list-extensions", "--show-versions"]);
|
|
87
|
+
if (r.status !== 0)
|
|
88
|
+
return false;
|
|
89
|
+
const wanted = `${HOST_EXTENSION_ID}@${expectedVersion}`.toLowerCase();
|
|
90
|
+
return r.stdout
|
|
91
|
+
.split(/\r?\n/)
|
|
92
|
+
.some((l) => l.trim().toLowerCase() === wanted);
|
|
93
|
+
}
|
|
94
|
+
function installHost(ide, vsixPath) {
|
|
95
|
+
info(`▸ installing OXP host into ${ide.name}…`);
|
|
96
|
+
const r = spawnSync(ide.bin, [
|
|
97
|
+
"--install-extension",
|
|
98
|
+
vsixPath,
|
|
99
|
+
"--force",
|
|
100
|
+
]);
|
|
101
|
+
if (r.status !== 0) {
|
|
102
|
+
info(`✖ failed to install host: ${r.stderr.trim() || "exit " + r.status}`);
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
info(" ✓ host installed");
|
|
106
|
+
return true;
|
|
107
|
+
}
|
|
108
|
+
function openInIde(ide, projectRoot) {
|
|
109
|
+
// Detached so the IDE keeps running after `oxp dev` exits, and also so
|
|
110
|
+
// closing the IDE window doesn't kill the backend.
|
|
111
|
+
try {
|
|
112
|
+
const child = spawn(ide.bin, [projectRoot], {
|
|
113
|
+
detached: true,
|
|
114
|
+
stdio: "ignore",
|
|
115
|
+
});
|
|
116
|
+
child.unref();
|
|
117
|
+
return true;
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return false;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Public entry point. Idempotent: if the host is already installed at the
|
|
125
|
+
* expected version we just open the IDE. Returns true on success, false
|
|
126
|
+
* if no supported IDE was found (caller should print fallback hints).
|
|
127
|
+
*/
|
|
128
|
+
export function launchIdeForDev(projectRoot) {
|
|
129
|
+
const vsix = locateVendoredVsix();
|
|
130
|
+
if (!vsix) {
|
|
131
|
+
info("ℹ︎ no bundled host VSIX found — skipping IDE auto-launch");
|
|
132
|
+
return false;
|
|
133
|
+
}
|
|
134
|
+
const ide = pickIde();
|
|
135
|
+
if (!ide) {
|
|
136
|
+
info("");
|
|
137
|
+
info("ℹ︎ No supported IDE found on your PATH (looked for: cursor, code, code-insiders).");
|
|
138
|
+
info(" Install the 'code' shell command from VS Code:");
|
|
139
|
+
info(" Command Palette → Shell Command: Install 'code' command in PATH");
|
|
140
|
+
info(" Or install Cursor: https://cursor.sh");
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
info(`▸ detected ${ide.name} on PATH`);
|
|
144
|
+
if (!isHostInstalled(ide, vsix.version)) {
|
|
145
|
+
if (!installHost(ide, vsix.vsixPath)) {
|
|
146
|
+
info(" (continuing — backend is still running, install the host manually)");
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
info(` ✓ OXP host ${vsix.version} already installed`);
|
|
151
|
+
}
|
|
152
|
+
info(`▸ opening ${projectRoot} in ${ide.name}…`);
|
|
153
|
+
if (!openInIde(ide, projectRoot)) {
|
|
154
|
+
info(`✖ failed to spawn ${ide.bin}`);
|
|
155
|
+
return false;
|
|
156
|
+
}
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=ide-launch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ide-launch.js","sourceRoot":"","sources":["../../src/lib/ide-launch.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@oxprotocol/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.8",
|
|
4
4
|
"description": "Command-line tool for the Open eXtensions Protocol.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
"files": [
|
|
20
20
|
"dist",
|
|
21
21
|
"templates",
|
|
22
|
+
"vendor",
|
|
22
23
|
"README.md"
|
|
23
24
|
],
|
|
24
25
|
"publishConfig": {
|
|
@@ -27,11 +28,11 @@
|
|
|
27
28
|
"dependencies": {
|
|
28
29
|
"chokidar": "^4.0.3",
|
|
29
30
|
"ws": "^8.18.0",
|
|
30
|
-
"@oxprotocol/bundle": "0.1.
|
|
31
|
+
"@oxprotocol/bundle": "0.1.5",
|
|
31
32
|
"@oxprotocol/host-core": "0.1.4",
|
|
33
|
+
"@oxprotocol/wit": "0.1.4",
|
|
32
34
|
"@oxprotocol/types": "0.1.4",
|
|
33
|
-
"@oxprotocol/schema": "0.1.4"
|
|
34
|
-
"@oxprotocol/wit": "0.1.4"
|
|
35
|
+
"@oxprotocol/schema": "0.1.4"
|
|
35
36
|
},
|
|
36
37
|
"devDependencies": {
|
|
37
38
|
"@types/node": "^22.10.2",
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Files needed for development but not part of the shipped .oxp bundle.
|
|
2
|
+
# Source-of-truth lives at https://oxp.sh/docs/oxpignore
|
|
3
|
+
|
|
4
|
+
# React/TS source — bundled and inlined into ui/index.html by build.mjs
|
|
5
|
+
src/
|
|
6
|
+
|
|
7
|
+
# Tooling — only used at build time
|
|
8
|
+
build.mjs
|
|
9
|
+
package.json
|
|
10
|
+
package-lock.json
|
|
11
|
+
pnpm-lock.yaml
|
|
12
|
+
yarn.lock
|
|
13
|
+
tsconfig.json
|
|
14
|
+
|
|
15
|
+
# IDE / OS noise
|
|
16
|
+
.gitignore
|
|
17
|
+
.DS_Store
|
|
@@ -1,18 +1,40 @@
|
|
|
1
1
|
# __DISPLAY_NAME__
|
|
2
2
|
|
|
3
|
-
A
|
|
3
|
+
A React + TypeScript OXP extension scaffolded by `oxp create`.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## Layout
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
src/
|
|
9
|
+
App.tsx ← edit me
|
|
10
|
+
main.tsx ← React entry, mounts <App /> on #root
|
|
11
|
+
styles.css ← global styles, inlined into the bundle
|
|
12
|
+
build.mjs ← esbuild driver, emits a single inlined ui/index.html
|
|
13
|
+
ui/index.html ← (generated, git-ignored)
|
|
14
|
+
oxp.json ← extension manifest
|
|
15
|
+
.oxpignore ← excludes src/, build.mjs, etc. from the .oxp
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
## Why a single inlined HTML?
|
|
19
|
+
|
|
20
|
+
OXP's `ui-v1` policy forbids loose `.js` and `.css` files in a bundle —
|
|
21
|
+
only HTML may execute. `build.mjs` runs esbuild with `format: "iife"` and
|
|
22
|
+
inlines both the JS and CSS into one self-contained `ui/index.html`. That
|
|
23
|
+
HTML is the only artefact that ships in the `.oxp`.
|
|
24
|
+
|
|
25
|
+
## Develop
|
|
6
26
|
|
|
7
27
|
```sh
|
|
8
|
-
|
|
28
|
+
npm install # one-time
|
|
29
|
+
oxp dev # watches files, rebuilds, serves to your IDE host
|
|
9
30
|
```
|
|
10
31
|
|
|
11
|
-
|
|
32
|
+
`oxp dev` runs `scripts.build` from `oxp.json` (`npm run build`, which
|
|
33
|
+
executes `node build.mjs`) before each repack.
|
|
12
34
|
|
|
13
|
-
##
|
|
35
|
+
## Ship
|
|
14
36
|
|
|
15
37
|
```sh
|
|
16
|
-
oxp
|
|
17
|
-
oxp publish
|
|
38
|
+
oxp pack # produces dist/__SLUG__-<version>.oxp + .sig.json
|
|
39
|
+
oxp publish # uploads to https://oxp.sh
|
|
18
40
|
```
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// Build the OXP UI bundle.
|
|
2
|
+
//
|
|
3
|
+
// Why is this not just `esbuild --outdir=ui`?
|
|
4
|
+
// Because OXP's `ui-v1` policy forbids loose `.js` / `.css` files in the
|
|
5
|
+
// bundle for safety (CSP-style — only HTML may execute). So we build the
|
|
6
|
+
// React app and inline both the JS and the CSS into a single self-contained
|
|
7
|
+
// `ui/index.html`. That HTML is the only artefact that ships in the .oxp.
|
|
8
|
+
//
|
|
9
|
+
// Watch mode (`oxp dev`) re-runs this on every save.
|
|
10
|
+
|
|
11
|
+
import { context, build } from "esbuild";
|
|
12
|
+
import { readFile, writeFile, mkdir } from "node:fs/promises";
|
|
13
|
+
|
|
14
|
+
const watch = process.argv.includes("--watch");
|
|
15
|
+
|
|
16
|
+
const entry = "src/main.tsx";
|
|
17
|
+
|
|
18
|
+
const buildOptions = {
|
|
19
|
+
entryPoints: [entry],
|
|
20
|
+
bundle: true,
|
|
21
|
+
minify: !watch,
|
|
22
|
+
sourcemap: false, // inline maps would inflate the HTML; off in dev too
|
|
23
|
+
target: "es2020",
|
|
24
|
+
format: "iife", // executes immediately when injected via <script>
|
|
25
|
+
loader: { ".css": "css" },
|
|
26
|
+
legalComments: "none",
|
|
27
|
+
write: false,
|
|
28
|
+
outdir: "out",
|
|
29
|
+
logLevel: "warning",
|
|
30
|
+
plugins: [
|
|
31
|
+
{
|
|
32
|
+
name: "oxp-inline-html",
|
|
33
|
+
setup(b) {
|
|
34
|
+
b.onEnd(async (result) => {
|
|
35
|
+
if (result.errors.length > 0) return;
|
|
36
|
+
await emitInlinedHtml(result);
|
|
37
|
+
});
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
],
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
async function emitInlinedHtml(result) {
|
|
44
|
+
let js = "";
|
|
45
|
+
let css = "";
|
|
46
|
+
for (const f of result.outputFiles ?? []) {
|
|
47
|
+
if (f.path.endsWith(".js")) js = f.text;
|
|
48
|
+
else if (f.path.endsWith(".css")) css = f.text;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Pull display name from oxp.json so the <title> stays in sync.
|
|
52
|
+
let title = "OXP Extension";
|
|
53
|
+
try {
|
|
54
|
+
const m = JSON.parse(await readFile("oxp.json", "utf8"));
|
|
55
|
+
if (typeof m.displayName === "string") title = m.displayName;
|
|
56
|
+
} catch {
|
|
57
|
+
/* fall back */
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
const html = `<!doctype html>
|
|
61
|
+
<html lang="en">
|
|
62
|
+
<head>
|
|
63
|
+
<meta charset="utf-8" />
|
|
64
|
+
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
65
|
+
<title>${escapeHtml(title)}</title>
|
|
66
|
+
<style>${css}</style>
|
|
67
|
+
</head>
|
|
68
|
+
<body>
|
|
69
|
+
<div id="root"></div>
|
|
70
|
+
<script>${js}</script>
|
|
71
|
+
</body>
|
|
72
|
+
</html>
|
|
73
|
+
`;
|
|
74
|
+
|
|
75
|
+
await mkdir("ui", { recursive: true });
|
|
76
|
+
await writeFile("ui/index.html", html);
|
|
77
|
+
const kb = (html.length / 1024).toFixed(1);
|
|
78
|
+
console.log(`✓ ui/index.html (${kb} KiB)`);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function escapeHtml(s) {
|
|
82
|
+
return s
|
|
83
|
+
.replace(/&/g, "&")
|
|
84
|
+
.replace(/</g, "<")
|
|
85
|
+
.replace(/>/g, ">")
|
|
86
|
+
.replace(/"/g, """);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (watch) {
|
|
90
|
+
const ctx = await context(buildOptions);
|
|
91
|
+
await ctx.watch();
|
|
92
|
+
console.log("watching src/ — Ctrl+C to stop");
|
|
93
|
+
} else {
|
|
94
|
+
await build(buildOptions);
|
|
95
|
+
}
|
|
@@ -4,11 +4,12 @@
|
|
|
4
4
|
"publisher": "__PUBLISHER__",
|
|
5
5
|
"version": "0.0.1",
|
|
6
6
|
"displayName": "__DISPLAY_NAME__",
|
|
7
|
-
"description": "
|
|
7
|
+
"description": "OXP extension built with React + TypeScript.",
|
|
8
8
|
"license": "MIT",
|
|
9
9
|
"categories": ["other"],
|
|
10
10
|
"engines": { "oxp": "^1.0.0" },
|
|
11
11
|
"main": { "ui": "ui/index.html" },
|
|
12
12
|
"ui": { "components": "oxp-ui-only", "preferredSurface": "panel" },
|
|
13
|
-
"permissions": []
|
|
13
|
+
"permissions": [],
|
|
14
|
+
"scripts": { "build": "npm run build" }
|
|
14
15
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "__SLUG__",
|
|
3
|
+
"private": true,
|
|
4
|
+
"version": "0.0.1",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"build": "node build.mjs",
|
|
8
|
+
"dev": "node build.mjs --watch",
|
|
9
|
+
"typecheck": "tsc --noEmit"
|
|
10
|
+
},
|
|
11
|
+
"dependencies": {
|
|
12
|
+
"react": "^18.3.1",
|
|
13
|
+
"react-dom": "^18.3.1"
|
|
14
|
+
},
|
|
15
|
+
"devDependencies": {
|
|
16
|
+
"@types/react": "^18.3.12",
|
|
17
|
+
"@types/react-dom": "^18.3.1",
|
|
18
|
+
"esbuild": "^0.24.0",
|
|
19
|
+
"typescript": "^5.6.3"
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { useState } from "react";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Replace this with whatever your extension does. Everything inside the
|
|
5
|
+
* panel is plain React + DOM — no host-specific APIs needed for UI work.
|
|
6
|
+
*
|
|
7
|
+
* To talk to the host (read settings, run commands, log telemetry, etc.)
|
|
8
|
+
* import from `@oxprotocol/sdk` and add the matching permission to
|
|
9
|
+
* `oxp.json#permissions`.
|
|
10
|
+
*/
|
|
11
|
+
export function App(): JSX.Element {
|
|
12
|
+
const [count, setCount] = useState(0);
|
|
13
|
+
|
|
14
|
+
return (
|
|
15
|
+
<main className="oxp-card">
|
|
16
|
+
<header className="oxp-header">
|
|
17
|
+
<span className="oxp-dot" aria-hidden />
|
|
18
|
+
<span className="oxp-brand">OXP</span>
|
|
19
|
+
<span className="oxp-slug">@__PUBLISHER__/__SLUG__</span>
|
|
20
|
+
</header>
|
|
21
|
+
|
|
22
|
+
<h1>__DISPLAY_NAME__</h1>
|
|
23
|
+
<p className="oxp-lede">
|
|
24
|
+
React + TypeScript panel running inside your IDE.
|
|
25
|
+
</p>
|
|
26
|
+
|
|
27
|
+
<button
|
|
28
|
+
className="oxp-btn"
|
|
29
|
+
type="button"
|
|
30
|
+
onClick={() => setCount((c) => c + 1)}
|
|
31
|
+
>
|
|
32
|
+
Pressed {count} {count === 1 ? "time" : "times"}
|
|
33
|
+
</button>
|
|
34
|
+
|
|
35
|
+
<p className="oxp-hint">
|
|
36
|
+
Edit <code>src/App.tsx</code> and save — the panel hot-reloads.
|
|
37
|
+
</p>
|
|
38
|
+
|
|
39
|
+
<footer className="oxp-footer">
|
|
40
|
+
<a
|
|
41
|
+
href="https://oxp.sh/docs/getting-started"
|
|
42
|
+
target="_blank"
|
|
43
|
+
rel="noreferrer"
|
|
44
|
+
>
|
|
45
|
+
Docs ↗
|
|
46
|
+
</a>
|
|
47
|
+
<span aria-hidden>·</span>
|
|
48
|
+
<a href="https://oxp.sh/docs/api" target="_blank" rel="noreferrer">
|
|
49
|
+
SDK API ↗
|
|
50
|
+
</a>
|
|
51
|
+
</footer>
|
|
52
|
+
</main>
|
|
53
|
+
);
|
|
54
|
+
}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
color-scheme: dark light;
|
|
3
|
+
--oxp-bg: #060a13;
|
|
4
|
+
--oxp-fg: #f8fafc;
|
|
5
|
+
--oxp-muted: rgba(248, 250, 252, 0.45);
|
|
6
|
+
--oxp-accent: #7dd3fc;
|
|
7
|
+
--oxp-border: rgba(125, 211, 252, 0.18);
|
|
8
|
+
--oxp-border-strong: rgba(125, 211, 252, 0.4);
|
|
9
|
+
--oxp-mono: ui-monospace, SFMono-Regular, "JetBrains Mono", Menlo, monospace;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
* {
|
|
13
|
+
box-sizing: border-box;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
body {
|
|
17
|
+
margin: 0;
|
|
18
|
+
min-height: 100vh;
|
|
19
|
+
display: grid;
|
|
20
|
+
place-items: center;
|
|
21
|
+
padding: 1.5rem;
|
|
22
|
+
font-family: -apple-system, system-ui, "Segoe UI", sans-serif;
|
|
23
|
+
background:
|
|
24
|
+
radial-gradient(
|
|
25
|
+
circle at 50% 0%,
|
|
26
|
+
rgba(125, 211, 252, 0.06),
|
|
27
|
+
transparent 60%
|
|
28
|
+
),
|
|
29
|
+
var(--oxp-bg);
|
|
30
|
+
color: var(--oxp-fg);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.oxp-card {
|
|
34
|
+
width: 100%;
|
|
35
|
+
max-width: 28rem;
|
|
36
|
+
border: 1px solid var(--oxp-border);
|
|
37
|
+
border-radius: 8px;
|
|
38
|
+
padding: 1.75rem 2rem;
|
|
39
|
+
background: rgba(125, 211, 252, 0.03);
|
|
40
|
+
backdrop-filter: blur(8px);
|
|
41
|
+
display: flex;
|
|
42
|
+
flex-direction: column;
|
|
43
|
+
gap: 1rem;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.oxp-header {
|
|
47
|
+
display: flex;
|
|
48
|
+
align-items: center;
|
|
49
|
+
gap: 0.5rem;
|
|
50
|
+
font-family: var(--oxp-mono);
|
|
51
|
+
font-size: 0.65rem;
|
|
52
|
+
letter-spacing: 0.18em;
|
|
53
|
+
text-transform: uppercase;
|
|
54
|
+
color: var(--oxp-muted);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.oxp-dot {
|
|
58
|
+
width: 6px;
|
|
59
|
+
height: 6px;
|
|
60
|
+
border-radius: 50%;
|
|
61
|
+
background: #10b981;
|
|
62
|
+
box-shadow: 0 0 6px #10b981;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.oxp-brand {
|
|
66
|
+
color: var(--oxp-accent);
|
|
67
|
+
font-weight: 700;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.oxp-slug {
|
|
71
|
+
margin-left: auto;
|
|
72
|
+
color: var(--oxp-muted);
|
|
73
|
+
font-size: 0.6rem;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
h1 {
|
|
77
|
+
margin: 0;
|
|
78
|
+
font-size: 1.5rem;
|
|
79
|
+
letter-spacing: -0.01em;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
.oxp-lede {
|
|
83
|
+
margin: 0;
|
|
84
|
+
color: var(--oxp-muted);
|
|
85
|
+
font-size: 0.85rem;
|
|
86
|
+
line-height: 1.5;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.oxp-btn {
|
|
90
|
+
align-self: flex-start;
|
|
91
|
+
margin-top: 0.25rem;
|
|
92
|
+
padding: 0.55rem 1rem;
|
|
93
|
+
font-family: var(--oxp-mono);
|
|
94
|
+
font-size: 0.75rem;
|
|
95
|
+
letter-spacing: 0.1em;
|
|
96
|
+
text-transform: uppercase;
|
|
97
|
+
color: var(--oxp-accent);
|
|
98
|
+
background: rgba(125, 211, 252, 0.06);
|
|
99
|
+
border: 1px solid var(--oxp-border-strong);
|
|
100
|
+
border-radius: 4px;
|
|
101
|
+
cursor: pointer;
|
|
102
|
+
transition: background 120ms ease, transform 80ms ease;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
.oxp-btn:hover {
|
|
106
|
+
background: rgba(125, 211, 252, 0.12);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.oxp-btn:active {
|
|
110
|
+
transform: translateY(1px);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.oxp-hint {
|
|
114
|
+
margin: 0;
|
|
115
|
+
font-family: var(--oxp-mono);
|
|
116
|
+
font-size: 0.7rem;
|
|
117
|
+
color: var(--oxp-muted);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.oxp-hint code {
|
|
121
|
+
color: var(--oxp-accent);
|
|
122
|
+
background: rgba(125, 211, 252, 0.08);
|
|
123
|
+
padding: 0.1em 0.35em;
|
|
124
|
+
border-radius: 3px;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.oxp-footer {
|
|
128
|
+
display: flex;
|
|
129
|
+
gap: 0.5rem;
|
|
130
|
+
align-items: center;
|
|
131
|
+
margin-top: 0.5rem;
|
|
132
|
+
padding-top: 0.85rem;
|
|
133
|
+
border-top: 1px solid var(--oxp-border);
|
|
134
|
+
font-family: var(--oxp-mono);
|
|
135
|
+
font-size: 0.7rem;
|
|
136
|
+
color: var(--oxp-muted);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.oxp-footer a {
|
|
140
|
+
color: var(--oxp-accent);
|
|
141
|
+
text-decoration: none;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
.oxp-footer a:hover {
|
|
145
|
+
text-decoration: underline;
|
|
146
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2020",
|
|
4
|
+
"module": "ESNext",
|
|
5
|
+
"moduleResolution": "bundler",
|
|
6
|
+
"jsx": "react-jsx",
|
|
7
|
+
"strict": true,
|
|
8
|
+
"esModuleInterop": true,
|
|
9
|
+
"skipLibCheck": true,
|
|
10
|
+
"isolatedModules": true,
|
|
11
|
+
"noEmit": true,
|
|
12
|
+
"lib": [
|
|
13
|
+
"ES2020",
|
|
14
|
+
"DOM",
|
|
15
|
+
"DOM.Iterable"
|
|
16
|
+
]
|
|
17
|
+
},
|
|
18
|
+
"include": [
|
|
19
|
+
"src"
|
|
20
|
+
]
|
|
21
|
+
}
|
|
Binary file
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="utf-8" />
|
|
5
|
-
<title>__DISPLAY_NAME__</title>
|
|
6
|
-
<style>
|
|
7
|
-
:root {
|
|
8
|
-
color-scheme: dark light;
|
|
9
|
-
}
|
|
10
|
-
body {
|
|
11
|
-
margin: 0;
|
|
12
|
-
min-height: 100vh;
|
|
13
|
-
display: grid;
|
|
14
|
-
place-items: center;
|
|
15
|
-
font-family: -apple-system, system-ui, sans-serif;
|
|
16
|
-
background: #060a13;
|
|
17
|
-
color: #f8fafc;
|
|
18
|
-
}
|
|
19
|
-
.card {
|
|
20
|
-
border: 1px solid rgba(125, 211, 252, 0.3);
|
|
21
|
-
padding: 2rem 2.5rem;
|
|
22
|
-
border-radius: 8px;
|
|
23
|
-
text-align: center;
|
|
24
|
-
}
|
|
25
|
-
h1 {
|
|
26
|
-
margin: 0 0 0.5rem;
|
|
27
|
-
font-size: 1.75rem;
|
|
28
|
-
}
|
|
29
|
-
p {
|
|
30
|
-
margin: 0;
|
|
31
|
-
opacity: 0.6;
|
|
32
|
-
font-family: ui-monospace, monospace;
|
|
33
|
-
font-size: 0.75rem;
|
|
34
|
-
}
|
|
35
|
-
</style>
|
|
36
|
-
</head>
|
|
37
|
-
<body>
|
|
38
|
-
<div class="card">
|
|
39
|
-
<h1>Hello, OXP world.</h1>
|
|
40
|
-
<p>@__PUBLISHER__/__SLUG__</p>
|
|
41
|
-
</div>
|
|
42
|
-
</body>
|
|
43
|
-
</html>
|