serverless-ircd 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/.github/workflows/ci.yml +47 -0
  2. package/.github/workflows/deploy-cf.yml +97 -0
  3. package/LICENSE +29 -0
  4. package/README.md +323 -0
  5. package/apps/cf-worker/package.json +37 -0
  6. package/apps/cf-worker/scripts/smoke.mjs +175 -0
  7. package/apps/cf-worker/src/worker.ts +59 -0
  8. package/apps/cf-worker/tests/smoke.test.ts +150 -0
  9. package/apps/cf-worker/tsconfig.build.json +17 -0
  10. package/apps/cf-worker/tsconfig.test.json +18 -0
  11. package/apps/cf-worker/vitest.config.ts +31 -0
  12. package/apps/cf-worker/wrangler.test.toml +33 -0
  13. package/apps/cf-worker/wrangler.toml +98 -0
  14. package/apps/local-cli/package.json +35 -0
  15. package/apps/local-cli/src/line-scanner.ts +60 -0
  16. package/apps/local-cli/src/main.ts +145 -0
  17. package/apps/local-cli/src/motd-file.ts +45 -0
  18. package/apps/local-cli/src/server.ts +409 -0
  19. package/apps/local-cli/tests/e2e.test.ts +346 -0
  20. package/apps/local-cli/tests/id-factory.test.ts +25 -0
  21. package/apps/local-cli/tests/line-scanner.test.ts +81 -0
  22. package/apps/local-cli/tests/motd-file.test.ts +71 -0
  23. package/apps/local-cli/tests/tcp.test.ts +358 -0
  24. package/apps/local-cli/tsconfig.build.json +17 -0
  25. package/apps/local-cli/tsconfig.test.json +15 -0
  26. package/apps/local-cli/vitest.config.ts +24 -0
  27. package/biome.json +52 -0
  28. package/package.json +35 -0
  29. package/packages/cf-adapter/package.json +38 -0
  30. package/packages/cf-adapter/src/cf-runtime.ts +308 -0
  31. package/packages/cf-adapter/src/channel-do.ts +374 -0
  32. package/packages/cf-adapter/src/connection-do.ts +542 -0
  33. package/packages/cf-adapter/src/env.ts +67 -0
  34. package/packages/cf-adapter/src/index.ts +38 -0
  35. package/packages/cf-adapter/src/registry-do.ts +130 -0
  36. package/packages/cf-adapter/src/serialize.ts +142 -0
  37. package/packages/cf-adapter/src/sharding.ts +101 -0
  38. package/packages/cf-adapter/tests/cf-harness.ts +264 -0
  39. package/packages/cf-adapter/tests/cf-integration.test.ts +73 -0
  40. package/packages/cf-adapter/tests/cf-runtime.test.ts +527 -0
  41. package/packages/cf-adapter/tests/channel-do.test.ts +480 -0
  42. package/packages/cf-adapter/tests/connection-do.test.ts +329 -0
  43. package/packages/cf-adapter/tests/integration/harness.test.ts +229 -0
  44. package/packages/cf-adapter/tests/integration/harness.ts +102 -0
  45. package/packages/cf-adapter/tests/integration/in-memory-harness.ts +242 -0
  46. package/packages/cf-adapter/tests/integration/index.ts +17 -0
  47. package/packages/cf-adapter/tests/integration/scenarios.test.ts +20 -0
  48. package/packages/cf-adapter/tests/integration/scenarios.ts +495 -0
  49. package/packages/cf-adapter/tests/registry-do.test.ts +335 -0
  50. package/packages/cf-adapter/tests/sharding.test.ts +100 -0
  51. package/packages/cf-adapter/tests/worker/main.ts +33 -0
  52. package/packages/cf-adapter/tests/worker/stubs/channel-stub.ts +50 -0
  53. package/packages/cf-adapter/tests/worker/stubs/registry-stub.ts +57 -0
  54. package/packages/cf-adapter/tsconfig.build.json +16 -0
  55. package/packages/cf-adapter/tsconfig.test.json +18 -0
  56. package/packages/cf-adapter/vitest.config.ts +32 -0
  57. package/packages/cf-adapter/wrangler.test.toml +50 -0
  58. package/packages/in-memory-runtime/package.json +29 -0
  59. package/packages/in-memory-runtime/src/in-memory-runtime.ts +245 -0
  60. package/packages/in-memory-runtime/src/index.ts +9 -0
  61. package/packages/in-memory-runtime/tests/in-memory-runtime.test.ts +502 -0
  62. package/packages/in-memory-runtime/tsconfig.build.json +16 -0
  63. package/packages/in-memory-runtime/tsconfig.test.json +14 -0
  64. package/packages/in-memory-runtime/vitest.config.ts +21 -0
  65. package/packages/irc-core/package.json +29 -0
  66. package/packages/irc-core/src/caps/capabilities.ts +96 -0
  67. package/packages/irc-core/src/caps/index.ts +1 -0
  68. package/packages/irc-core/src/commands/away.ts +82 -0
  69. package/packages/irc-core/src/commands/cap.ts +257 -0
  70. package/packages/irc-core/src/commands/chghost.ts +30 -0
  71. package/packages/irc-core/src/commands/index.ts +40 -0
  72. package/packages/irc-core/src/commands/invite.ts +156 -0
  73. package/packages/irc-core/src/commands/isupport.ts +133 -0
  74. package/packages/irc-core/src/commands/join.ts +309 -0
  75. package/packages/irc-core/src/commands/kick.ts +162 -0
  76. package/packages/irc-core/src/commands/list.ts +126 -0
  77. package/packages/irc-core/src/commands/mode.ts +655 -0
  78. package/packages/irc-core/src/commands/motd.ts +146 -0
  79. package/packages/irc-core/src/commands/names.ts +164 -0
  80. package/packages/irc-core/src/commands/part.ts +118 -0
  81. package/packages/irc-core/src/commands/ping.ts +47 -0
  82. package/packages/irc-core/src/commands/privmsg.ts +256 -0
  83. package/packages/irc-core/src/commands/quit.ts +70 -0
  84. package/packages/irc-core/src/commands/registration.ts +251 -0
  85. package/packages/irc-core/src/commands/topic.ts +171 -0
  86. package/packages/irc-core/src/commands/who.ts +169 -0
  87. package/packages/irc-core/src/commands/whois.ts +165 -0
  88. package/packages/irc-core/src/effects.ts +184 -0
  89. package/packages/irc-core/src/index.ts +20 -0
  90. package/packages/irc-core/src/ports.ts +153 -0
  91. package/packages/irc-core/src/protocol/batch.ts +85 -0
  92. package/packages/irc-core/src/protocol/index.ts +18 -0
  93. package/packages/irc-core/src/protocol/messages.ts +36 -0
  94. package/packages/irc-core/src/protocol/numerics.ts +155 -0
  95. package/packages/irc-core/src/protocol/outbound.ts +145 -0
  96. package/packages/irc-core/src/protocol/parser.ts +175 -0
  97. package/packages/irc-core/src/protocol/serializer.ts +71 -0
  98. package/packages/irc-core/src/state/channel.ts +293 -0
  99. package/packages/irc-core/src/state/connection.ts +153 -0
  100. package/packages/irc-core/src/state/index.ts +25 -0
  101. package/packages/irc-core/src/state/registry.ts +22 -0
  102. package/packages/irc-core/src/types.ts +83 -0
  103. package/packages/irc-core/tests/batch.test.ts +79 -0
  104. package/packages/irc-core/tests/caps/capabilities.test.ts +148 -0
  105. package/packages/irc-core/tests/commands/away.test.ts +233 -0
  106. package/packages/irc-core/tests/commands/batch.test.ts +178 -0
  107. package/packages/irc-core/tests/commands/cap.test.ts +499 -0
  108. package/packages/irc-core/tests/commands/chghost.test.ts +186 -0
  109. package/packages/irc-core/tests/commands/echo-message.test.ts +212 -0
  110. package/packages/irc-core/tests/commands/extended-join.test.ts +147 -0
  111. package/packages/irc-core/tests/commands/invite-notify.test.ts +160 -0
  112. package/packages/irc-core/tests/commands/invite.test.ts +321 -0
  113. package/packages/irc-core/tests/commands/isupport.test.ts +209 -0
  114. package/packages/irc-core/tests/commands/join.test.ts +687 -0
  115. package/packages/irc-core/tests/commands/kick.test.ts +316 -0
  116. package/packages/irc-core/tests/commands/list.test.ts +452 -0
  117. package/packages/irc-core/tests/commands/mode.test.ts +1048 -0
  118. package/packages/irc-core/tests/commands/motd.test.ts +322 -0
  119. package/packages/irc-core/tests/commands/names.test.ts +342 -0
  120. package/packages/irc-core/tests/commands/part.test.ts +265 -0
  121. package/packages/irc-core/tests/commands/ping.test.ts +144 -0
  122. package/packages/irc-core/tests/commands/privmsg.test.ts +665 -0
  123. package/packages/irc-core/tests/commands/quit.test.ts +220 -0
  124. package/packages/irc-core/tests/commands/registration.test.ts +599 -0
  125. package/packages/irc-core/tests/commands/topic.test.ts +337 -0
  126. package/packages/irc-core/tests/commands/who.test.ts +441 -0
  127. package/packages/irc-core/tests/commands/whois.test.ts +422 -0
  128. package/packages/irc-core/tests/effects.test.ts +147 -0
  129. package/packages/irc-core/tests/message-tags.test.ts +182 -0
  130. package/packages/irc-core/tests/numerics.test.ts +98 -0
  131. package/packages/irc-core/tests/outbound.test.ts +232 -0
  132. package/packages/irc-core/tests/parser.test.ts +162 -0
  133. package/packages/irc-core/tests/ports.test.ts +101 -0
  134. package/packages/irc-core/tests/serializer.test.ts +164 -0
  135. package/packages/irc-core/tests/state/channel.test.ts +351 -0
  136. package/packages/irc-core/tests/state/connection.test.ts +122 -0
  137. package/packages/irc-core/tests/state/registry.test.ts +20 -0
  138. package/packages/irc-core/tests/types.test.ts +127 -0
  139. package/packages/irc-core/tsconfig.build.json +12 -0
  140. package/packages/irc-core/tsconfig.test.json +10 -0
  141. package/packages/irc-core/vitest.config.ts +21 -0
  142. package/packages/irc-server/package.json +28 -0
  143. package/packages/irc-server/src/actor.ts +449 -0
  144. package/packages/irc-server/src/dispatch.ts +120 -0
  145. package/packages/irc-server/src/index.ts +11 -0
  146. package/packages/irc-server/src/runtime.ts +61 -0
  147. package/packages/irc-server/tests/actor.test.ts +816 -0
  148. package/packages/irc-server/tests/dispatch.test.ts +512 -0
  149. package/packages/irc-server/tests/runtime.test.ts +52 -0
  150. package/packages/irc-server/tsconfig.build.json +13 -0
  151. package/packages/irc-server/tsconfig.test.json +11 -0
  152. package/packages/irc-server/vitest.config.ts +21 -0
  153. package/pnpm-workspace.yaml +4 -0
  154. package/tools/tcp-ws-forwarder/package.json +32 -0
  155. package/tools/tcp-ws-forwarder/src/forwarder.ts +244 -0
  156. package/tools/tcp-ws-forwarder/src/line-scanner.ts +55 -0
  157. package/tools/tcp-ws-forwarder/src/main.ts +114 -0
  158. package/tools/tcp-ws-forwarder/tests/forwarder.test.ts +618 -0
  159. package/tools/tcp-ws-forwarder/tests/framing.test.ts +51 -0
  160. package/tools/tcp-ws-forwarder/tests/line-scanner.test.ts +75 -0
  161. package/tools/tcp-ws-forwarder/tsconfig.build.json +12 -0
  162. package/tools/tcp-ws-forwarder/tsconfig.test.json +10 -0
  163. package/tools/tcp-ws-forwarder/vitest.config.ts +27 -0
  164. package/tsconfig.base.json +25 -0
  165. package/turbo.json +29 -0
