@antelopejs/dms 0.5.1 → 0.5.2

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 (51) hide show
  1. package/CHANGELOG.md +33 -0
  2. package/dist/implementations/dms/page.js +69 -22
  3. package/dist/implementations/dms/page.js.map +1 -1
  4. package/dist/index.js +2 -1
  5. package/dist/index.js.map +1 -1
  6. package/dist/realtime/index.js +2 -0
  7. package/dist/realtime/index.js.map +1 -1
  8. package/dist/realtime/sessions.d.ts +3 -0
  9. package/dist/realtime/sessions.js +5 -0
  10. package/dist/realtime/sessions.js.map +1 -1
  11. package/dist/realtime/sse.d.ts +1 -1
  12. package/dist/realtime/sse.js +9 -3
  13. package/dist/realtime/sse.js.map +1 -1
  14. package/dist/routes/realtime.js +8 -3
  15. package/dist/routes/realtime.js.map +1 -1
  16. package/dist/test/helpers/reload-host.d.ts +7 -2
  17. package/dist/test/helpers/reload-host.js +23 -4
  18. package/dist/test/helpers/reload-host.js.map +1 -1
  19. package/dist/test/reload-host/index.js +27 -1
  20. package/dist/test/reload-host/index.js.map +1 -1
  21. package/dist/test/unit/implementations/dms/missing-category.test.d.ts +1 -0
  22. package/dist/test/unit/implementations/dms/missing-category.test.js +174 -0
  23. package/dist/test/unit/implementations/dms/missing-category.test.js.map +1 -0
  24. package/dist/test/unit/interfaces/dms/database-initialized-hook.test.d.ts +1 -0
  25. package/dist/test/unit/interfaces/dms/database-initialized-hook.test.js +92 -0
  26. package/dist/test/unit/interfaces/dms/database-initialized-hook.test.js.map +1 -0
  27. package/dist/test/unit/interfaces/dms/invite-extension.test.js +59 -0
  28. package/dist/test/unit/interfaces/dms/invite-extension.test.js.map +1 -1
  29. package/dist/test/unit/interfaces/dms/module-reload-registrations.test.js +2 -2
  30. package/dist/test/unit/interfaces/dms/module-reload-registrations.test.js.map +1 -1
  31. package/dist/test/unit/interfaces/dms/page-extension-ownership.test.d.ts +1 -0
  32. package/dist/test/unit/interfaces/dms/page-extension-ownership.test.js +153 -0
  33. package/dist/test/unit/interfaces/dms/page-extension-ownership.test.js.map +1 -0
  34. package/dist/test/unit/realtime/stop-closes-streams.test.d.ts +1 -0
  35. package/dist/test/unit/realtime/stop-closes-streams.test.js +99 -0
  36. package/dist/test/unit/realtime/stop-closes-streams.test.js.map +1 -0
  37. package/dist/test/unit/skills/dms-dev-script.test.d.ts +1 -0
  38. package/dist/test/unit/skills/dms-dev-script.test.js +137 -0
  39. package/dist/test/unit/skills/dms-dev-script.test.js.map +1 -0
  40. package/dist/validation/auth.schema.d.ts +2 -2
  41. package/frontend-vue/dms.frontend.ts +4 -3
  42. package/frontend-vue/layers/dms-core/app/composables/realtime/useUserRealtime.ts +116 -44
  43. package/frontend-vue/layers/dms-layout/app/pages/[...slug].vue +2 -0
  44. package/frontend-vue/layers/dms-ui/app/plugins/shortcuts.ts +1 -1
  45. package/frontend-vue/layers/dms-ui/app/types/shortcuts-aggregated.d.ts +8 -0
  46. package/frontend-vue/tests/realtime-reconnect.test.ts +215 -0
  47. package/frontend-vue/tests/shortcuts-aggregate.test.ts +41 -0
  48. package/frontend-vue/vitest.config.ts +4 -0
  49. package/package.json +2 -2
  50. package/skills/dms-dev/SKILL.md +28 -16
  51. package/skills/dms-dev/scripts/dms-dev.sh +275 -83
