openxiangda-cli 2.0.0-alpha.49 → 2.0.0-alpha.56

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 (321) hide show
  1. package/README.md +4 -18
  2. package/bin/run.js +67 -1
  3. package/dist/base.d.ts +36 -7
  4. package/dist/base.d.ts.map +1 -1
  5. package/dist/base.js +95 -18
  6. package/dist/base.js.map +1 -1
  7. package/dist/commands/check.d.ts +14 -1
  8. package/dist/commands/check.d.ts.map +1 -1
  9. package/dist/commands/create.d.ts +23 -0
  10. package/dist/commands/create.d.ts.map +1 -0
  11. package/dist/commands/create.js +93 -0
  12. package/dist/commands/create.js.map +1 -0
  13. package/dist/commands/deploy.d.ts +19 -8
  14. package/dist/commands/deploy.d.ts.map +1 -1
  15. package/dist/commands/deploy.js +29 -16
  16. package/dist/commands/deploy.js.map +1 -1
  17. package/dist/commands/dev.d.ts +14 -3
  18. package/dist/commands/dev.d.ts.map +1 -1
  19. package/dist/commands/dev.js +4 -8
  20. package/dist/commands/dev.js.map +1 -1
  21. package/dist/commands/login.d.ts +24 -0
  22. package/dist/commands/login.d.ts.map +1 -0
  23. package/dist/commands/{auth/login.js → login.js} +27 -9
  24. package/dist/commands/login.js.map +1 -0
  25. package/dist/commands/logs.d.ts +15 -2
  26. package/dist/commands/logs.d.ts.map +1 -1
  27. package/dist/commands/logs.js +2 -2
  28. package/dist/commands/logs.js.map +1 -1
  29. package/dist/commands/rollback.d.ts +15 -4
  30. package/dist/commands/rollback.d.ts.map +1 -1
  31. package/dist/commands/rollback.js +11 -4
  32. package/dist/commands/rollback.js.map +1 -1
  33. package/dist/commands/status.d.ts +14 -1
  34. package/dist/commands/status.d.ts.map +1 -1
  35. package/dist/commands/status.js +1 -1
  36. package/dist/commands/status.js.map +1 -1
  37. package/dist/create-workspace.d.ts +23 -0
  38. package/dist/create-workspace.d.ts.map +1 -0
  39. package/dist/create-workspace.js +279 -0
  40. package/dist/create-workspace.js.map +1 -0
  41. package/package.json +14 -7
  42. package/template/.dockerignore +12 -0
  43. package/template/.env.example +3 -0
  44. package/template/AGENTS.md +8 -0
  45. package/template/README.md +23 -0
  46. package/template/_gitignore +14 -0
  47. package/template/apps/server/Dockerfile +19 -0
  48. package/template/apps/server/package.json +27 -0
  49. package/template/apps/server/src/app.module.ts +32 -0
  50. package/template/apps/server/src/instrument-context.controller.ts +25 -0
  51. package/template/apps/server/src/main.ts +18 -0
  52. package/template/apps/server/test/smoke.test.ts +28 -0
  53. package/template/apps/server/tsconfig.json +9 -0
  54. package/template/apps/web/e2e/instruments.spec.ts +150 -0
  55. package/template/apps/web/index.html +12 -0
  56. package/template/apps/web/package.json +33 -0
  57. package/template/apps/web/playwright.config.ts +21 -0
  58. package/template/apps/web/scripts/check.mjs +32 -0
  59. package/template/apps/web/scripts/verify-build.mjs +20 -0
  60. package/template/apps/web/src/InstrumentDetailPage.tsx +60 -0
  61. package/template/apps/web/src/InstrumentForm.tsx +322 -0
  62. package/template/apps/web/src/InstrumentFormPage.tsx +77 -0
  63. package/template/apps/web/src/InstrumentListPage.tsx +390 -0
  64. package/template/apps/web/src/Shell.tsx +52 -0
  65. package/template/apps/web/src/data-provider.ts +42 -0
  66. package/template/apps/web/src/fields.ts +72 -0
  67. package/template/apps/web/src/instrument.ts +55 -0
  68. package/template/apps/web/src/main.tsx +58 -0
  69. package/template/apps/web/src/platform-client.ts +246 -0
  70. package/template/apps/web/src/runtime-meta.ts +60 -0
  71. package/template/apps/web/src/runtime.tsx +73 -0
  72. package/template/apps/web/src/styles.css +84 -0
  73. package/template/apps/web/test/contracts.test.ts +234 -0
  74. package/template/apps/web/test/loopback.test.ts +62 -0
  75. package/template/apps/web/tsconfig.json +12 -0
  76. package/template/apps/web/vite.config.ts +32 -0
  77. package/template/openxiangda.config.ts +77 -0
  78. package/template/package.json +29 -0
  79. package/template/packages/contracts/package.json +23 -0
  80. package/template/packages/contracts/src/generated.ts +129 -0
  81. package/template/packages/contracts/src/index.ts +1 -0
  82. package/template/packages/contracts/tsconfig.json +9 -0
  83. package/template/platform/data/instruments.ts +81 -0
  84. package/template/pnpm-workspace.yaml +7 -0
  85. package/template/scripts/verify-template-budget.mjs +37 -0
  86. package/template/tsconfig.base.json +13 -0
  87. package/dist/commands/app/create.d.ts +0 -15
  88. package/dist/commands/app/create.d.ts.map +0 -1
  89. package/dist/commands/app/create.js +0 -42
  90. package/dist/commands/app/create.js.map +0 -1
  91. package/dist/commands/app/info.d.ts +0 -9
  92. package/dist/commands/app/info.d.ts.map +0 -1
  93. package/dist/commands/app/info.js +0 -10
  94. package/dist/commands/app/info.js.map +0 -1
  95. package/dist/commands/app/link.d.ts +0 -10
  96. package/dist/commands/app/link.d.ts.map +0 -1
  97. package/dist/commands/app/link.js +0 -16
  98. package/dist/commands/app/link.js.map +0 -1
  99. package/dist/commands/app/provision.d.ts +0 -9
  100. package/dist/commands/app/provision.d.ts.map +0 -1
  101. package/dist/commands/app/provision.js +0 -10
  102. package/dist/commands/app/provision.js.map +0 -1
  103. package/dist/commands/auth/login.d.ts +0 -11
  104. package/dist/commands/auth/login.d.ts.map +0 -1
  105. package/dist/commands/auth/login.js.map +0 -1
  106. package/dist/commands/auth/logout.d.ts +0 -6
  107. package/dist/commands/auth/logout.d.ts.map +0 -1
  108. package/dist/commands/auth/logout.js +0 -30
  109. package/dist/commands/auth/logout.js.map +0 -1
  110. package/dist/commands/auth/status.d.ts +0 -6
  111. package/dist/commands/auth/status.d.ts.map +0 -1
  112. package/dist/commands/auth/status.js +0 -60
  113. package/dist/commands/auth/status.js.map +0 -1
  114. package/dist/commands/authz/membership/grant.d.ts +0 -16
  115. package/dist/commands/authz/membership/grant.d.ts.map +0 -1
  116. package/dist/commands/authz/membership/grant.js +0 -32
  117. package/dist/commands/authz/membership/grant.js.map +0 -1
  118. package/dist/commands/authz/membership/list.d.ts +0 -16
  119. package/dist/commands/authz/membership/list.d.ts.map +0 -1
  120. package/dist/commands/authz/membership/list.js +0 -34
  121. package/dist/commands/authz/membership/list.js.map +0 -1
  122. package/dist/commands/authz/membership/revoke.d.ts +0 -15
  123. package/dist/commands/authz/membership/revoke.d.ts.map +0 -1
  124. package/dist/commands/authz/membership/revoke.js +0 -22
  125. package/dist/commands/authz/membership/revoke.js.map +0 -1
  126. package/dist/commands/authz/membership/update.d.ts +0 -18
  127. package/dist/commands/authz/membership/update.d.ts.map +0 -1
  128. package/dist/commands/authz/membership/update.js +0 -31
  129. package/dist/commands/authz/membership/update.js.map +0 -1
  130. package/dist/commands/authz/relationship/grant.d.ts +0 -20
  131. package/dist/commands/authz/relationship/grant.d.ts.map +0 -1
  132. package/dist/commands/authz/relationship/grant.js +0 -40
  133. package/dist/commands/authz/relationship/grant.js.map +0 -1
  134. package/dist/commands/authz/relationship/list.d.ts +0 -18
  135. package/dist/commands/authz/relationship/list.d.ts.map +0 -1
  136. package/dist/commands/authz/relationship/list.js +0 -43
  137. package/dist/commands/authz/relationship/list.js.map +0 -1
  138. package/dist/commands/authz/relationship/revoke.d.ts +0 -15
  139. package/dist/commands/authz/relationship/revoke.d.ts.map +0 -1
  140. package/dist/commands/authz/relationship/revoke.js +0 -22
  141. package/dist/commands/authz/relationship/revoke.js.map +0 -1
  142. package/dist/commands/authz/relationship/update.d.ts +0 -18
  143. package/dist/commands/authz/relationship/update.d.ts.map +0 -1
  144. package/dist/commands/authz/relationship/update.js +0 -28
  145. package/dist/commands/authz/relationship/update.js.map +0 -1
  146. package/dist/commands/authz/super-admin/grant.d.ts +0 -12
  147. package/dist/commands/authz/super-admin/grant.d.ts.map +0 -1
  148. package/dist/commands/authz/super-admin/grant.js +0 -20
  149. package/dist/commands/authz/super-admin/grant.js.map +0 -1
  150. package/dist/commands/authz/super-admin/list.d.ts +0 -15
  151. package/dist/commands/authz/super-admin/list.d.ts.map +0 -1
  152. package/dist/commands/authz/super-admin/list.js +0 -27
  153. package/dist/commands/authz/super-admin/list.js.map +0 -1
  154. package/dist/commands/authz/super-admin/revoke.d.ts +0 -15
  155. package/dist/commands/authz/super-admin/revoke.d.ts.map +0 -1
  156. package/dist/commands/authz/super-admin/revoke.js +0 -21
  157. package/dist/commands/authz/super-admin/revoke.js.map +0 -1
  158. package/dist/commands/build.d.ts +0 -11
  159. package/dist/commands/build.d.ts.map +0 -1
  160. package/dist/commands/build.js +0 -23
  161. package/dist/commands/build.js.map +0 -1
  162. package/dist/commands/cancel.d.ts +0 -12
  163. package/dist/commands/cancel.d.ts.map +0 -1
  164. package/dist/commands/cancel.js +0 -12
  165. package/dist/commands/cancel.js.map +0 -1
  166. package/dist/commands/dev/reset.d.ts +0 -10
  167. package/dist/commands/dev/reset.d.ts.map +0 -1
  168. package/dist/commands/dev/reset.js +0 -17
  169. package/dist/commands/dev/reset.js.map +0 -1
  170. package/dist/commands/dev/status.d.ts +0 -9
  171. package/dist/commands/dev/status.d.ts.map +0 -1
  172. package/dist/commands/dev/status.js +0 -10
  173. package/dist/commands/dev/status.js.map +0 -1
  174. package/dist/commands/dev/stop.d.ts +0 -9
  175. package/dist/commands/dev/stop.d.ts.map +0 -1
  176. package/dist/commands/dev/stop.js +0 -10
  177. package/dist/commands/dev/stop.js.map +0 -1
  178. package/dist/commands/doctor.d.ts +0 -9
  179. package/dist/commands/doctor.d.ts.map +0 -1
  180. package/dist/commands/doctor.js +0 -7
  181. package/dist/commands/doctor.js.map +0 -1
  182. package/dist/commands/environment/start.d.ts +0 -13
  183. package/dist/commands/environment/start.d.ts.map +0 -1
  184. package/dist/commands/environment/start.js +0 -22
  185. package/dist/commands/environment/start.js.map +0 -1
  186. package/dist/commands/environment/status.d.ts +0 -9
  187. package/dist/commands/environment/status.d.ts.map +0 -1
  188. package/dist/commands/environment/status.js +0 -10
  189. package/dist/commands/environment/status.js.map +0 -1
  190. package/dist/commands/environment/stop.d.ts +0 -13
  191. package/dist/commands/environment/stop.d.ts.map +0 -1
  192. package/dist/commands/environment/stop.js +0 -22
  193. package/dist/commands/environment/stop.js.map +0 -1
  194. package/dist/commands/event/delivery/list.d.ts +0 -10
  195. package/dist/commands/event/delivery/list.d.ts.map +0 -1
  196. package/dist/commands/event/delivery/list.js +0 -14
  197. package/dist/commands/event/delivery/list.js.map +0 -1
  198. package/dist/commands/event/delivery/replay.d.ts +0 -13
  199. package/dist/commands/event/delivery/replay.d.ts.map +0 -1
  200. package/dist/commands/event/delivery/replay.js +0 -16
  201. package/dist/commands/event/delivery/replay.js.map +0 -1
  202. package/dist/commands/event/subscription/list.d.ts +0 -9
  203. package/dist/commands/event/subscription/list.d.ts.map +0 -1
  204. package/dist/commands/event/subscription/list.js +0 -10
  205. package/dist/commands/event/subscription/list.js.map +0 -1
  206. package/dist/commands/event/subscription/rotate-secret.d.ts +0 -15
  207. package/dist/commands/event/subscription/rotate-secret.d.ts.map +0 -1
  208. package/dist/commands/event/subscription/rotate-secret.js +0 -33
  209. package/dist/commands/event/subscription/rotate-secret.js.map +0 -1
  210. package/dist/commands/event/subscription/status.d.ts +0 -14
  211. package/dist/commands/event/subscription/status.d.ts.map +0 -1
  212. package/dist/commands/event/subscription/status.js +0 -19
  213. package/dist/commands/event/subscription/status.js.map +0 -1
  214. package/dist/commands/event/timer/fire.d.ts +0 -12
  215. package/dist/commands/event/timer/fire.d.ts.map +0 -1
  216. package/dist/commands/event/timer/fire.js +0 -12
  217. package/dist/commands/event/timer/fire.js.map +0 -1
  218. package/dist/commands/event/timer/list.d.ts +0 -9
  219. package/dist/commands/event/timer/list.d.ts.map +0 -1
  220. package/dist/commands/event/timer/list.js +0 -10
  221. package/dist/commands/event/timer/list.js.map +0 -1
  222. package/dist/commands/event/timer/status.d.ts +0 -14
  223. package/dist/commands/event/timer/status.d.ts.map +0 -1
  224. package/dist/commands/event/timer/status.js +0 -19
  225. package/dist/commands/event/timer/status.js.map +0 -1
  226. package/dist/commands/generate.d.ts +0 -10
  227. package/dist/commands/generate.d.ts.map +0 -1
  228. package/dist/commands/generate.js +0 -8
  229. package/dist/commands/generate.js.map +0 -1
  230. package/dist/commands/oauth/audit/list.d.ts +0 -12
  231. package/dist/commands/oauth/audit/list.d.ts.map +0 -1
  232. package/dist/commands/oauth/audit/list.js +0 -20
  233. package/dist/commands/oauth/audit/list.js.map +0 -1
  234. package/dist/commands/oauth/client/create.d.ts +0 -13
  235. package/dist/commands/oauth/client/create.d.ts.map +0 -1
  236. package/dist/commands/oauth/client/create.js +0 -31
  237. package/dist/commands/oauth/client/create.js.map +0 -1
  238. package/dist/commands/oauth/client/list.d.ts +0 -9
  239. package/dist/commands/oauth/client/list.d.ts.map +0 -1
  240. package/dist/commands/oauth/client/list.js +0 -10
  241. package/dist/commands/oauth/client/list.js.map +0 -1
  242. package/dist/commands/oauth/client/revoke.d.ts +0 -12
  243. package/dist/commands/oauth/client/revoke.d.ts.map +0 -1
  244. package/dist/commands/oauth/client/revoke.js +0 -12
  245. package/dist/commands/oauth/client/revoke.js.map +0 -1
  246. package/dist/commands/oauth/client/rotate.d.ts +0 -13
  247. package/dist/commands/oauth/client/rotate.d.ts.map +0 -1
  248. package/dist/commands/oauth/client/rotate.js +0 -20
  249. package/dist/commands/oauth/client/rotate.js.map +0 -1
  250. package/dist/commands/oauth/client/update.d.ts +0 -15
  251. package/dist/commands/oauth/client/update.d.ts.map +0 -1
  252. package/dist/commands/oauth/client/update.js +0 -23
  253. package/dist/commands/oauth/client/update.js.map +0 -1
  254. package/dist/commands/oauth/runtime/rotate.d.ts +0 -12
  255. package/dist/commands/oauth/runtime/rotate.d.ts.map +0 -1
  256. package/dist/commands/oauth/runtime/rotate.js +0 -28
  257. package/dist/commands/oauth/runtime/rotate.js.map +0 -1
  258. package/dist/commands/oauth/runtime/status.d.ts +0 -10
  259. package/dist/commands/oauth/runtime/status.d.ts.map +0 -1
  260. package/dist/commands/oauth/runtime/status.js +0 -13
  261. package/dist/commands/oauth/runtime/status.js.map +0 -1
  262. package/dist/commands/promote.d.ts +0 -13
  263. package/dist/commands/promote.d.ts.map +0 -1
  264. package/dist/commands/promote.js +0 -9
  265. package/dist/commands/promote.js.map +0 -1
  266. package/dist/commands/retry.d.ts +0 -12
  267. package/dist/commands/retry.d.ts.map +0 -1
  268. package/dist/commands/retry.js +0 -9
  269. package/dist/commands/retry.js.map +0 -1
  270. package/dist/commands/secret/audit/list.d.ts +0 -14
  271. package/dist/commands/secret/audit/list.d.ts.map +0 -1
  272. package/dist/commands/secret/audit/list.js +0 -16
  273. package/dist/commands/secret/audit/list.js.map +0 -1
  274. package/dist/commands/secret/create.d.ts +0 -18
  275. package/dist/commands/secret/create.d.ts.map +0 -1
  276. package/dist/commands/secret/create.js +0 -33
  277. package/dist/commands/secret/create.js.map +0 -1
  278. package/dist/commands/secret/delete.d.ts +0 -15
  279. package/dist/commands/secret/delete.d.ts.map +0 -1
  280. package/dist/commands/secret/delete.js +0 -20
  281. package/dist/commands/secret/delete.js.map +0 -1
  282. package/dist/commands/secret/list.d.ts +0 -10
  283. package/dist/commands/secret/list.d.ts.map +0 -1
  284. package/dist/commands/secret/list.js +0 -13
  285. package/dist/commands/secret/list.js.map +0 -1
  286. package/dist/commands/secret/rotate.d.ts +0 -18
  287. package/dist/commands/secret/rotate.d.ts.map +0 -1
  288. package/dist/commands/secret/rotate.js +0 -30
  289. package/dist/commands/secret/rotate.js.map +0 -1
  290. package/dist/commands/secret/update.d.ts +0 -17
  291. package/dist/commands/secret/update.d.ts.map +0 -1
  292. package/dist/commands/secret/update.js +0 -37
  293. package/dist/commands/secret/update.js.map +0 -1
  294. package/dist/commands/skill/install.d.ts +0 -11
  295. package/dist/commands/skill/install.d.ts.map +0 -1
  296. package/dist/commands/skill/install.js +0 -52
  297. package/dist/commands/skill/install.js.map +0 -1
  298. package/dist/commands/skill/validate.d.ts +0 -9
  299. package/dist/commands/skill/validate.d.ts.map +0 -1
  300. package/dist/commands/skill/validate.js +0 -32
  301. package/dist/commands/skill/validate.js.map +0 -1
  302. package/dist/commands/test.d.ts +0 -9
  303. package/dist/commands/test.d.ts.map +0 -1
  304. package/dist/commands/test.js +0 -7
  305. package/dist/commands/test.js.map +0 -1
  306. package/dist/commands/workflow/provider/list.d.ts +0 -10
  307. package/dist/commands/workflow/provider/list.d.ts.map +0 -1
  308. package/dist/commands/workflow/provider/list.js +0 -13
  309. package/dist/commands/workflow/provider/list.js.map +0 -1
  310. package/dist/commands/workflow/provider/rotate.d.ts +0 -15
  311. package/dist/commands/workflow/provider/rotate.d.ts.map +0 -1
  312. package/dist/commands/workflow/provider/rotate.js +0 -24
  313. package/dist/commands/workflow/provider/rotate.js.map +0 -1
  314. package/dist/native-authz.d.ts +0 -4
  315. package/dist/native-authz.d.ts.map +0 -1
  316. package/dist/native-authz.js +0 -25
  317. package/dist/native-authz.js.map +0 -1
  318. package/dist/secret-value.d.ts +0 -5
  319. package/dist/secret-value.d.ts.map +0 -1
  320. package/dist/secret-value.js +0 -15
  321. package/dist/secret-value.js.map +0 -1