@@ -0,0 +1,122 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import {
3
+ type RegistrationState,
4
+ createConnection,
5
+ hostmaskOf,
6
+ toSnapshot,
7
+ } from '../../src/state/connection';
8
+
9
+ describe('createConnection', () => {
10
+ it('creates a pre-registration connection with empty caps and joined channels', () => {
11
+ const conn = createConnection({
12
+ id: 'c1',
13
+ connectedSince: 1_000,
14
+ });
15
+ expect(conn.id).toBe('c1');
16
+ expect(conn.registration).toBe('pre-registration');
17
+ expect(conn.caps.size).toBe(0);
18
+ expect(conn.joinedChannels.size).toBe(0);
19
+ expect(conn.userModes.invisible).toBe(false);
20
+ expect(conn.userModes.oper).toBe(false);
21
+ expect(conn.lastSeen).toBe(1_000);
22
+ expect(conn.connectedSince).toBe(1_000);
23
+ });
24
+
25
+ it('initializes lastSeen to connectedSince when not supplied', () => {
26
+ const conn = createConnection({ id: 'c1', connectedSince: 42 });
27
+ expect(conn.lastSeen).toBe(42);
28
+ });
29
+
30
+ it('honors an explicit lastSeen', () => {
31
+ const conn = createConnection({ id: 'c1', connectedSince: 10, lastSeen: 99 });
32
+ expect(conn.lastSeen).toBe(99);
33
+ });
34
+ });
35
+
36
+ describe('hostmaskOf', () => {
37
+ it('returns undefined when nick is missing', () => {
38
+ const conn = createConnection({ id: 'c1', connectedSince: 0 });
39
+ expect(hostmaskOf(conn)).toBeUndefined();
40
+ });
41
+
42
+ it('builds nick!user@host when all parts are present', () => {
43
+ const conn = createConnection({ id: 'c1', connectedSince: 0 });
44
+ conn.nick = 'alice';
45
+ conn.user = 'alice';
46
+ conn.host = 'example.com';
47
+ expect(hostmaskOf(conn)).toBe('alice!alice@example.com');
48
+ });
49
+
50
+ it('builds nick@host when user is missing', () => {
51
+ const conn = createConnection({ id: 'c1', connectedSince: 0 });
52
+ conn.nick = 'alice';
53
+ conn.host = 'example.com';
54
+ expect(hostmaskOf(conn)).toBe('alice@example.com');
55
+ });
56
+
57
+ it('builds nick!user when host is missing', () => {
58
+ const conn = createConnection({ id: 'c1', connectedSince: 0 });
59
+ conn.nick = 'alice';
60
+ conn.user = 'alice';
61
+ expect(hostmaskOf(conn)).toBe('alice!alice');
62
+ });
63
+
64
+ it('returns just the nick when only nick is set', () => {
65
+ const conn = createConnection({ id: 'c1', connectedSince: 0 });
66
+ conn.nick = 'alice';
67
+ expect(hostmaskOf(conn)).toBe('alice');
68
+ });
69
+ });
70
+
71
+ describe('toSnapshot', () => {
72
+ it('returns a read-only view of the connection state', () => {
73
+ const conn = createConnection({ id: 'c1', connectedSince: 100 });
74
+ conn.nick = 'bob';
75
+ conn.user = 'bob';
76
+ conn.host = 'h';
77
+ conn.realname = 'Bob';
78
+ conn.caps.add('server-time');
79
+ conn.joinedChannels.add('#foo');
80
+ conn.userModes.invisible = true;
81
+ conn.away = 'afk';
82
+
83
+ const snap = toSnapshot(conn);
84
+ expect(snap.id).toBe('c1');
85
+ expect(snap.nick).toBe('bob');
86
+ expect(snap.hostmask).toBe('bob!bob@h');
87
+ expect(snap.caps.has('server-time')).toBe(true);
88
+ expect(snap.joinedChannels.has('#foo')).toBe(true);
89
+ expect(snap.userModes.invisible).toBe(true);
90
+ expect(snap.away).toBe('afk');
91
+ expect(snap.registration).toBe('pre-registration');
92
+ });
93
+
94
+ it('omits hostmask when nick is absent', () => {
95
+ const conn = createConnection({ id: 'c1', connectedSince: 0 });
96
+ const snap = toSnapshot(conn);
97
+ expect(snap.hostmask).toBeUndefined();
98
+ });
99
+
100
+ it('omits away when not set', () => {
101
+ const conn = createConnection({ id: 'c1', connectedSince: 0 });
102
+ const snap = toSnapshot(conn);
103
+ expect(snap.away).toBeUndefined();
104
+ });
105
+
106
+ it('includes account in the snapshot when set', () => {
107
+ const conn = createConnection({ id: 'c1', connectedSince: 0 });
108
+ conn.nick = 'a';
109
+ conn.account = 'alice';
110
+ const snap = toSnapshot(conn);
111
+ expect(snap.account).toBe('alice');
112
+ });
113
+
114
+ it('produces a snapshot whose registration matches the state', () => {
115
+ const states: RegistrationState[] = ['pre-registration', 'registering', 'registered'];
116
+ for (const registration of states) {
117
+ const conn = createConnection({ id: 'c', connectedSince: 0 });
118
+ conn.registration = registration;
119
+ expect(toSnapshot(conn).registration).toBe(registration);
120
+ }
121
+ });
122
+ });
@@ -0,0 +1,20 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { type Registry, createRegistry } from '../../src/state/registry';
3
+
4
+ describe('createRegistry', () => {
5
+ it('returns an empty nick map', () => {
6
+ const r = createRegistry();
7
+ expect(r.nicks.size).toBe(0);
8
+ });
9
+ });
10
+
11
+ describe('Registry', () => {
12
+ it('accepts Map operations on the nicks field', () => {
13
+ const r: Registry = createRegistry();
14
+ r.nicks.set('alice', 'c1');
15
+ expect(r.nicks.get('alice')).toBe('c1');
16
+ expect(r.nicks.size).toBe(1);
17
+ r.nicks.delete('alice');
18
+ expect(r.nicks.size).toBe(0);
19
+ });
20
+ });
@@ -0,0 +1,127 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import type { RawLine } from '../src/effects';
3
+ import { Effect as EffectValue } from '../src/effects';
4
+ import { EmptyMotdProvider, FakeClock, SequentialIdFactory } from '../src/ports';
5
+ import { createConnection } from '../src/state/connection';
6
+ import {
7
+ type Ctx,
8
+ type Reducer,
9
+ type ReducerResult,
10
+ type ServerConfig,
11
+ buildCtx,
12
+ } from '../src/types';
13
+
14
+ function makeCtx(): Ctx {
15
+ const serverConfig: ServerConfig = {
16
+ serverName: 'irc.example.com',
17
+ networkName: 'ExampleNet',
18
+ maxChannelsPerUser: 30,
19
+ maxTargetsPerCommand: 10,
20
+ maxListEntries: 50,
21
+ nickLen: 30,
22
+ channelLen: 50,
23
+ topicLen: 390,
24
+ quitMessage: 'Client Quit',
25
+ };
26
+ return buildCtx({
27
+ serverConfig,
28
+ clock: new FakeClock(1_000),
29
+ ids: new SequentialIdFactory(),
30
+ motd: EmptyMotdProvider,
31
+ connection: createConnection({ id: 'c1', connectedSince: 0 }),
32
+ });
33
+ }
34
+
35
+ interface NoopState {
36
+ n: number;
37
+ }
38
+
39
+ describe('Ctx / Reducer types', () => {
40
+ it('builds a Ctx from the required ports and config', () => {
41
+ const ctx = makeCtx();
42
+ expect(ctx.serverName).toBe('irc.example.com');
43
+ expect(ctx.networkName).toBe('ExampleNet');
44
+ expect(ctx.clock.now()).toBe(1_000);
45
+ expect(ctx.ids.batchId()).toBe('batch-0');
46
+ expect(ctx.connection.id).toBe('c1');
47
+ });
48
+
49
+ it('exposes the connection id directly on ctx', () => {
50
+ const ctx = makeCtx();
51
+ expect(ctx.connId).toBe('c1');
52
+ });
53
+
54
+ it('supports a pure reducer that emits no effects', () => {
55
+ const noop: Reducer<NoopState> = (state) => ({ state, effects: [] });
56
+ const out: ReducerResult<NoopState> = noop(
57
+ { n: 0 },
58
+ { command: 'PING', params: [], tags: {} },
59
+ makeCtx(),
60
+ );
61
+ expect(out.effects).toEqual([]);
62
+ });
63
+
64
+ it('supports a reducer that emits a Send effect', () => {
65
+ const pingBack: Reducer<NoopState> = (_state, msg, ctx) => {
66
+ const token = msg.params[0] ?? '';
67
+ const lines: RawLine[] = [{ text: `PONG :${token}` }];
68
+ return {
69
+ state: { n: 0 },
70
+ effects: [EffectValue.send(ctx.connId, lines)],
71
+ };
72
+ };
73
+ const out = pingBack({ n: 0 }, { command: 'PING', params: ['tok'], tags: {} }, makeCtx());
74
+ expect(out.effects).toHaveLength(1);
75
+ expect(out.effects[0]).toEqual({
76
+ tag: 'Send',
77
+ to: 'c1',
78
+ lines: [{ text: 'PONG :tok' }],
79
+ });
80
+ });
81
+
82
+ it('Reducer<S> preserves the supplied state type', () => {
83
+ interface MyState {
84
+ count: number;
85
+ }
86
+ const inc: Reducer<MyState> = (state, _msg, _ctx) => ({
87
+ state: { count: state.count + 1 },
88
+ effects: [],
89
+ });
90
+ const out = inc({ count: 1 }, { command: 'X', params: [], tags: {} }, makeCtx());
91
+ expect(out.state.count).toBe(2);
92
+ });
93
+
94
+ it('Ctx carries the IrcMessage being handled via the reducer call, not on ctx itself', () => {
95
+ // Sanity: the Reducer signature is (state, msg, ctx) — ctx itself is msg-free.
96
+ const ctx = makeCtx();
97
+ const keys = Object.keys(ctx) as Array<keyof Ctx>;
98
+ expect(keys).not.toContain('msg');
99
+ });
100
+ });
101
+
102
+ describe('ServerConfig shape', () => {
103
+ it('exposes every configured knob', () => {
104
+ const cfg: ServerConfig = {
105
+ serverName: 's',
106
+ networkName: 'n',
107
+ maxChannelsPerUser: 1,
108
+ maxTargetsPerCommand: 2,
109
+ maxListEntries: 3,
110
+ nickLen: 3,
111
+ channelLen: 4,
112
+ topicLen: 5,
113
+ quitMessage: 'bye',
114
+ };
115
+ expect(cfg.serverName).toBe('s');
116
+ expect(cfg.networkName).toBe('n');
117
+ expect(cfg.maxChannelsPerUser).toBe(1);
118
+ expect(cfg.maxTargetsPerCommand).toBe(2);
119
+ expect(cfg.maxListEntries).toBe(3);
120
+ expect(cfg.nickLen).toBe(3);
121
+ expect(cfg.channelLen).toBe(4);
122
+ expect(cfg.topicLen).toBe(5);
123
+ expect(cfg.quitMessage).toBe('bye');
124
+ });
125
+ });
126
+
127
+ // Importing Effect here just to confirm it round-trips through the public surface.
@@ -0,0 +1,12 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "composite": true,
5
+ "rootDir": "./src",
6
+ "outDir": "./dist",
7
+ "tsBuildInfoFile": "./.tsbuildinfo",
8
+ "types": []
9
+ },
10
+ "include": ["src/**/*.ts"],
11
+ "exclude": ["dist", "tests", "**/*.test.ts"]
12
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "noEmit": true,
5
+ "types": [],
6
+ "composite": false
7
+ },
8
+ "include": ["src/**/*.ts", "tests/**/*.ts"],
9
+ "exclude": ["dist"]
10
+ }
@@ -0,0 +1,21 @@
1
+ import { defineConfig } from 'vitest/config';
2
+
3
+ export default defineConfig({
4
+ test: {
5
+ environment: 'node',
6
+ include: ['tests/**/*.test.ts'],
7
+ coverage: {
8
+ provider: 'v8',
9
+ all: false,
10
+ include: ['src/**/*.ts'],
11
+ exclude: ['src/**/index.ts'],
12
+ reporter: ['text', 'html', 'json-summary'],
13
+ thresholds: {
14
+ lines: 100,
15
+ functions: 100,
16
+ branches: 100,
17
+ statements: 100,
18
+ },
19
+ },
20
+ },
21
+ });
@@ -0,0 +1,28 @@
1
+ {
2
+ "name": "@serverless-ircd/irc-server",
3
+ "version": "0.1.0",
4
+ "private": true,
5
+ "description": "Orchestration layer: IrcRuntime port, dispatch interpreter, ConnectionActor",
6
+ "license": "BSD-3-Clause",
7
+ "type": "module",
8
+ "main": "./dist/index.js",
9
+ "types": "./dist/index.d.ts",
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js"
14
+ }
15
+ },
16
+ "scripts": {
17
+ "build": "tsc -p tsconfig.build.json",
18
+ "typecheck": "tsc -p tsconfig.test.json --noEmit",
19
+ "test": "vitest run",
20
+ "test:watch": "vitest",
21
+ "coverage": "vitest run --coverage",
22
+ "clean": "rimraf dist coverage .tsbuildinfo .turbo"
23
+ },
24
+ "files": ["dist", "src", "README.md"],
25
+ "dependencies": {
26
+ "@serverless-ircd/irc-core": "workspace:*"
27
+ }
28
+ }