@pinet/imessage-bridge 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.
- package/LICENSE +21 -0
- package/README.md +79 -0
- package/dist/adapter.d.ts +23 -0
- package/dist/adapter.js +44 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/mvp.d.ts +23 -0
- package/dist/mvp.js +65 -0
- package/dist/send.d.ts +23 -0
- package/dist/send.js +55 -0
- package/package.json +38 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Will Porcellini
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# @pinet/imessage-bridge
|
|
2
|
+
|
|
3
|
+
Thin macOS/iMessage **send-first** package for the `extensions` repo.
|
|
4
|
+
|
|
5
|
+
## What this slice does
|
|
6
|
+
|
|
7
|
+
This package now covers the smallest useful live transport path:
|
|
8
|
+
|
|
9
|
+
- adapter-local readiness checks for a local macOS iMessage MVP
|
|
10
|
+
- an AppleScript-backed outbound adapter for **send-first** delivery
|
|
11
|
+
- transport-local helpers that the shared broker/runtime core can call without burying iMessage logic inside `slack-bridge`
|
|
12
|
+
|
|
13
|
+
## Current MVP shape
|
|
14
|
+
|
|
15
|
+
The current implementation is intentionally narrow:
|
|
16
|
+
|
|
17
|
+
- **macOS only**
|
|
18
|
+
- **send-first**
|
|
19
|
+
- **AppleScript delivery** through `/usr/bin/osascript`
|
|
20
|
+
- **shared-core delivery** via the broker adapter seam
|
|
21
|
+
- **local history readiness** still modeled against `~/Library/Messages/chat.db`
|
|
22
|
+
|
|
23
|
+
That means outbound sends can work even when the local Messages database is unavailable, while startup/readiness reporting still makes the history blocker explicit.
|
|
24
|
+
|
|
25
|
+
## Trust boundary notes
|
|
26
|
+
|
|
27
|
+
`@pinet/imessage-bridge` is an intentional **same-host local-power surface**.
|
|
28
|
+
|
|
29
|
+
- When enabled, outbound sends run through the local Messages app via `/usr/bin/osascript` as the current macOS user.
|
|
30
|
+
- There is no extra approval or policy layer inside this package today; the trust boundary is local operator intent on the same host.
|
|
31
|
+
- The current MVP is still **send-first**, so outbound capability can be ready even when local history access is unavailable.
|
|
32
|
+
- Missing `chat.db` only blocks local history/readiness depth. It does **not** remove the outbound send power when AppleScript remains available.
|
|
33
|
+
|
|
34
|
+
Treat this as explicit local outbound power, not as a remote-safe transport or a generic policy-enforced messaging surface.
|
|
35
|
+
|
|
36
|
+
In the current repo bring-up path, enable the adapter with `slack-bridge.imessage.enabled: true` and start the broker runtime with `/pinet start`.
|
|
37
|
+
|
|
38
|
+
## What stays in this package
|
|
39
|
+
|
|
40
|
+
- readiness detection
|
|
41
|
+
- canonical local path assumptions for the Messages database
|
|
42
|
+
- AppleScript send helper + adapter-local transport code
|
|
43
|
+
- stable default thread-id helper for send-first bring-up
|
|
44
|
+
|
|
45
|
+
## Publishing
|
|
46
|
+
|
|
47
|
+
This package is included in the full npm publish set tracked in
|
|
48
|
+
[`../plans/npm-publish.md`](../plans/npm-publish.md). Use the GitHub Actions
|
|
49
|
+
workflow's default dry-run/readiness path for validation; do not publish, tag, or
|
|
50
|
+
bump versions without explicit maintainer release approval.
|
|
51
|
+
|
|
52
|
+
## What stays out of scope
|
|
53
|
+
|
|
54
|
+
- inbound iMessage sync
|
|
55
|
+
- chat database query plumbing
|
|
56
|
+
- generic transport UI redesign
|
|
57
|
+
- WhatsApp or other transport work
|
|
58
|
+
- broad Slack/Pinet separation cleanup beyond the existing broker adapter seam
|
|
59
|
+
|
|
60
|
+
## Example
|
|
61
|
+
|
|
62
|
+
```ts
|
|
63
|
+
import {
|
|
64
|
+
createIMessageAdapter,
|
|
65
|
+
detectIMessageMvpEnvironment,
|
|
66
|
+
getDefaultIMessageThreadId,
|
|
67
|
+
} from "@pinet/imessage-bridge";
|
|
68
|
+
|
|
69
|
+
const readiness = detectIMessageMvpEnvironment();
|
|
70
|
+
if (readiness.canAttemptSend) {
|
|
71
|
+
const adapter = createIMessageAdapter();
|
|
72
|
+
await adapter.connect();
|
|
73
|
+
await adapter.send({
|
|
74
|
+
threadId: getDefaultIMessageThreadId("chat:alice"),
|
|
75
|
+
channel: "chat:alice",
|
|
76
|
+
text: "hello from pi",
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
```
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { InboundMessage as IMessageAdapterInboundMessage, MessageAdapter, OutboundMessage as IMessageAdapterOutboundMessage } from "@pinet/transport-core";
|
|
2
|
+
import { type RunAppleScript } from "./send.js";
|
|
3
|
+
import { type DetectIMessageMvpEnvironmentOptions, type IMessageMvpEnvironment } from "./mvp.js";
|
|
4
|
+
export type { IMessageAdapterInboundMessage, IMessageAdapterOutboundMessage };
|
|
5
|
+
export interface IMessageAdapterOptions {
|
|
6
|
+
osascriptPath?: string;
|
|
7
|
+
runAppleScript?: RunAppleScript;
|
|
8
|
+
detectEnvironmentOptions?: DetectIMessageMvpEnvironmentOptions;
|
|
9
|
+
detectEnvironment?: (options?: DetectIMessageMvpEnvironmentOptions) => IMessageMvpEnvironment;
|
|
10
|
+
}
|
|
11
|
+
export interface IMessageAdapter extends MessageAdapter {
|
|
12
|
+
readonly name: "imessage";
|
|
13
|
+
}
|
|
14
|
+
export declare class AppleScriptIMessageAdapter implements IMessageAdapter {
|
|
15
|
+
readonly name: "imessage";
|
|
16
|
+
private readonly options;
|
|
17
|
+
constructor(options?: IMessageAdapterOptions);
|
|
18
|
+
connect(): Promise<void>;
|
|
19
|
+
disconnect(): Promise<void>;
|
|
20
|
+
onInbound(_handler: (msg: IMessageAdapterInboundMessage) => void): void;
|
|
21
|
+
send(msg: IMessageAdapterOutboundMessage): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
export declare function createIMessageAdapter(options?: IMessageAdapterOptions): IMessageAdapter;
|
package/dist/adapter.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { assertIMessageSendCapability, sendIMessage } from "./send.js";
|
|
2
|
+
import { formatIMessageMvpReadiness, } from "./mvp.js";
|
|
3
|
+
export class AppleScriptIMessageAdapter {
|
|
4
|
+
name = "imessage";
|
|
5
|
+
options;
|
|
6
|
+
constructor(options = {}) {
|
|
7
|
+
this.options = options;
|
|
8
|
+
}
|
|
9
|
+
async connect() {
|
|
10
|
+
const detectEnvironment = this.options.detectEnvironment;
|
|
11
|
+
const environment = detectEnvironment
|
|
12
|
+
? detectEnvironment(this.options.detectEnvironmentOptions)
|
|
13
|
+
: null;
|
|
14
|
+
if (environment) {
|
|
15
|
+
if (!environment.canAttemptSend) {
|
|
16
|
+
throw new Error([
|
|
17
|
+
"iMessage send-first adapter is not ready.",
|
|
18
|
+
...formatIMessageMvpReadiness(environment),
|
|
19
|
+
].join(" "));
|
|
20
|
+
}
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
assertIMessageSendCapability(this.options.detectEnvironmentOptions);
|
|
24
|
+
}
|
|
25
|
+
async disconnect() {
|
|
26
|
+
// The current send-first adapter does not hold inbound subscriptions or
|
|
27
|
+
// long-lived connection state beyond the shared MessageAdapter surface.
|
|
28
|
+
}
|
|
29
|
+
onInbound(_handler) {
|
|
30
|
+
// The shared MessageAdapter contract requires an inbound hook, but the
|
|
31
|
+
// current iMessage adapter is send-only and intentionally ignores it.
|
|
32
|
+
}
|
|
33
|
+
async send(msg) {
|
|
34
|
+
await sendIMessage({
|
|
35
|
+
recipient: msg.channel,
|
|
36
|
+
text: msg.content?.text ?? msg.text,
|
|
37
|
+
osascriptPath: this.options.osascriptPath,
|
|
38
|
+
runAppleScript: this.options.runAppleScript,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
export function createIMessageAdapter(options = {}) {
|
|
43
|
+
return new AppleScriptIMessageAdapter(options);
|
|
44
|
+
}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { APPLESCRIPT_BINARY_PATH, DEFAULT_MESSAGES_DB_RELATIVE_PATH, type DetectIMessageMvpEnvironmentOptions, detectIMessageMvpEnvironment, formatIMessageMvpReadiness, getDefaultMessagesDbPath, type IMessageMvpEnvironment, type IMessageMvpEnvironmentBlocker, } from "./mvp.js";
|
|
2
|
+
export { AppleScriptIMessageAdapter, createIMessageAdapter, type IMessageAdapter, type IMessageAdapterInboundMessage, type IMessageAdapterOptions, type IMessageAdapterOutboundMessage, } from "./adapter.js";
|
|
3
|
+
export { assertIMessageSendCapability, buildIMessageSendAppleScript, getDefaultIMessageThreadId, normalizeIMessageRecipient, runAppleScript, sendIMessage, type RunAppleScript, type RunAppleScriptInput, type RunAppleScriptResult, type SendIMessageOptions, } from "./send.js";
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { APPLESCRIPT_BINARY_PATH, DEFAULT_MESSAGES_DB_RELATIVE_PATH, detectIMessageMvpEnvironment, formatIMessageMvpReadiness, getDefaultMessagesDbPath, } from "./mvp.js";
|
|
2
|
+
export { AppleScriptIMessageAdapter, createIMessageAdapter, } from "./adapter.js";
|
|
3
|
+
export { assertIMessageSendCapability, buildIMessageSendAppleScript, getDefaultIMessageThreadId, normalizeIMessageRecipient, runAppleScript, sendIMessage, } from "./send.js";
|
package/dist/mvp.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export declare const APPLESCRIPT_BINARY_PATH = "/usr/bin/osascript";
|
|
2
|
+
export declare const DEFAULT_MESSAGES_DB_RELATIVE_PATH: string;
|
|
3
|
+
export type IMessageMvpEnvironmentBlocker = "unsupported_platform" | "missing_osascript" | "missing_messages_db";
|
|
4
|
+
export interface IMessageMvpEnvironment {
|
|
5
|
+
platform: NodeJS.Platform;
|
|
6
|
+
homeDir: string;
|
|
7
|
+
messagesDbPath: string;
|
|
8
|
+
osascriptPath: string;
|
|
9
|
+
osascriptAvailable: boolean;
|
|
10
|
+
messagesDbAvailable: boolean;
|
|
11
|
+
canAttemptSend: boolean;
|
|
12
|
+
canAttemptHistoryRead: boolean;
|
|
13
|
+
readyForLocalMvp: boolean;
|
|
14
|
+
blockers: IMessageMvpEnvironmentBlocker[];
|
|
15
|
+
}
|
|
16
|
+
export interface DetectIMessageMvpEnvironmentOptions {
|
|
17
|
+
platform?: NodeJS.Platform;
|
|
18
|
+
homeDir?: string;
|
|
19
|
+
pathExists?: (candidatePath: string) => boolean;
|
|
20
|
+
}
|
|
21
|
+
export declare function getDefaultMessagesDbPath(homeDir?: string): string;
|
|
22
|
+
export declare function detectIMessageMvpEnvironment(options?: DetectIMessageMvpEnvironmentOptions): IMessageMvpEnvironment;
|
|
23
|
+
export declare function formatIMessageMvpReadiness(environment: IMessageMvpEnvironment): string[];
|
package/dist/mvp.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import * as os from "node:os";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import { existsSync } from "node:fs";
|
|
4
|
+
export const APPLESCRIPT_BINARY_PATH = "/usr/bin/osascript";
|
|
5
|
+
export const DEFAULT_MESSAGES_DB_RELATIVE_PATH = path.join("Library", "Messages", "chat.db");
|
|
6
|
+
export function getDefaultMessagesDbPath(homeDir = os.homedir()) {
|
|
7
|
+
return path.join(homeDir, DEFAULT_MESSAGES_DB_RELATIVE_PATH);
|
|
8
|
+
}
|
|
9
|
+
export function detectIMessageMvpEnvironment(options = {}) {
|
|
10
|
+
const platform = options.platform ?? process.platform;
|
|
11
|
+
const homeDir = options.homeDir ?? os.homedir();
|
|
12
|
+
const pathExists = options.pathExists ?? existsSync;
|
|
13
|
+
const osascriptPath = APPLESCRIPT_BINARY_PATH;
|
|
14
|
+
const messagesDbPath = getDefaultMessagesDbPath(homeDir);
|
|
15
|
+
const supportedPlatform = platform === "darwin";
|
|
16
|
+
const osascriptAvailable = supportedPlatform && pathExists(osascriptPath);
|
|
17
|
+
const messagesDbAvailable = supportedPlatform && pathExists(messagesDbPath);
|
|
18
|
+
const blockers = [];
|
|
19
|
+
if (!supportedPlatform) {
|
|
20
|
+
blockers.push("unsupported_platform");
|
|
21
|
+
}
|
|
22
|
+
if (supportedPlatform && !osascriptAvailable) {
|
|
23
|
+
blockers.push("missing_osascript");
|
|
24
|
+
}
|
|
25
|
+
if (supportedPlatform && !messagesDbAvailable) {
|
|
26
|
+
blockers.push("missing_messages_db");
|
|
27
|
+
}
|
|
28
|
+
const canAttemptSend = supportedPlatform && osascriptAvailable;
|
|
29
|
+
const canAttemptHistoryRead = supportedPlatform && messagesDbAvailable;
|
|
30
|
+
return {
|
|
31
|
+
platform,
|
|
32
|
+
homeDir,
|
|
33
|
+
messagesDbPath,
|
|
34
|
+
osascriptPath,
|
|
35
|
+
osascriptAvailable,
|
|
36
|
+
messagesDbAvailable,
|
|
37
|
+
canAttemptSend,
|
|
38
|
+
canAttemptHistoryRead,
|
|
39
|
+
readyForLocalMvp: canAttemptSend && canAttemptHistoryRead,
|
|
40
|
+
blockers,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export function formatIMessageMvpReadiness(environment) {
|
|
44
|
+
const lines = [
|
|
45
|
+
`platform: ${environment.platform}`,
|
|
46
|
+
`osascript: ${environment.osascriptAvailable ? "ready" : "missing"} (${environment.osascriptPath})`,
|
|
47
|
+
`messages-db: ${environment.messagesDbAvailable ? "ready" : "missing"} (${environment.messagesDbPath})`,
|
|
48
|
+
"trust-boundary: same-host local-power surface; when enabled, outbound sends go through the local Messages app via /usr/bin/osascript as the current macOS user.",
|
|
49
|
+
];
|
|
50
|
+
if (environment.readyForLocalMvp) {
|
|
51
|
+
lines.push("mvp: local macOS iMessage send/history scaffold is ready");
|
|
52
|
+
return lines;
|
|
53
|
+
}
|
|
54
|
+
if (environment.canAttemptSend && !environment.canAttemptHistoryRead) {
|
|
55
|
+
lines.push("mvp: send-first ready; local history is unavailable");
|
|
56
|
+
lines.push(`mvp blockers: ${environment.blockers.join(", ")}`);
|
|
57
|
+
return lines;
|
|
58
|
+
}
|
|
59
|
+
if (environment.blockers.length === 0) {
|
|
60
|
+
lines.push("mvp: not ready");
|
|
61
|
+
return lines;
|
|
62
|
+
}
|
|
63
|
+
lines.push(`mvp blockers: ${environment.blockers.join(", ")}`);
|
|
64
|
+
return lines;
|
|
65
|
+
}
|
package/dist/send.d.ts
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type DetectIMessageMvpEnvironmentOptions } from "./mvp.js";
|
|
2
|
+
export interface RunAppleScriptInput {
|
|
3
|
+
osascriptPath: string;
|
|
4
|
+
scriptLines: string[];
|
|
5
|
+
args: string[];
|
|
6
|
+
}
|
|
7
|
+
export interface RunAppleScriptResult {
|
|
8
|
+
stdout: string;
|
|
9
|
+
stderr: string;
|
|
10
|
+
}
|
|
11
|
+
export type RunAppleScript = (input: RunAppleScriptInput) => Promise<RunAppleScriptResult> | RunAppleScriptResult;
|
|
12
|
+
export interface SendIMessageOptions {
|
|
13
|
+
recipient: string;
|
|
14
|
+
text: string;
|
|
15
|
+
osascriptPath?: string;
|
|
16
|
+
runAppleScript?: RunAppleScript;
|
|
17
|
+
}
|
|
18
|
+
export declare function normalizeIMessageRecipient(recipient: string): string;
|
|
19
|
+
export declare function getDefaultIMessageThreadId(recipient: string): string;
|
|
20
|
+
export declare function buildIMessageSendAppleScript(): string[];
|
|
21
|
+
export declare function runAppleScript(input: RunAppleScriptInput): Promise<RunAppleScriptResult>;
|
|
22
|
+
export declare function assertIMessageSendCapability(options?: DetectIMessageMvpEnvironmentOptions): void;
|
|
23
|
+
export declare function sendIMessage(options: SendIMessageOptions): Promise<RunAppleScriptResult>;
|
package/dist/send.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { promisify } from "node:util";
|
|
3
|
+
import { APPLESCRIPT_BINARY_PATH, detectIMessageMvpEnvironment, formatIMessageMvpReadiness, } from "./mvp.js";
|
|
4
|
+
const execFileAsync = promisify(execFile);
|
|
5
|
+
export function normalizeIMessageRecipient(recipient) {
|
|
6
|
+
const normalized = recipient.trim();
|
|
7
|
+
if (!normalized) {
|
|
8
|
+
throw new Error("iMessage recipient is required.");
|
|
9
|
+
}
|
|
10
|
+
return normalized;
|
|
11
|
+
}
|
|
12
|
+
export function getDefaultIMessageThreadId(recipient) {
|
|
13
|
+
return `imessage:${normalizeIMessageRecipient(recipient).toLowerCase()}`;
|
|
14
|
+
}
|
|
15
|
+
export function buildIMessageSendAppleScript() {
|
|
16
|
+
return [
|
|
17
|
+
"on run argv",
|
|
18
|
+
"set recipientHandle to item 1 of argv",
|
|
19
|
+
"set messageBody to item 2 of argv",
|
|
20
|
+
'tell application "Messages"',
|
|
21
|
+
"set targetService to 1st service whose service type = iMessage",
|
|
22
|
+
"set targetBuddy to buddy recipientHandle of targetService",
|
|
23
|
+
"send messageBody to targetBuddy",
|
|
24
|
+
"end tell",
|
|
25
|
+
"end run",
|
|
26
|
+
];
|
|
27
|
+
}
|
|
28
|
+
export async function runAppleScript(input) {
|
|
29
|
+
const args = [...input.scriptLines.flatMap((line) => ["-e", line]), ...input.args];
|
|
30
|
+
const result = await execFileAsync(input.osascriptPath, args);
|
|
31
|
+
return {
|
|
32
|
+
stdout: result.stdout,
|
|
33
|
+
stderr: result.stderr,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
export function assertIMessageSendCapability(options = {}) {
|
|
37
|
+
const environment = detectIMessageMvpEnvironment(options);
|
|
38
|
+
if (environment.canAttemptSend) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
throw new Error(["iMessage send-first adapter is not ready.", ...formatIMessageMvpReadiness(environment)].join(" "));
|
|
42
|
+
}
|
|
43
|
+
export async function sendIMessage(options) {
|
|
44
|
+
const recipient = normalizeIMessageRecipient(options.recipient);
|
|
45
|
+
const text = options.text.trim();
|
|
46
|
+
if (!text) {
|
|
47
|
+
throw new Error("iMessage text is required.");
|
|
48
|
+
}
|
|
49
|
+
const runner = options.runAppleScript ?? runAppleScript;
|
|
50
|
+
return runner({
|
|
51
|
+
osascriptPath: options.osascriptPath ?? APPLESCRIPT_BINARY_PATH,
|
|
52
|
+
scriptLines: buildIMessageSendAppleScript(),
|
|
53
|
+
args: [recipient, text],
|
|
54
|
+
});
|
|
55
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@pinet/imessage-bridge",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "macOS/iMessage send-first adapter and readiness helpers for pi",
|
|
6
|
+
"author": "Will Porcellini <5994936+gugu91@users.noreply.github.com>",
|
|
7
|
+
"license": "MIT",
|
|
8
|
+
"repository": {
|
|
9
|
+
"type": "git",
|
|
10
|
+
"url": "git+https://github.com/gugu91/extensions.git",
|
|
11
|
+
"directory": "imessage-bridge"
|
|
12
|
+
},
|
|
13
|
+
"publishConfig": {
|
|
14
|
+
"access": "public"
|
|
15
|
+
},
|
|
16
|
+
"main": "./dist/index.js",
|
|
17
|
+
"exports": {
|
|
18
|
+
".": "./dist/index.js",
|
|
19
|
+
"./package.json": "./package.json"
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"README.md",
|
|
23
|
+
"LICENSE",
|
|
24
|
+
"dist/"
|
|
25
|
+
],
|
|
26
|
+
"pi": {},
|
|
27
|
+
"scripts": {
|
|
28
|
+
"build": "node ../scripts/build-package.mjs",
|
|
29
|
+
"prepack": "pnpm run build",
|
|
30
|
+
"lint": "eslint . --ext .ts",
|
|
31
|
+
"typecheck": "tsc --noEmit",
|
|
32
|
+
"test": "vitest run"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@pinet/transport-core": "0.1.0"
|
|
36
|
+
},
|
|
37
|
+
"types": "./dist/index.d.ts"
|
|
38
|
+
}
|