@@ -0,0 +1,62 @@
1
+ import assert from 'node:assert/strict';
2
+ import { spawn } from 'node:child_process';
3
+ import { createServer } from 'node:net';
4
+ import { networkInterfaces } from 'node:os';
5
+ import { resolve } from 'node:path';
6
+ import test from 'node:test';
7
+
8
+ test('Vite is reachable on loopback and not on a LAN interface', async t => {
9
+ const port = await freePort();
10
+ const root = resolve(import.meta.dirname, '..');
11
+ const child = spawn('pnpm', ['exec', 'vite', '--port', String(port), '--strictPort'], {
12
+ cwd: root,
13
+ stdio: 'ignore',
14
+ env: {
15
+ ...process.env,
16
+ OPENXIANGDA_WEB_PORT: String(port),
17
+ OPENXIANGDA_DEV_PROXY: 'http://127.0.0.1:7001',
18
+ },
19
+ });
20
+ try {
21
+ await waitFor(`http://127.0.0.1:${port}`);
22
+ const lan = Object.values(networkInterfaces())
23
+ .flat()
24
+ .find(address => address?.family === 'IPv4' && !address.internal)?.address;
25
+ if (!lan) {
26
+ t.diagnostic('No non-loopback IPv4 interface; loopback reachability verified.');
27
+ return;
28
+ }
29
+ await assert.rejects(
30
+ fetch(`http://${lan}:${port}`, {
31
+ signal: AbortSignal.timeout(500),
32
+ })
33
+ );
34
+ } finally {
35
+ child.kill('SIGTERM');
36
+ await new Promise(resolve => child.once('exit', resolve));
37
+ }
38
+ });
39
+
40
+ async function freePort() {
41
+ return await new Promise<number>((resolve, reject) => {
42
+ const server = createServer();
43
+ server.once('error', reject);
44
+ server.listen({ host: '127.0.0.1', port: 0 }, () => {
45
+ const address = server.address();
46
+ const port = typeof address === 'object' && address ? address.port : 0;
47
+ server.close(error => (error ? reject(error) : resolve(port)));
48
+ });
49
+ });
50
+ }
51
+
52
+ async function waitFor(url: string) {
53
+ const deadline = Date.now() + 10_000;
54
+ while (Date.now() < deadline) {
55
+ try {
56
+ const response = await fetch(url);
57
+ if (response.ok) return;
58
+ } catch {}
59
+ await new Promise(resolve => setTimeout(resolve, 100));
60
+ }
61
+ throw new Error(`VITE_READINESS_TIMEOUT:${url}`);
62
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "module": "ESNext",
5
+ "moduleResolution": "Bundler",
6
+ "jsx": "react-jsx",
7
+ "noEmit": true,
8
+ "exactOptionalPropertyTypes": false,
9
+ "types": ["vite/client", "node"]
10
+ },
11
+ "include": ["src", "test", "vite.config.ts", "playwright.config.ts"]
12
+ }
@@ -0,0 +1,32 @@
1
+ import react from '@vitejs/plugin-react';
2
+ import { defineConfig } from 'vite';
3
+
4
+ const connectedProxy =
5
+ process.env.OPENXIANGDA_DEV_PROXY?.trim() || 'http://127.0.0.1:7001';
6
+ const port = Number(process.env.OPENXIANGDA_WEB_PORT || 5173);
7
+
8
+ export default defineConfig({
9
+ plugins: [react()],
10
+ base: './',
11
+ server: {
12
+ host: '127.0.0.1',
13
+ port,
14
+ strictPort: true,
15
+ proxy: {
16
+ '/service': { target: connectedProxy, changeOrigin: false },
17
+ '/api': { target: connectedProxy, changeOrigin: false },
18
+ },
19
+ },
20
+ build: {
21
+ sourcemap: false,
22
+ rollupOptions: {
23
+ output: {
24
+ manualChunks: {
25
+ react: ['react', 'react-dom', 'react-router-dom'],
26
+ refine: ['@refinedev/core'],
27
+ antd: ['antd', '@ant-design/icons'],
28
+ },
29
+ },
30
+ },
31
+ },
32
+ });
@@ -0,0 +1,77 @@
1
+ import { defineOpenXiangdaApp } from 'openxiangda-devkit-core';
2
+ import {
3
+ instruments,
4
+ protectedFieldCapabilities,
5
+ } from './platform/data/instruments.js';
6
+
7
+ const read = 'app:instrument-center:data:instruments:read';
8
+ const create = 'app:instrument-center:data:instruments:create';
9
+ const update = 'app:instrument-center:data:instruments:update';
10
+ const remove = 'app:instrument-center:data:instruments:delete';
11
+ const inspectContext = 'app:instrument-center:instrument:context:read';
12
+ const allProtectedFieldCapabilities = Object.values(
13
+ protectedFieldCapabilities
14
+ ).flatMap(capabilities => [capabilities.create, capabilities.update]);
15
+ const collegeCreateCapabilities = Object.values(
16
+ protectedFieldCapabilities
17
+ ).map(capabilities => capabilities.create);
18
+ const collegeUpdateCapabilities = Object.entries(protectedFieldCapabilities)
19
+ .filter(([field]) => field !== 'collegeId')
20
+ .map(([, capabilities]) => capabilities.update);
21
+
22
+ export default defineOpenXiangdaApp({
23
+ schemaVersion: 3,
24
+ app: { code: 'instrument-center', name: '仪器资源管理' },
25
+ frontend: {
26
+ root: 'apps/web',
27
+ routes: [
28
+ { code: 'instruments', path: '/instruments', label: '仪器资源', surface: 'admin', navigation: 'menu', capability: read },
29
+ { code: 'instrument-create', path: '/instruments/new', label: '新增仪器', surface: 'admin', navigation: 'hidden', parentCode: 'instruments', capability: create },
30
+ { code: 'instrument-edit', path: '/instruments/:id/edit', label: '编辑仪器', surface: 'admin', navigation: 'hidden', parentCode: 'instruments', capability: update },
31
+ { code: 'instrument-detail', path: '/instruments/:id', label: '仪器详情', surface: 'admin', navigation: 'hidden', parentCode: 'instruments', capability: read },
32
+ ],
33
+ },
34
+ backend: {
35
+ root: 'apps/server',
36
+ runtime: 'node',
37
+ framework: 'nestjs',
38
+ runMode: 'shared',
39
+ secrets: [],
40
+ operations: [
41
+ {
42
+ code: 'instrument-context.inspect',
43
+ method: 'GET',
44
+ path: '/api/instruments/context',
45
+ capability: inspectContext,
46
+ requestSchema: { type: 'object', additionalProperties: false },
47
+ responseSchema: { type: 'object' },
48
+ },
49
+ ],
50
+ },
51
+ platform: { root: 'platform' },
52
+ authz: {
53
+ capabilities: [
54
+ { code: inspectContext, kind: 'backend', name: '查看当前应用身份摘要' },
55
+ ],
56
+ roles: [
57
+ { code: 'school_admin', name: '学校管理员', capabilities: [read, create, update, remove, ...allProtectedFieldCapabilities, inspectContext] },
58
+ { code: 'college_admin', name: '学院管理员', capabilities: [read, create, update, remove, ...collegeCreateCapabilities, ...collegeUpdateCapabilities, inspectContext] },
59
+ { code: 'instrument_admin', name: '仪器管理员', capabilities: [read, update, inspectContext] },
60
+ ],
61
+ scopeDimensions: [{ code: 'college', name: '学院', valueType: 'string', hierarchyMode: 'flat' }],
62
+ dataPolicies: [
63
+ {
64
+ code: 'instrument-access',
65
+ name: '仪器数据范围',
66
+ resourceCode: 'instruments',
67
+ unrestrictedRoleCodes: ['school_admin'],
68
+ matchMode: 'OR',
69
+ rules: [
70
+ { dimensionCode: 'college', field: 'collegeId', roleCodes: ['college_admin'] },
71
+ { subject: 'current_user', field: 'instrumentAdminIds', roleCodes: ['instrument_admin'] },
72
+ ],
73
+ },
74
+ ],
75
+ },
76
+ data: { resources: [instruments] },
77
+ });
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "openxiangda-application",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "packageManager": "pnpm@10.15.1",
6
+ "engines": {
7
+ "node": ">=22.12"
8
+ },
9
+ "scripts": {
10
+ "prepare": "pnpm workspace:build",
11
+ "workspace:build": "pnpm --filter @app/contracts build",
12
+ "predev": "pnpm workspace:build",
13
+ "dev": "pnpm --parallel --filter './apps/*' dev",
14
+ "dev:web": "pnpm --filter @app/web dev",
15
+ "dev:server": "pnpm --filter @app/server dev",
16
+ "precheck": "pnpm workspace:build",
17
+ "check": "pnpm --recursive check && node scripts/verify-template-budget.mjs",
18
+ "pretest": "pnpm workspace:build",
19
+ "test": "pnpm --recursive test",
20
+ "test:e2e": "pnpm --filter @app/web test:e2e",
21
+ "build": "pnpm --recursive build"
22
+ },
23
+ "devDependencies": {
24
+ "openxiangda-cli": "2.0.0-alpha.56",
25
+ "openxiangda-contracts": "2.0.0-alpha.26",
26
+ "openxiangda-devkit-core": "2.0.0-alpha.33",
27
+ "typescript": "5.9.3"
28
+ }
29
+ }
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "@app/contracts",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "openxiangda-source": "./src/index.ts",
12
+ "import": "./dist/index.js"
13
+ }
14
+ },
15
+ "scripts": {
16
+ "check": "tsc -p tsconfig.json --noEmit",
17
+ "test": "node -e \"process.stdout.write('generated contracts checked by TypeScript\\n')\"",
18
+ "build": "tsc -p tsconfig.json"
19
+ },
20
+ "devDependencies": {
21
+ "typescript": "5.9.3"
22
+ }
23
+ }
@@ -0,0 +1,129 @@
1
+ // Generated by OpenXiangda 2.0 Native compiler. Do not edit by hand.
2
+ export const compilerContractVersion = "native-2" as const;
3
+ export const appCode = "instrument-center" as const;
4
+ export const resourceCodes = [
5
+ "instruments"
6
+ ] as const;
7
+ export const capabilities = [
8
+ "app:instrument-center:data:instruments:create",
9
+ "app:instrument-center:data:instruments:delete",
10
+ "app:instrument-center:data:instruments:read",
11
+ "app:instrument-center:data:instruments:update",
12
+ "app:instrument-center:directory:read",
13
+ "app:instrument-center:instrument:context:read",
14
+ "app:instrument-center:instrument:field:asset-code:create",
15
+ "app:instrument-center:instrument:field:asset-code:update",
16
+ "app:instrument-center:instrument:field:asset-value:create",
17
+ "app:instrument-center:instrument:field:asset-value:update",
18
+ "app:instrument-center:instrument:field:college-id:create",
19
+ "app:instrument-center:instrument:field:college-id:update",
20
+ "app:instrument-center:instrument:field:instrument-admin-ids:create",
21
+ "app:instrument-center:instrument:field:instrument-admin-ids:update",
22
+ "app:instrument-center:instrument:field:instrument-code:create",
23
+ "app:instrument-center:instrument:field:instrument-code:update",
24
+ "app:role:assign",
25
+ "app:role:define",
26
+ "app:role:grant-capability",
27
+ "app:role:read",
28
+ "app:scope-grant:manage",
29
+ "app:super-admin:manage"
30
+ ] as const;
31
+ export const appOperations = {
32
+ instrumentContextInspect: {
33
+ "code": "instrument-context.inspect",
34
+ "method": "GET",
35
+ "path": "/api/instruments/context",
36
+ "requiredCapability": "app:instrument-center:instrument:context:read",
37
+ "requestSchemaDigest": "cd1a463c46d6264134447db17a8c3c7abe5b9a2488c6d759fea66da1f96b133e",
38
+ "responseSchemaDigest": "a2c799262a3ce3c19ef5cdd983bf3d12b43ab3c426227091b909dcb7054738c0"
39
+ }
40
+ } as const;
41
+ export const appRoutes = {
42
+ instrumentCreate: {
43
+ "code": "instrument-create",
44
+ "path": "/instruments/new",
45
+ "label": "新增仪器",
46
+ "surface": "admin",
47
+ "navigation": "hidden",
48
+ "parentCode": "instruments",
49
+ "capability": "app:instrument-center:data:instruments:create",
50
+ "tabPersistence": "session",
51
+ "keepAlive": "none"
52
+ },
53
+ instrumentDetail: {
54
+ "code": "instrument-detail",
55
+ "path": "/instruments/:id",
56
+ "label": "仪器详情",
57
+ "surface": "admin",
58
+ "navigation": "hidden",
59
+ "parentCode": "instruments",
60
+ "capability": "app:instrument-center:data:instruments:read",
61
+ "tabPersistence": "none",
62
+ "keepAlive": "none"
63
+ },
64
+ instrumentEdit: {
65
+ "code": "instrument-edit",
66
+ "path": "/instruments/:id/edit",
67
+ "label": "编辑仪器",
68
+ "surface": "admin",
69
+ "navigation": "hidden",
70
+ "parentCode": "instruments",
71
+ "capability": "app:instrument-center:data:instruments:update",
72
+ "tabPersistence": "none",
73
+ "keepAlive": "none"
74
+ },
75
+ instruments: {
76
+ "code": "instruments",
77
+ "path": "/instruments",
78
+ "label": "仪器资源",
79
+ "surface": "admin",
80
+ "navigation": "menu",
81
+ "capability": "app:instrument-center:data:instruments:read",
82
+ "tabPersistence": "session",
83
+ "keepAlive": "none"
84
+ }
85
+ } as const;
86
+ export const eventTypes = [] as const;
87
+ export const eventSubscriptionCodes = [] as const;
88
+ export const workflowCodes = [] as const;
89
+
90
+ export type ResourceCode = (typeof resourceCodes)[number];
91
+ export type Capability = (typeof capabilities)[number];
92
+ export type AppOperation = (typeof appOperations)[keyof typeof appOperations];
93
+ export type AppRoute = (typeof appRoutes)[keyof typeof appRoutes];
94
+ export type EventType = (typeof eventTypes)[number];
95
+ export type EventSubscriptionCode = (typeof eventSubscriptionCodes)[number];
96
+ export type WorkflowCode = (typeof workflowCodes)[number];
97
+
98
+ export interface InstrumentsRecord {
99
+ id: string;
100
+ revision: number;
101
+ instrumentCode: string;
102
+ chineseName: string;
103
+ englishName?: string | null;
104
+ aliasName?: string | null;
105
+ image?: string | null;
106
+ specModel: string;
107
+ categoryId: string;
108
+ instrumentSource?: string | null;
109
+ manufacturer?: string | null;
110
+ assetCode: string;
111
+ assetValue?: number | null;
112
+ enabledDate: string;
113
+ usageStatus: string;
114
+ instrumentStatus: string;
115
+ openToOutside: boolean;
116
+ subjectAreas?: unknown | null;
117
+ platformProperty?: string | null;
118
+ collegeId: string;
119
+ manageDepartmentId: string;
120
+ useDepartmentId: string;
121
+ instrumentAdminIds: unknown;
122
+ contactUserIds: unknown;
123
+ contactPhone: string;
124
+ contactEmail?: string | null;
125
+ locationId?: string | null;
126
+ address?: string | null;
127
+ serviceContent?: string | null;
128
+ attachments?: string | null;
129
+ }
@@ -0,0 +1 @@
1
+ export * from './generated.js';
@@ -0,0 +1,9 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "outDir": "dist",
5
+ "rootDir": "src",
6
+ "declaration": true
7
+ },
8
+ "include": ["src/**/*.ts"]
9
+ }
@@ -0,0 +1,81 @@
1
+ import { SCHEMA_VERSIONS, type DataResource } from 'openxiangda-contracts';
2
+
3
+ export const protectedFieldCapabilities = {
4
+ instrumentCode: {
5
+ create: 'app:instrument-center:instrument:field:instrument-code:create',
6
+ update: 'app:instrument-center:instrument:field:instrument-code:update',
7
+ },
8
+ assetCode: {
9
+ create: 'app:instrument-center:instrument:field:asset-code:create',
10
+ update: 'app:instrument-center:instrument:field:asset-code:update',
11
+ },
12
+ assetValue: {
13
+ create: 'app:instrument-center:instrument:field:asset-value:create',
14
+ update: 'app:instrument-center:instrument:field:asset-value:update',
15
+ },
16
+ collegeId: {
17
+ create: 'app:instrument-center:instrument:field:college-id:create',
18
+ update: 'app:instrument-center:instrument:field:college-id:update',
19
+ },
20
+ instrumentAdminIds: {
21
+ create:
22
+ 'app:instrument-center:instrument:field:instrument-admin-ids:create',
23
+ update:
24
+ 'app:instrument-center:instrument:field:instrument-admin-ids:update',
25
+ },
26
+ } as const;
27
+
28
+ export const instruments: DataResource = {
29
+ schemaVersion: SCHEMA_VERSIONS.dataResource,
30
+ appCode: 'instrument-center',
31
+ code: 'instruments',
32
+ name: '仪器资源',
33
+ schema: {
34
+ fields: [
35
+ { code: 'instrumentCode', type: 'string', nullable: false, indexed: true },
36
+ { code: 'chineseName', type: 'string', nullable: false, indexed: true },
37
+ { code: 'englishName', type: 'string' },
38
+ { code: 'aliasName', type: 'string' },
39
+ { code: 'image', type: 'file', file: { maxCount: 1, maxSizeMb: 10, accept: ['image/*'] } },
40
+ { code: 'specModel', type: 'string', nullable: false },
41
+ { code: 'categoryId', type: 'string', nullable: false, indexed: true },
42
+ { code: 'instrumentSource', type: 'string' },
43
+ { code: 'manufacturer', type: 'string' },
44
+ { code: 'assetCode', type: 'string', nullable: false, indexed: true },
45
+ { code: 'assetValue', type: 'decimal' },
46
+ { code: 'enabledDate', type: 'date', nullable: false },
47
+ { code: 'usageStatus', type: 'string', nullable: false },
48
+ { code: 'instrumentStatus', type: 'string', nullable: false, indexed: true },
49
+ { code: 'openToOutside', type: 'boolean', nullable: false },
50
+ { code: 'subjectAreas', type: 'json' },
51
+ { code: 'platformProperty', type: 'string' },
52
+ { code: 'collegeId', type: 'string', nullable: false, indexed: true },
53
+ { code: 'manageDepartmentId', type: 'string', nullable: false },
54
+ { code: 'useDepartmentId', type: 'string', nullable: false },
55
+ { code: 'instrumentAdminIds', type: 'json', nullable: false, indexed: true },
56
+ { code: 'contactUserIds', type: 'json', nullable: false },
57
+ { code: 'contactPhone', type: 'string', nullable: false },
58
+ { code: 'contactEmail', type: 'string' },
59
+ { code: 'locationId', type: 'string' },
60
+ { code: 'address', type: 'text' },
61
+ { code: 'serviceContent', type: 'text' },
62
+ { code: 'attachments', type: 'file', file: { multiple: true, maxCount: 8, maxSizeMb: 50 } },
63
+ ],
64
+ },
65
+ capabilities: {
66
+ read: 'app:instrument-center:data:instruments:read',
67
+ create: 'app:instrument-center:data:instruments:create',
68
+ update: 'app:instrument-center:data:instruments:update',
69
+ delete: 'app:instrument-center:data:instruments:delete',
70
+ },
71
+ dataPolicyCode: 'instrument-access',
72
+ fieldPolicies: Object.fromEntries(
73
+ Object.entries(protectedFieldCapabilities).map(([code, capabilities]) => [
74
+ code,
75
+ {
76
+ create: [capabilities.create],
77
+ update: [capabilities.update],
78
+ },
79
+ ])
80
+ ),
81
+ };
@@ -0,0 +1,7 @@
1
+ packages:
2
+ - apps/*
3
+ - packages/*
4
+
5
+ strictDepBuilds: true
6
+ onlyBuiltDependencies:
7
+ - esbuild
@@ -0,0 +1,37 @@
1
+ import { readFileSync, readdirSync, statSync } from 'node:fs';
2
+ import { join, relative, resolve } from 'node:path';
3
+
4
+ const root = resolve(import.meta.dirname, '..');
5
+ const generated = /(?:^|\/)(?:node_modules|dist|coverage|playwright-report|test-results|\.openxiangda|\.turbo|\.turbopack|\.umi|\.umi-production)(?:\/|$)/;
6
+ const sourceExtensions = /\.(?:[cm]?[jt]sx?|css|html|json|md|ya?ml)$/;
7
+ const files = [];
8
+ function visit(directory) {
9
+ for (const entry of readdirSync(directory, { withFileTypes: true })) {
10
+ const path = join(directory, entry.name);
11
+ const name = relative(root, path).replaceAll('\\', '/');
12
+ if (generated.test(name)) continue;
13
+ if (entry.isDirectory()) visit(path);
14
+ else if (entry.isFile() && sourceExtensions.test(name)) files.push(path);
15
+ }
16
+ }
17
+ visit(root);
18
+ const bytes = files.reduce((total, file) => total + statSync(file).size, 0);
19
+ if (files.length > 50) throw new Error(`TEMPLATE_SOURCE_FILE_BUDGET_EXCEEDED:${files.length}>50`);
20
+ if (bytes > 500_000) throw new Error(`TEMPLATE_SOURCE_BYTE_BUDGET_EXCEEDED:${bytes}>500000`);
21
+ const productionFiles = files.filter(file => {
22
+ const name = relative(root, file).replaceAll('\\', '/');
23
+ return (
24
+ name === 'package.json' ||
25
+ name === 'openxiangda.config.ts' ||
26
+ name.startsWith('platform/') ||
27
+ (name.startsWith('apps/') &&
28
+ !name.includes('/test/') &&
29
+ !name.includes('/e2e/') &&
30
+ !name.includes('/scripts/'))
31
+ );
32
+ });
33
+ const source = productionFiles.map(file => readFileSync(file, 'utf8')).join('\n');
34
+ for (const marker of ['@umijs/', 'openxiangda-' + 'admin', 'openxiangda-' + 'user', 'instrument_query', 'instrument_save', 'function.invoke', 'departmentScopeKey', 'instrumentScopeKey', 'adminUserIds']) {
35
+ if (source.includes(marker)) throw new Error(`TEMPLATE_FORBIDDEN_MARKER:${marker}`);
36
+ }
37
+ process.stdout.write(`Verified compact template: ${files.length} source files, ${bytes} bytes.\n`);
@@ -0,0 +1,13 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "NodeNext",
5
+ "moduleResolution": "NodeNext",
6
+ "strict": true,
7
+ "noUncheckedIndexedAccess": true,
8
+ "exactOptionalPropertyTypes": true,
9
+ "skipLibCheck": true,
10
+ "experimentalDecorators": true,
11
+ "emitDecoratorMetadata": true
12
+ }
13
+ }
@@ -1,15 +0,0 @@
1
- import { OpenXiangdaCommand } from "../../base.js";
2
- export default class AppCreate extends OpenXiangdaCommand {
3
- static summary: string;
4
- static args: {
5
- directory: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
6
- };
7
- static flags: {
8
- "app-code": import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
9
- name: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
10
- install: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
- "local-sdk": import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
- };
13
- run(): Promise<import("openxiangda-contracts").DevkitResult<unknown>>;
14
- }
15
- //# sourceMappingURL=create.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/commands/app/create.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,kBAAkB;IACvD,MAAM,CAAC,OAAO,SAA+B;IAC7C,MAAM,CAAC,IAAI;;MAAkD;IAC7D,MAAM,CAAC,KAAK;;;;;MAOV;IAEI,GAAG;CA0BV"}
@@ -1,42 +0,0 @@
1
- import { Args, Flags } from "@oclif/core";
2
- import { createWorkspace } from "create-openxiangda";
3
- import { OpenXiangdaCommand } from "../../base.js";
4
- export default class AppCreate extends OpenXiangdaCommand {
5
- static summary = "从官方模板创建 React + NestJS 应用";
6
- static args = { directory: Args.string({ required: true }) };
7
- static flags = {
8
- "app-code": Flags.string({ required: true, summary: "稳定应用代码" }),
9
- name: Flags.string({ required: true, summary: "应用名称" }),
10
- install: Flags.boolean({ summary: "创建后安装依赖" }),
11
- "local-sdk": Flags.string({
12
- summary: "把本地 OpenXiangda 2.0 SDK 打包为验收工件,不经过 npm 发布",
13
- }),
14
- };
15
- async run() {
16
- const { args, flags } = await this.parse(AppCreate);
17
- const data = await createWorkspace({
18
- directory: args.directory,
19
- appCode: flags["app-code"],
20
- name: flags.name,
21
- install: flags.install,
22
- ...(flags["local-sdk"]
23
- ? { localSdkRoot: flags["local-sdk"] }
24
- : {}),
25
- });
26
- return this.present({
27
- ok: true,
28
- operation: "app.create",
29
- workspace: { appCode: data.appCode, name: data.name, root: data.root },
30
- data,
31
- diagnostics: [],
32
- nextActions: [
33
- {
34
- code: "check",
35
- label: "检查应用",
36
- command: `cd ${data.root} && openxiangda check`,
37
- },
38
- ],
39
- });
40
- }
41
- }
42
- //# sourceMappingURL=create.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"create.js","sourceRoot":"","sources":["../../../src/commands/app/create.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,kBAAkB;IACvD,MAAM,CAAC,OAAO,GAAG,2BAA2B,CAAC;IAC7C,MAAM,CAAC,IAAI,GAAG,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAC7D,MAAM,CAAC,KAAK,GAAG;QACb,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;QAC/D,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QACvD,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC;QAC9C,WAAW,EAAE,KAAK,CAAC,MAAM,CAAC;YACxB,OAAO,EAAE,4CAA4C;SACtD,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACpD,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC;YACjC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,KAAK,CAAC,UAAU,CAAC;YAC1B,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC;gBACpB,CAAC,CAAC,EAAE,YAAY,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE;gBACtC,CAAC,CAAC,EAAE,CAAC;SACR,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,OAAO,CAAC;YAClB,EAAE,EAAE,IAAI;YACR,SAAS,EAAE,YAAY;YACvB,SAAS,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YACtE,IAAI;YACJ,WAAW,EAAE,EAAE;YACf,WAAW,EAAE;gBACX;oBACE,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,MAAM;oBACb,OAAO,EAAE,MAAM,IAAI,CAAC,IAAI,uBAAuB;iBAChD;aACF;SACF,CAAC,CAAC;IACL,CAAC"}
@@ -1,9 +0,0 @@
1
- import { OpenXiangdaCommand } from '../../base.js';
2
- export default class AppInfo extends OpenXiangdaCommand {
3
- static summary: string;
4
- static flags: {
5
- cwd: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
6
- };
7
- run(): Promise<import("openxiangda-contracts").DevkitResult<unknown>>;
8
- }
9
- //# sourceMappingURL=info.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"info.d.ts","sourceRoot":"","sources":["../../../src/commands/app/info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAkB,MAAM,eAAe,CAAC;AAEnE,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,kBAAkB;IACrD,MAAM,CAAC,OAAO,SAAqB;IACnC,MAAM,CAAC,KAAK;;MAAkB;IACxB,GAAG;CAIV"}
@@ -1,10 +0,0 @@
1
- import { OpenXiangdaCommand, workspaceFlags } from '../../base.js';
2
- export default class AppInfo extends OpenXiangdaCommand {
3
- static summary = '读取 2.0 应用工作区上下文';
4
- static flags = workspaceFlags;
5
- async run() {
6
- const { flags } = await this.parse(AppInfo);
7
- return this.present(await this.services.workspaceContext(flags.cwd));
8
- }
9
- }
10
- //# sourceMappingURL=info.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"info.js","sourceRoot":"","sources":["../../../src/commands/app/info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAEnE,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,kBAAkB;IACrD,MAAM,CAAC,OAAO,GAAG,iBAAiB,CAAC;IACnC,MAAM,CAAC,KAAK,GAAG,cAAc,CAAC;IAC9B,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACvE,CAAC"}
@@ -1,10 +0,0 @@
1
- import { OpenXiangdaCommand } from '../../base.js';
2
- export default class AppLink extends OpenXiangdaCommand {
3
- static summary: string;
4
- static flags: {
5
- 'base-url': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
6
- cwd: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
7
- };
8
- run(): Promise<import("openxiangda-contracts").DevkitResult<unknown>>;
9
- }
10
- //# sourceMappingURL=link.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../../../src/commands/app/link.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAkB,MAAM,eAAe,CAAC;AAEnE,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,kBAAkB;IACrD,MAAM,CAAC,OAAO,SAAiB;IAC/B,MAAM,CAAC,KAAK;;;MAGV;IAEI,GAAG;CAQV"}
@@ -1,16 +0,0 @@
1
- import { Flags } from '@oclif/core';
2
- import { OpenXiangdaCommand, workspaceFlags } from '../../base.js';
3
- export default class AppLink extends OpenXiangdaCommand {
4
- static summary = '绑定 2.0 平台地址';
5
- static flags = {
6
- ...workspaceFlags,
7
- 'base-url': Flags.string({ required: true }),
8
- };
9
- async run() {
10
- const { flags } = await this.parse(AppLink);
11
- return this.present(await this.services.linkApplication(flags.cwd, {
12
- baseUrl: flags['base-url'],
13
- }));
14
- }
15
- }
16
- //# sourceMappingURL=link.js.map