@@ -0,0 +1,153 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ const interface_core_1 = require("@antelopejs/interface-core");
37
+ const modules_1 = require("@antelopejs/interface-core/modules");
38
+ const chai_1 = require("chai");
39
+ const pageImpl = __importStar(require("../../../../implementations/dms/page"));
40
+ const permissionsImpl = __importStar(require("../../../../implementations/dms/permissions"));
41
+ const realtimeImpl = __importStar(require("../../../../implementations/dms/realtime"));
42
+ const chart_1 = require("@antelopejs/interface-dms/base/chart");
43
+ const page_1 = require("@antelopejs/interface-dms/page");
44
+ const permissionsInterface = __importStar(require("@antelopejs/interface-dms/permissions"));
45
+ const realtimeInterface = __importStar(require("@antelopejs/interface-dms/realtime"));
46
+ const registry_1 = require("../../../../realtime/registry");
47
+ const reload_host_1 = require("../../../helpers/reload-host");
48
+ const PAGE_TOPIC = "pe-ownership:page";
49
+ const OWN_KEY = "trend";
50
+ const AFTER_PAGE = "pe-ownership-after";
51
+ const BEFORE_PAGE = "pe-ownership-before";
52
+ function settle() {
53
+ return new Promise((resolve) => setImmediate(resolve));
54
+ }
55
+ function pageId(page) {
56
+ return `pages.${page}`;
57
+ }
58
+ function ownerOf(proxy, id) {
59
+ return proxy.state.registered.get(id)?.owner;
60
+ }
61
+ function permissionOwner(id) {
62
+ return ownerOf(permissionsInterface.internal.RegisterPermission, id);
63
+ }
64
+ function topicOwner(page, topic) {
65
+ return ownerOf(realtimeInterface.internal.RegisterPageTopic, JSON.stringify([pageId(page), topic]));
66
+ }
67
+ function extensionPermission(page) {
68
+ return `${pageId(page)}.${reload_host_1.RELOAD_HOST_EXTENSION_KEY}`;
69
+ }
70
+ function definePage(id) {
71
+ return class extends (0, page_1.PageController)(id, {
72
+ displayName: `Extension ownership ${id}`,
73
+ category: page_1.pagesCategory,
74
+ }) {
75
+ static [OWN_KEY] = (0, chart_1.ChartLine)({ realtimeTopic: PAGE_TOPIC });
76
+ };
77
+ }
78
+ async function registerPage(id) {
79
+ const page = definePage(id);
80
+ (0, page_1.RegisterPage)()(page);
81
+ await settle();
82
+ await settle();
83
+ return page;
84
+ }
85
+ async function reloadExtendingModule(pages) {
86
+ (0, reload_host_1.setReloadHostExtendedPages)(pages.map(pageId));
87
+ await (0, modules_1.ReloadModule)(reload_host_1.RELOAD_HOST_MODULE);
88
+ await settle();
89
+ await settle();
90
+ }
91
+ function attachNewDmsGeneration() {
92
+ (0, registry_1.clearPageTopics)(pageId(AFTER_PAGE));
93
+ (0, registry_1.clearPageTopics)(pageId(BEFORE_PAGE));
94
+ (0, interface_core_1.ImplementInterface)(permissionsInterface, permissionsImpl);
95
+ (0, interface_core_1.ImplementInterface)(realtimeInterface, realtimeImpl);
96
+ }
97
+ function expectOwnedByExtendingModule(page) {
98
+ const owner = (0, reload_host_1.liveReloadHostOwner)();
99
+ (0, chai_1.expect)(owner).to.be.a("string");
100
+ (0, chai_1.expect)(owner).to.not.equal((0, modules_1.GetModuleContext)()?.owner);
101
+ (0, chai_1.expect)(permissionOwner(extensionPermission(page))).to.equal(owner);
102
+ (0, chai_1.expect)(topicOwner(page, reload_host_1.RELOAD_HOST_EXTENSION_TOPIC)).to.equal(owner);
103
+ }
104
+ describe("[unit] interfaces/dms/page — page extension ownership", () => {
105
+ let pageOwner;
106
+ let beforeTarget;
107
+ before(async () => {
108
+ await registerPage(AFTER_PAGE);
109
+ pageOwner = topicOwner(AFTER_PAGE, PAGE_TOPIC);
110
+ await reloadExtendingModule([AFTER_PAGE, BEFORE_PAGE]);
111
+ beforeTarget = await registerPage(BEFORE_PAGE);
112
+ });
113
+ after(() => {
114
+ (0, reload_host_1.setReloadHostExtendedPages)([]);
115
+ });
116
+ it("gives an extension registered after its page to the extending module", () => {
117
+ expectOwnedByExtendingModule(AFTER_PAGE);
118
+ (0, chai_1.expect)(pageOwner).to.be.a("string");
119
+ (0, chai_1.expect)(pageOwner).to.not.equal((0, reload_host_1.liveReloadHostOwner)());
120
+ (0, chai_1.expect)(permissionOwner(`${pageId(AFTER_PAGE)}.${OWN_KEY}`)).to.equal(pageOwner);
121
+ });
122
+ it("gives an extension registered before its page to the extending module", () => {
123
+ expectOwnedByExtendingModule(BEFORE_PAGE);
124
+ (0, chai_1.expect)(topicOwner(BEFORE_PAGE, PAGE_TOPIC)).to.equal(pageOwner);
125
+ });
126
+ it("keeps an extension with its module when the target page registers again", async () => {
127
+ const pageInfo = (0, interface_core_1.GetMetadata)(beforeTarget, page_1.PageMetadata).pageInfo;
128
+ pageImpl.internal.RegisterPage.unregister(pageInfo);
129
+ (0, chai_1.expect)(permissionOwner(extensionPermission(BEFORE_PAGE))).to.equal(undefined);
130
+ beforeTarget = await registerPage(BEFORE_PAGE);
131
+ expectOwnedByExtendingModule(BEFORE_PAGE);
132
+ });
133
+ it("brings an extension's topic and permission back to a new DMS generation", async () => {
134
+ attachNewDmsGeneration();
135
+ (0, chai_1.expect)([...(0, registry_1.getPageTopics)(pageId(AFTER_PAGE))]).to.have.members([
136
+ PAGE_TOPIC,
137
+ reload_host_1.RELOAD_HOST_EXTENSION_TOPIC,
138
+ ]);
139
+ expectOwnedByExtendingModule(AFTER_PAGE);
140
+ (0, chai_1.expect)(permissionsImpl.GetPermission(extensionPermission(AFTER_PAGE))).to.not.equal(undefined);
141
+ });
142
+ it("releases an extension's topic and permission with the extending module", async () => {
143
+ await reloadExtendingModule([]);
144
+ for (const page of [AFTER_PAGE, BEFORE_PAGE]) {
145
+ (0, chai_1.expect)(permissionOwner(extensionPermission(page))).to.equal(undefined);
146
+ (0, chai_1.expect)(permissionsImpl.GetPermission(extensionPermission(page))).to.equal(undefined);
147
+ (0, chai_1.expect)(topicOwner(page, reload_host_1.RELOAD_HOST_EXTENSION_TOPIC)).to.equal(undefined);
148
+ (0, chai_1.expect)([...(0, registry_1.getPageTopics)(pageId(page))]).to.deep.equal([PAGE_TOPIC]);
149
+ (0, chai_1.expect)(permissionOwner(`${pageId(page)}.${OWN_KEY}`)).to.equal(pageOwner);
150
+ }
151
+ });
152
+ });
153
+ //# sourceMappingURL=page-extension-ownership.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"page-extension-ownership.test.js","sourceRoot":"","sources":["../../../../../src/test/unit/interfaces/dms/page-extension-ownership.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const node_events_1 = require("node:events");
4
+ const chai_1 = require("chai");
5
+ const realtime_1 = require("../../../realtime");
6
+ const sessions_1 = require("../../../realtime/sessions");
7
+ const realtime_2 = require("../../../routes/realtime");
8
+ const USER = { _id: "stop-closes-streams-user", email: "u@example.com" };
9
+ const createFakeStream = () => {
10
+ const frames = [];
11
+ let isEnded = false;
12
+ const writer = {
13
+ write: (frame) => {
14
+ frames.push(frame);
15
+ return true;
16
+ },
17
+ end: () => {
18
+ isEnded = true;
19
+ },
20
+ };
21
+ const rawRequest = Object.assign(new node_events_1.EventEmitter(), { headers: {} });
22
+ const ctx = {
23
+ rawRequest,
24
+ response: { addHeader: () => { }, getWriteStream: () => writer },
25
+ };
26
+ return { ctx, frames, isEnded: () => isEnded };
27
+ };
28
+ const spyOnIntervals = () => {
29
+ const originalSet = globalThis.setInterval;
30
+ const originalClear = globalThis.clearInterval;
31
+ const started = new Set();
32
+ const cleared = new Set();
33
+ globalThis.setInterval = ((...args) => {
34
+ const timer = originalSet(...args);
35
+ started.add(timer);
36
+ return timer;
37
+ });
38
+ globalThis.clearInterval = ((timer) => {
39
+ cleared.add(timer);
40
+ originalClear(timer);
41
+ });
42
+ return {
43
+ started,
44
+ cleared,
45
+ restore: () => {
46
+ globalThis.setInterval = originalSet;
47
+ globalThis.clearInterval = originalClear;
48
+ },
49
+ };
50
+ };
51
+ const readSessionId = (stream) => {
52
+ const hello = stream.frames.find((frame) => frame.startsWith("event: hello"));
53
+ const data = hello?.split("\ndata: ")[1] ?? "{}";
54
+ return JSON.parse(data).sessionId;
55
+ };
56
+ const openUserStream = async (stream) => {
57
+ await realtime_2.RealtimeController.prototype.userStream.call(undefined, stream.ctx, USER);
58
+ };
59
+ describe("[unit] realtime — stopRealtime ends open SSE streams", () => {
60
+ let timers;
61
+ beforeEach(() => {
62
+ (0, realtime_1.setRealtimeBroker)(new realtime_1.InMemoryBroker());
63
+ timers = spyOnIntervals();
64
+ });
65
+ afterEach(() => {
66
+ timers.restore();
67
+ (0, realtime_1.setRealtimeBroker)(new realtime_1.InMemoryBroker());
68
+ });
69
+ it("ends a user stream opened before the stop and clears its keepalive", async () => {
70
+ const stream = createFakeStream();
71
+ await openUserStream(stream);
72
+ const sessionId = readSessionId(stream);
73
+ (0, chai_1.expect)((0, sessions_1.getSessionInfo)(sessionId)).to.not.equal(undefined);
74
+ (0, chai_1.expect)(timers.started.size).to.equal(1);
75
+ await (0, realtime_1.stopRealtime)();
76
+ (0, chai_1.expect)(stream.isEnded()).to.equal(true);
77
+ (0, chai_1.expect)([...timers.started].every((t) => timers.cleared.has(t))).to.equal(true);
78
+ (0, chai_1.expect)((0, sessions_1.getSessionInfo)(sessionId)).to.equal(undefined);
79
+ });
80
+ it("ends every open stream, not just the first", async () => {
81
+ const streams = [createFakeStream(), createFakeStream()];
82
+ for (const stream of streams)
83
+ await openUserStream(stream);
84
+ await (0, realtime_1.stopRealtime)();
85
+ (0, chai_1.expect)(streams.map((stream) => stream.isEnded())).to.deep.equal([
86
+ true,
87
+ true,
88
+ ]);
89
+ (0, chai_1.expect)(timers.cleared.size).to.equal(2);
90
+ });
91
+ it("leaves a stream the client already closed alone", async () => {
92
+ const stream = createFakeStream();
93
+ await openUserStream(stream);
94
+ stream.ctx.rawRequest.emit("close");
95
+ await (0, realtime_1.stopRealtime)();
96
+ (0, chai_1.expect)(stream.isEnded()).to.equal(false);
97
+ });
98
+ });
99
+ //# sourceMappingURL=stop-closes-streams.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stop-closes-streams.test.js","sourceRoot":"","sources":["../../../../src/test/unit/realtime/stop-closes-streams.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,137 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const node_child_process_1 = require("node:child_process");
4
+ const node_fs_1 = require("node:fs");
5
+ const node_os_1 = require("node:os");
6
+ const node_path_1 = require("node:path");
7
+ const node_util_1 = require("node:util");
8
+ const chai_1 = require("chai");
9
+ const PACKAGE_ROOT = (0, node_path_1.resolve)(__dirname, "..", "..", "..", "..");
10
+ const SCRIPT = (0, node_path_1.join)(PACKAGE_ROOT, "skills", "dms-dev", "scripts", "dms-dev.sh");
11
+ const SCRIPT_TIMEOUT_MS = 30_000;
12
+ const SUITE_TIMEOUT_MS = 90_000;
13
+ const STOP_GRACE_SECONDS = "1";
14
+ const READY_TIMEOUT_SECONDS = "15";
15
+ const PROJECT_PORTS = { first: 6110, second: 6120 };
16
+ const FAKE_BACKEND = `#!/usr/bin/env bash
17
+ mkdir -p .antelope
18
+ printf '{"pid": %s, "servers": {"api": {"endpoints": [{"protocol": "http", "host": "0.0.0.0", "port": %s}]}}}' "$$" "$FAKE_PORT" > .antelope/dev.json
19
+ sleep 300 &
20
+ echo "Server started, listening on http://localhost:$FAKE_PORT"
21
+ wait
22
+ `;
23
+ const FAKE_FRONTEND = `#!/usr/bin/env bash
24
+ trap '' TERM
25
+ sleep 300 &
26
+ echo "Server ready on http://localhost:$((FAKE_PORT + 1))"
27
+ wait
28
+ `;
29
+ const runProcess = (0, node_util_1.promisify)(node_child_process_1.execFile);
30
+ function createProject(root, name, port) {
31
+ const dir = (0, node_path_1.join)(root, name);
32
+ (0, node_fs_1.mkdirSync)((0, node_path_1.join)(dir, "bin"), { recursive: true });
33
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(dir, "package.json"), "{}");
34
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(dir, "bin", "antelope-runner"), FAKE_BACKEND);
35
+ (0, node_fs_1.writeFileSync)((0, node_path_1.join)(dir, "bin", "ajs-dms"), FAKE_FRONTEND);
36
+ (0, node_fs_1.chmodSync)((0, node_path_1.join)(dir, "bin", "antelope-runner"), 0o755);
37
+ (0, node_fs_1.chmodSync)((0, node_path_1.join)(dir, "bin", "ajs-dms"), 0o755);
38
+ return { dir, port };
39
+ }
40
+ async function runScript(project, command) {
41
+ const env = {
42
+ ...process.env,
43
+ FAKE_PORT: String(project.port),
44
+ DMS_BACK_DIR: project.dir,
45
+ DMS_BACK_CMD: (0, node_path_1.join)(project.dir, "bin", "antelope-runner"),
46
+ DMS_FRONT_CMD: `${(0, node_path_1.join)(project.dir, "bin", "ajs-dms")} dev`,
47
+ DMS_BACK_LOG: (0, node_path_1.join)(project.dir, "back.log"),
48
+ DMS_FRONT_LOG: (0, node_path_1.join)(project.dir, "front.log"),
49
+ DMS_DEV_STOP_GRACE: STOP_GRACE_SECONDS,
50
+ DMS_DEV_TIMEOUT: READY_TIMEOUT_SECONDS,
51
+ };
52
+ try {
53
+ const { stdout, stderr } = await runProcess("bash", [SCRIPT, command], {
54
+ env,
55
+ timeout: SCRIPT_TIMEOUT_MS,
56
+ });
57
+ return { code: 0, output: stdout + stderr };
58
+ }
59
+ catch (error) {
60
+ const failure = error;
61
+ return {
62
+ code: failure.code ?? 1,
63
+ output: `${failure.stdout ?? ""}${failure.stderr ?? ""}`,
64
+ };
65
+ }
66
+ }
67
+ function pidFile(project) {
68
+ return (0, node_path_1.join)(project.dir, ".antelope", "dms-dev.pid");
69
+ }
70
+ function recordedPids(project) {
71
+ return (0, node_fs_1.readFileSync)(pidFile(project), "utf8")
72
+ .trim()
73
+ .split("\n")
74
+ .map((line) => Number(line.split(" ")[1]));
75
+ }
76
+ function isAlive(pid) {
77
+ try {
78
+ process.kill(pid, 0);
79
+ return true;
80
+ }
81
+ catch {
82
+ return false;
83
+ }
84
+ }
85
+ describe("[unit] skills/dms-dev script", function () {
86
+ this.timeout(SUITE_TIMEOUT_MS);
87
+ let root;
88
+ let first;
89
+ let second;
90
+ beforeEach(() => {
91
+ root = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), "dms-dev-script-"));
92
+ first = createProject(root, "first", PROJECT_PORTS.first);
93
+ second = createProject(root, "second", PROJECT_PORTS.second);
94
+ });
95
+ afterEach(async () => {
96
+ await runScript(first, "stop");
97
+ await runScript(second, "stop");
98
+ (0, node_fs_1.rmSync)(root, { recursive: true, force: true });
99
+ });
100
+ it("reports the ports the servers announce", async () => {
101
+ const started = await runScript(first, "start");
102
+ (0, chai_1.expect)(started.code, started.output).to.equal(0);
103
+ (0, chai_1.expect)(started.output).to.contain(`backend ready on http://localhost:${PROJECT_PORTS.first}.`);
104
+ (0, chai_1.expect)(started.output).to.contain(`frontend ready on http://localhost:${PROJECT_PORTS.first + 1}.`);
105
+ });
106
+ it("stops only the processes of its own project", async () => {
107
+ await runScript(first, "start");
108
+ await runScript(second, "start");
109
+ const firstPids = recordedPids(first);
110
+ const secondPids = recordedPids(second);
111
+ const stopped = await runScript(first, "stop");
112
+ (0, chai_1.expect)(stopped.code, stopped.output).to.equal(0);
113
+ (0, chai_1.expect)(firstPids.filter(isAlive)).to.deep.equal([]);
114
+ (0, chai_1.expect)(secondPids.filter(isAlive)).to.deep.equal(secondPids);
115
+ (0, chai_1.expect)((0, node_fs_1.existsSync)(pidFile(first))).to.equal(false);
116
+ });
117
+ it("falls back to the project's directory when the pid file is gone", async () => {
118
+ await runScript(first, "start");
119
+ await runScript(second, "start");
120
+ const firstPids = recordedPids(first);
121
+ const secondPids = recordedPids(second);
122
+ (0, node_fs_1.rmSync)(pidFile(first));
123
+ const stopped = await runScript(first, "stop");
124
+ (0, chai_1.expect)(stopped.code, stopped.output).to.equal(0);
125
+ (0, chai_1.expect)(firstPids.filter(isAlive)).to.deep.equal([]);
126
+ (0, chai_1.expect)(secondPids.filter(isAlive)).to.deep.equal(secondPids);
127
+ });
128
+ it("fails fast when the server command dies right away", async () => {
129
+ (0, node_fs_1.rmSync)((0, node_path_1.join)(first.dir, "bin", "antelope-runner"));
130
+ const startedAt = Date.now();
131
+ const started = await runScript(first, "start");
132
+ (0, chai_1.expect)(started.code).to.equal(1);
133
+ (0, chai_1.expect)(started.output).to.contain("exited before becoming ready");
134
+ (0, chai_1.expect)(Date.now() - startedAt).to.be.below(SCRIPT_TIMEOUT_MS / 2);
135
+ });
136
+ });
137
+ //# sourceMappingURL=dms-dev-script.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dms-dev-script.test.js","sourceRoot":"","sources":["../../../../src/test/unit/skills/dms-dev-script.test.ts"],"names":[],"mappings":"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"}
@@ -42,14 +42,14 @@ export declare const authSchema: {
42
42
  code: string;
43
43
  state: string;
44
44
  state_cookie: string;
45
- language?: string | undefined;
46
45
  invite?: string | undefined;
46
+ language?: string | undefined;
47
47
  }, {
48
48
  code: string;
49
49
  state: string;
50
50
  state_cookie: string;
51
- language?: string | undefined;
52
51
  invite?: string | undefined;
52
+ language?: string | undefined;
53
53
  }>;
