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.
- package/README.md +4 -18
- package/bin/run.js +67 -1
- package/dist/base.d.ts +36 -7
- package/dist/base.d.ts.map +1 -1
- package/dist/base.js +95 -18
- package/dist/base.js.map +1 -1
- package/dist/commands/check.d.ts +14 -1
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/create.d.ts +23 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +93 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/deploy.d.ts +19 -8
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +29 -16
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/dev.d.ts +14 -3
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +4 -8
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/login.d.ts +24 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/{auth/login.js → login.js} +27 -9
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/logs.d.ts +15 -2
- package/dist/commands/logs.d.ts.map +1 -1
- package/dist/commands/logs.js +2 -2
- package/dist/commands/logs.js.map +1 -1
- package/dist/commands/rollback.d.ts +15 -4
- package/dist/commands/rollback.d.ts.map +1 -1
- package/dist/commands/rollback.js +11 -4
- package/dist/commands/rollback.js.map +1 -1
- package/dist/commands/status.d.ts +14 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +1 -1
- package/dist/commands/status.js.map +1 -1
- package/dist/create-workspace.d.ts +23 -0
- package/dist/create-workspace.d.ts.map +1 -0
- package/dist/create-workspace.js +279 -0
- package/dist/create-workspace.js.map +1 -0
- package/package.json +14 -7
- package/template/.dockerignore +12 -0
- package/template/.env.example +3 -0
- package/template/AGENTS.md +8 -0
- package/template/README.md +23 -0
- package/template/_gitignore +14 -0
- package/template/apps/server/Dockerfile +19 -0
- package/template/apps/server/package.json +27 -0
- package/template/apps/server/src/app.module.ts +32 -0
- package/template/apps/server/src/instrument-context.controller.ts +25 -0
- package/template/apps/server/src/main.ts +18 -0
- package/template/apps/server/test/smoke.test.ts +28 -0
- package/template/apps/server/tsconfig.json +9 -0
- package/template/apps/web/e2e/instruments.spec.ts +150 -0
- package/template/apps/web/index.html +12 -0
- package/template/apps/web/package.json +33 -0
- package/template/apps/web/playwright.config.ts +21 -0
- package/template/apps/web/scripts/check.mjs +32 -0
- package/template/apps/web/scripts/verify-build.mjs +20 -0
- package/template/apps/web/src/InstrumentDetailPage.tsx +60 -0
- package/template/apps/web/src/InstrumentForm.tsx +322 -0
- package/template/apps/web/src/InstrumentFormPage.tsx +77 -0
- package/template/apps/web/src/InstrumentListPage.tsx +390 -0
- package/template/apps/web/src/Shell.tsx +52 -0
- package/template/apps/web/src/data-provider.ts +42 -0
- package/template/apps/web/src/fields.ts +72 -0
- package/template/apps/web/src/instrument.ts +55 -0
- package/template/apps/web/src/main.tsx +58 -0
- package/template/apps/web/src/platform-client.ts +246 -0
- package/template/apps/web/src/runtime-meta.ts +60 -0
- package/template/apps/web/src/runtime.tsx +73 -0
- package/template/apps/web/src/styles.css +84 -0
- package/template/apps/web/test/contracts.test.ts +234 -0
- package/template/apps/web/test/loopback.test.ts +62 -0
- package/template/apps/web/tsconfig.json +12 -0
- package/template/apps/web/vite.config.ts +32 -0
- package/template/openxiangda.config.ts +77 -0
- package/template/package.json +29 -0
- package/template/packages/contracts/package.json +23 -0
- package/template/packages/contracts/src/generated.ts +129 -0
- package/template/packages/contracts/src/index.ts +1 -0
- package/template/packages/contracts/tsconfig.json +9 -0
- package/template/platform/data/instruments.ts +81 -0
- package/template/pnpm-workspace.yaml +7 -0
- package/template/scripts/verify-template-budget.mjs +37 -0
- package/template/tsconfig.base.json +13 -0
- package/dist/commands/app/create.d.ts +0 -15
- package/dist/commands/app/create.d.ts.map +0 -1
- package/dist/commands/app/create.js +0 -42
- package/dist/commands/app/create.js.map +0 -1
- package/dist/commands/app/info.d.ts +0 -9
- package/dist/commands/app/info.d.ts.map +0 -1
- package/dist/commands/app/info.js +0 -10
- package/dist/commands/app/info.js.map +0 -1
- package/dist/commands/app/link.d.ts +0 -10
- package/dist/commands/app/link.d.ts.map +0 -1
- package/dist/commands/app/link.js +0 -16
- package/dist/commands/app/link.js.map +0 -1
- package/dist/commands/app/provision.d.ts +0 -9
- package/dist/commands/app/provision.d.ts.map +0 -1
- package/dist/commands/app/provision.js +0 -10
- package/dist/commands/app/provision.js.map +0 -1
- package/dist/commands/auth/login.d.ts +0 -11
- package/dist/commands/auth/login.d.ts.map +0 -1
- package/dist/commands/auth/login.js.map +0 -1
- package/dist/commands/auth/logout.d.ts +0 -6
- package/dist/commands/auth/logout.d.ts.map +0 -1
- package/dist/commands/auth/logout.js +0 -30
- package/dist/commands/auth/logout.js.map +0 -1
- package/dist/commands/auth/status.d.ts +0 -6
- package/dist/commands/auth/status.d.ts.map +0 -1
- package/dist/commands/auth/status.js +0 -60
- package/dist/commands/auth/status.js.map +0 -1
- package/dist/commands/authz/membership/grant.d.ts +0 -16
- package/dist/commands/authz/membership/grant.d.ts.map +0 -1
- package/dist/commands/authz/membership/grant.js +0 -32
- package/dist/commands/authz/membership/grant.js.map +0 -1
- package/dist/commands/authz/membership/list.d.ts +0 -16
- package/dist/commands/authz/membership/list.d.ts.map +0 -1
- package/dist/commands/authz/membership/list.js +0 -34
- package/dist/commands/authz/membership/list.js.map +0 -1
- package/dist/commands/authz/membership/revoke.d.ts +0 -15
- package/dist/commands/authz/membership/revoke.d.ts.map +0 -1
- package/dist/commands/authz/membership/revoke.js +0 -22
- package/dist/commands/authz/membership/revoke.js.map +0 -1
- package/dist/commands/authz/membership/update.d.ts +0 -18
- package/dist/commands/authz/membership/update.d.ts.map +0 -1
- package/dist/commands/authz/membership/update.js +0 -31
- package/dist/commands/authz/membership/update.js.map +0 -1
- package/dist/commands/authz/relationship/grant.d.ts +0 -20
- package/dist/commands/authz/relationship/grant.d.ts.map +0 -1
- package/dist/commands/authz/relationship/grant.js +0 -40
- package/dist/commands/authz/relationship/grant.js.map +0 -1
- package/dist/commands/authz/relationship/list.d.ts +0 -18
- package/dist/commands/authz/relationship/list.d.ts.map +0 -1
- package/dist/commands/authz/relationship/list.js +0 -43
- package/dist/commands/authz/relationship/list.js.map +0 -1
- package/dist/commands/authz/relationship/revoke.d.ts +0 -15
- package/dist/commands/authz/relationship/revoke.d.ts.map +0 -1
- package/dist/commands/authz/relationship/revoke.js +0 -22
- package/dist/commands/authz/relationship/revoke.js.map +0 -1
- package/dist/commands/authz/relationship/update.d.ts +0 -18
- package/dist/commands/authz/relationship/update.d.ts.map +0 -1
- package/dist/commands/authz/relationship/update.js +0 -28
- package/dist/commands/authz/relationship/update.js.map +0 -1
- package/dist/commands/authz/super-admin/grant.d.ts +0 -12
- package/dist/commands/authz/super-admin/grant.d.ts.map +0 -1
- package/dist/commands/authz/super-admin/grant.js +0 -20
- package/dist/commands/authz/super-admin/grant.js.map +0 -1
- package/dist/commands/authz/super-admin/list.d.ts +0 -15
- package/dist/commands/authz/super-admin/list.d.ts.map +0 -1
- package/dist/commands/authz/super-admin/list.js +0 -27
- package/dist/commands/authz/super-admin/list.js.map +0 -1
- package/dist/commands/authz/super-admin/revoke.d.ts +0 -15
- package/dist/commands/authz/super-admin/revoke.d.ts.map +0 -1
- package/dist/commands/authz/super-admin/revoke.js +0 -21
- package/dist/commands/authz/super-admin/revoke.js.map +0 -1
- package/dist/commands/build.d.ts +0 -11
- package/dist/commands/build.d.ts.map +0 -1
- package/dist/commands/build.js +0 -23
- package/dist/commands/build.js.map +0 -1
- package/dist/commands/cancel.d.ts +0 -12
- package/dist/commands/cancel.d.ts.map +0 -1
- package/dist/commands/cancel.js +0 -12
- package/dist/commands/cancel.js.map +0 -1
- package/dist/commands/dev/reset.d.ts +0 -10
- package/dist/commands/dev/reset.d.ts.map +0 -1
- package/dist/commands/dev/reset.js +0 -17
- package/dist/commands/dev/reset.js.map +0 -1
- package/dist/commands/dev/status.d.ts +0 -9
- package/dist/commands/dev/status.d.ts.map +0 -1
- package/dist/commands/dev/status.js +0 -10
- package/dist/commands/dev/status.js.map +0 -1
- package/dist/commands/dev/stop.d.ts +0 -9
- package/dist/commands/dev/stop.d.ts.map +0 -1
- package/dist/commands/dev/stop.js +0 -10
- package/dist/commands/dev/stop.js.map +0 -1
- package/dist/commands/doctor.d.ts +0 -9
- package/dist/commands/doctor.d.ts.map +0 -1
- package/dist/commands/doctor.js +0 -7
- package/dist/commands/doctor.js.map +0 -1
- package/dist/commands/environment/start.d.ts +0 -13
- package/dist/commands/environment/start.d.ts.map +0 -1
- package/dist/commands/environment/start.js +0 -22
- package/dist/commands/environment/start.js.map +0 -1
- package/dist/commands/environment/status.d.ts +0 -9
- package/dist/commands/environment/status.d.ts.map +0 -1
- package/dist/commands/environment/status.js +0 -10
- package/dist/commands/environment/status.js.map +0 -1
- package/dist/commands/environment/stop.d.ts +0 -13
- package/dist/commands/environment/stop.d.ts.map +0 -1
- package/dist/commands/environment/stop.js +0 -22
- package/dist/commands/environment/stop.js.map +0 -1
- package/dist/commands/event/delivery/list.d.ts +0 -10
- package/dist/commands/event/delivery/list.d.ts.map +0 -1
- package/dist/commands/event/delivery/list.js +0 -14
- package/dist/commands/event/delivery/list.js.map +0 -1
- package/dist/commands/event/delivery/replay.d.ts +0 -13
- package/dist/commands/event/delivery/replay.d.ts.map +0 -1
- package/dist/commands/event/delivery/replay.js +0 -16
- package/dist/commands/event/delivery/replay.js.map +0 -1
- package/dist/commands/event/subscription/list.d.ts +0 -9
- package/dist/commands/event/subscription/list.d.ts.map +0 -1
- package/dist/commands/event/subscription/list.js +0 -10
- package/dist/commands/event/subscription/list.js.map +0 -1
- package/dist/commands/event/subscription/rotate-secret.d.ts +0 -15
- package/dist/commands/event/subscription/rotate-secret.d.ts.map +0 -1
- package/dist/commands/event/subscription/rotate-secret.js +0 -33
- package/dist/commands/event/subscription/rotate-secret.js.map +0 -1
- package/dist/commands/event/subscription/status.d.ts +0 -14
- package/dist/commands/event/subscription/status.d.ts.map +0 -1
- package/dist/commands/event/subscription/status.js +0 -19
- package/dist/commands/event/subscription/status.js.map +0 -1
- package/dist/commands/event/timer/fire.d.ts +0 -12
- package/dist/commands/event/timer/fire.d.ts.map +0 -1
- package/dist/commands/event/timer/fire.js +0 -12
- package/dist/commands/event/timer/fire.js.map +0 -1
- package/dist/commands/event/timer/list.d.ts +0 -9
- package/dist/commands/event/timer/list.d.ts.map +0 -1
- package/dist/commands/event/timer/list.js +0 -10
- package/dist/commands/event/timer/list.js.map +0 -1
- package/dist/commands/event/timer/status.d.ts +0 -14
- package/dist/commands/event/timer/status.d.ts.map +0 -1
- package/dist/commands/event/timer/status.js +0 -19
- package/dist/commands/event/timer/status.js.map +0 -1
- package/dist/commands/generate.d.ts +0 -10
- package/dist/commands/generate.d.ts.map +0 -1
- package/dist/commands/generate.js +0 -8
- package/dist/commands/generate.js.map +0 -1
- package/dist/commands/oauth/audit/list.d.ts +0 -12
- package/dist/commands/oauth/audit/list.d.ts.map +0 -1
- package/dist/commands/oauth/audit/list.js +0 -20
- package/dist/commands/oauth/audit/list.js.map +0 -1
- package/dist/commands/oauth/client/create.d.ts +0 -13
- package/dist/commands/oauth/client/create.d.ts.map +0 -1
- package/dist/commands/oauth/client/create.js +0 -31
- package/dist/commands/oauth/client/create.js.map +0 -1
- package/dist/commands/oauth/client/list.d.ts +0 -9
- package/dist/commands/oauth/client/list.d.ts.map +0 -1
- package/dist/commands/oauth/client/list.js +0 -10
- package/dist/commands/oauth/client/list.js.map +0 -1
- package/dist/commands/oauth/client/revoke.d.ts +0 -12
- package/dist/commands/oauth/client/revoke.d.ts.map +0 -1
- package/dist/commands/oauth/client/revoke.js +0 -12
- package/dist/commands/oauth/client/revoke.js.map +0 -1
- package/dist/commands/oauth/client/rotate.d.ts +0 -13
- package/dist/commands/oauth/client/rotate.d.ts.map +0 -1
- package/dist/commands/oauth/client/rotate.js +0 -20
- package/dist/commands/oauth/client/rotate.js.map +0 -1
- package/dist/commands/oauth/client/update.d.ts +0 -15
- package/dist/commands/oauth/client/update.d.ts.map +0 -1
- package/dist/commands/oauth/client/update.js +0 -23
- package/dist/commands/oauth/client/update.js.map +0 -1
- package/dist/commands/oauth/runtime/rotate.d.ts +0 -12
- package/dist/commands/oauth/runtime/rotate.d.ts.map +0 -1
- package/dist/commands/oauth/runtime/rotate.js +0 -28
- package/dist/commands/oauth/runtime/rotate.js.map +0 -1
- package/dist/commands/oauth/runtime/status.d.ts +0 -10
- package/dist/commands/oauth/runtime/status.d.ts.map +0 -1
- package/dist/commands/oauth/runtime/status.js +0 -13
- package/dist/commands/oauth/runtime/status.js.map +0 -1
- package/dist/commands/promote.d.ts +0 -13
- package/dist/commands/promote.d.ts.map +0 -1
- package/dist/commands/promote.js +0 -9
- package/dist/commands/promote.js.map +0 -1
- package/dist/commands/retry.d.ts +0 -12
- package/dist/commands/retry.d.ts.map +0 -1
- package/dist/commands/retry.js +0 -9
- package/dist/commands/retry.js.map +0 -1
- package/dist/commands/secret/audit/list.d.ts +0 -14
- package/dist/commands/secret/audit/list.d.ts.map +0 -1
- package/dist/commands/secret/audit/list.js +0 -16
- package/dist/commands/secret/audit/list.js.map +0 -1
- package/dist/commands/secret/create.d.ts +0 -18
- package/dist/commands/secret/create.d.ts.map +0 -1
- package/dist/commands/secret/create.js +0 -33
- package/dist/commands/secret/create.js.map +0 -1
- package/dist/commands/secret/delete.d.ts +0 -15
- package/dist/commands/secret/delete.d.ts.map +0 -1
- package/dist/commands/secret/delete.js +0 -20
- package/dist/commands/secret/delete.js.map +0 -1
- package/dist/commands/secret/list.d.ts +0 -10
- package/dist/commands/secret/list.d.ts.map +0 -1
- package/dist/commands/secret/list.js +0 -13
- package/dist/commands/secret/list.js.map +0 -1
- package/dist/commands/secret/rotate.d.ts +0 -18
- package/dist/commands/secret/rotate.d.ts.map +0 -1
- package/dist/commands/secret/rotate.js +0 -30
- package/dist/commands/secret/rotate.js.map +0 -1
- package/dist/commands/secret/update.d.ts +0 -17
- package/dist/commands/secret/update.d.ts.map +0 -1
- package/dist/commands/secret/update.js +0 -37
- package/dist/commands/secret/update.js.map +0 -1
- package/dist/commands/skill/install.d.ts +0 -11
- package/dist/commands/skill/install.d.ts.map +0 -1
- package/dist/commands/skill/install.js +0 -52
- package/dist/commands/skill/install.js.map +0 -1
- package/dist/commands/skill/validate.d.ts +0 -9
- package/dist/commands/skill/validate.d.ts.map +0 -1
- package/dist/commands/skill/validate.js +0 -32
- package/dist/commands/skill/validate.js.map +0 -1
- package/dist/commands/test.d.ts +0 -9
- package/dist/commands/test.d.ts.map +0 -1
- package/dist/commands/test.js +0 -7
- package/dist/commands/test.js.map +0 -1
- package/dist/commands/workflow/provider/list.d.ts +0 -10
- package/dist/commands/workflow/provider/list.d.ts.map +0 -1
- package/dist/commands/workflow/provider/list.js +0 -13
- package/dist/commands/workflow/provider/list.js.map +0 -1
- package/dist/commands/workflow/provider/rotate.d.ts +0 -15
- package/dist/commands/workflow/provider/rotate.d.ts.map +0 -1
- package/dist/commands/workflow/provider/rotate.js +0 -24
- package/dist/commands/workflow/provider/rotate.js.map +0 -1
- package/dist/native-authz.d.ts +0 -4
- package/dist/native-authz.d.ts.map +0 -1
- package/dist/native-authz.js +0 -25
- package/dist/native-authz.js.map +0 -1
- package/dist/secret-value.d.ts +0 -5
- package/dist/secret-value.d.ts.map +0 -1
- package/dist/secret-value.js +0 -15
- 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,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,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
|