54
54
  refresh: z.ZodObject<{
55
55
  token: z.ZodString;
@@ -2,6 +2,7 @@ import { defineAsyncComponent, type Component } from "vue";
2
2
  import {
3
3
  type DmsFrontendModule,
4
4
  useDmsAppConfig,
5
+ useDmsRuntimeConfig,
5
6
  } from "#dms/frontend-module";
6
7
  import { defu } from "defu";
7
8
  import appConfig from "./layers/dms-layout/app/app.config";
@@ -171,9 +172,9 @@ function registerMiddleware(
171
172
 
172
173
  const frontendModule: DmsFrontendModule = {
173
174
  setup(sdk) {
174
- const publicOptions = sdk.options.public as DmsPublicOptions;
175
- if (publicOptions.dms && typeof window !== "undefined")
176
- publicOptions.dms.baseURL = window.location.origin;
175
+ const runtimeDms = (useDmsRuntimeConfig().public as DmsPublicOptions).dms;
176
+ if (runtimeDms && typeof window !== "undefined")
177
+ runtimeDms.baseURL = window.location.origin;
177
178
  const runtimeAppConfig = useDmsAppConfig();
178
179
  Object.assign(runtimeAppConfig, defu(runtimeAppConfig, appConfig));
179
180
  registerPlugins(sdk);