@drawtonomy/sdk 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/README.md ADDED
@@ -0,0 +1,141 @@
1
+ # @drawtonomy/sdk
2
+
3
+ Drawtonomy エクステンション開発用SDK。
4
+
5
+ ## インストール
6
+
7
+ ```bash
8
+ npm install @drawtonomy/sdk
9
+ ```
10
+
11
+ ## クイックスタート
12
+
13
+ ### 1. マニフェストを作成
14
+
15
+ ```json
16
+ {
17
+ "id": "my-extension",
18
+ "name": "My Extension",
19
+ "version": "1.0.0",
20
+ "description": "何をするエクステンションか",
21
+ "author": { "name": "Your Name" },
22
+ "entry": "./index.html",
23
+ "capabilities": ["shapes:write", "shapes:read", "ui:panel"]
24
+ }
25
+ ```
26
+
27
+ ### 2. SDKを使ってエクステンションを実装
28
+
29
+ ```typescript
30
+ import { ExtensionClient, createVehicle, createLaneWithBoundaries } from '@drawtonomy/sdk'
31
+
32
+ const client = new ExtensionClient('my-extension')
33
+
34
+ // ホストとの接続を待つ
35
+ const init = await client.waitForInit()
36
+ console.log('Connected! Capabilities:', init.grantedCapabilities)
37
+
38
+ // 車両を追加
39
+ client.addShapes([
40
+ createVehicle(200, 300, { templateId: 'sedan', color: 'blue' })
41
+ ])
42
+
43
+ // レーンを一括作成
44
+ const laneShapes = createLaneWithBoundaries(
45
+ [{ x: 0, y: 0 }, { x: 500, y: 0 }],
46
+ [{ x: 0, y: 70 }, { x: 500, y: 70 }]
47
+ )
48
+ client.addShapes(laneShapes)
49
+
50
+ // 既存シェイプを読み取り
51
+ const vehicles = await client.requestShapes({ types: ['vehicle'] })
52
+
53
+ // 通知を表示
54
+ client.notify('完了しました', 'success')
55
+ ```
56
+
57
+ ### 3. 開発サーバーで起動
58
+
59
+ ```bash
60
+ npm run dev -- --port 3001
61
+ ```
62
+
63
+ ### 4. Drawtonomyで読み込む
64
+
65
+ ブラウザで以下のURLにアクセス:
66
+
67
+ ```
68
+ https://drawtonomy.com?ext=http://localhost:3001/manifest.json
69
+ ```
70
+
71
+ ## API
72
+
73
+ ### ExtensionClient
74
+
75
+ | メソッド | 必要なCapability | 説明 |
76
+ |---------|-----------------|------|
77
+ | `waitForInit()` | - | ホストとの接続を待つ |
78
+ | `addShapes(shapes)` | `shapes:write` | シェイプを追加 |
79
+ | `updateShapes(updates)` | `shapes:write` | シェイプを更新 |
80
+ | `deleteShapes(ids)` | `shapes:write` | シェイプを削除 |
81
+ | `requestShapes(filter?)` | `shapes:read` | シェイプを読み取り |
82
+ | `requestSnapshot()` | `snapshot:read` | スナップショットを取得 |
83
+ | `requestViewport()` | `viewport:read` | ビューポート情報を取得 |
84
+ | `requestSelection()` | `selection:read` | 選択状態を取得 |
85
+ | `notify(message, level?)` | `ui:notify` | 通知を表示 |
86
+ | `resize(height, width?)` | `ui:panel` | パネルサイズを変更 |
87
+
88
+ ### ファクトリ関数
89
+
90
+ | 関数 | 説明 |
91
+ |------|------|
92
+ | `createPoint(x, y, options?)` | ポイントを作成 |
93
+ | `createLinestring(x, y, pointIds, options?)` | ラインストリングを作成 |
94
+ | `createLane(x, y, leftId, rightId, options?)` | レーンを作成 |
95
+ | `createLaneWithBoundaries(leftPts, rightPts, options?)` | レーン+境界を一括作成 |
96
+ | `createVehicle(x, y, options?)` | 車両を作成 |
97
+ | `createPedestrian(x, y, options?)` | 歩行者を作成 |
98
+ | `createRectangle(x, y, w, h, options?)` | 矩形を作成 |
99
+ | `createEllipse(x, y, w, h, options?)` | 楕円を作成 |
100
+ | `createText(x, y, text, options?)` | テキストを作成 |
101
+ | `createSnapshot(shapes)` | スナップショットを作成 |
102
+
103
+ ## デプロイ
104
+
105
+ エクステンションは任意のHTTPSホスティングサービスにデプロイできます。
106
+
107
+ ### GitHub Pages
108
+
109
+ `manifest.json`のCORSヘッダーは自動付与されるため設定不要。
110
+
111
+ ### Vercel
112
+
113
+ `vercel.json`:
114
+ ```json
115
+ {
116
+ "headers": [
117
+ {
118
+ "source": "/manifest.json",
119
+ "headers": [
120
+ { "key": "Access-Control-Allow-Origin", "value": "*" }
121
+ ]
122
+ }
123
+ ]
124
+ }
125
+ ```
126
+
127
+ ### Netlify
128
+
129
+ `_headers`:
130
+ ```
131
+ /manifest.json
132
+ Access-Control-Allow-Origin: *
133
+ ```
134
+
135
+ ### ローカル開発
136
+
137
+ Vite devサーバーはデフォルトでCORS許可済み。`localhost`はHTTPでも動作します。
138
+
139
+ ## ドキュメント
140
+
141
+ 詳細は https://github.com/kosuke55/drawtonomy-app/blob/main/docs/extensions.md を参照。
@@ -0,0 +1,41 @@
1
+ import type { InitPayload, ShapeFilter, BaseShape, DrawtonomySnapshot } from './types';
2
+ export declare class ExtensionClient {
3
+ private manifestId;
4
+ private initPromise;
5
+ private initResolve;
6
+ private pendingRequests;
7
+ private requestTimeout;
8
+ constructor(manifestId: string, options?: {
9
+ requestTimeout?: number;
10
+ });
11
+ /**
12
+ * Wait for the host to send init payload
13
+ */
14
+ waitForInit(): Promise<InitPayload>;
15
+ addShapes(shapes: BaseShape[]): void;
16
+ updateShapes(updates: Array<{
17
+ id: string;
18
+ props: Record<string, unknown>;
19
+ }>): void;
20
+ deleteShapes(ids: string[]): void;
21
+ requestShapes(filter?: ShapeFilter): Promise<BaseShape[]>;
22
+ requestSnapshot(): Promise<DrawtonomySnapshot>;
23
+ requestViewport(): Promise<{
24
+ x: number;
25
+ y: number;
26
+ zoom: number;
27
+ width: number;
28
+ height: number;
29
+ }>;
30
+ requestSelection(): Promise<{
31
+ ids: string[];
32
+ }>;
33
+ notify(message: string, level?: 'info' | 'success' | 'error'): void;
34
+ resize(height: number, width?: number): void;
35
+ private send;
36
+ private handleMessage;
37
+ private requestIdCounter;
38
+ private nextRequestId;
39
+ private waitForResponse;
40
+ }
41
+ //# sourceMappingURL=ExtensionClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtensionClient.d.ts","sourceRoot":"","sources":["../src/ExtensionClient.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,WAAW,EACX,WAAW,EACX,SAAS,EACT,kBAAkB,EACnB,MAAM,SAAS,CAAA;AAQhB,qBAAa,eAAe;IAC1B,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,WAAW,CAAiC;IACpD,OAAO,CAAC,eAAe,CAAoC;IAC3D,OAAO,CAAC,cAAc,CAAQ;gBAElB,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,MAAM,CAAA;KAAE;IAcrE;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC;IAMzC,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE;IAI7B,YAAY,CAAC,OAAO,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;KAAE,CAAC;IAI3E,YAAY,CAAC,GAAG,EAAE,MAAM,EAAE;IAMpB,aAAa,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IASzD,eAAe,IAAI,OAAO,CAAC,kBAAkB,CAAC;IAS9C,eAAe,IAAI,OAAO,CAAC;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAQjG,gBAAgB,IAAI,OAAO,CAAC;QAAE,GAAG,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAQpD,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,MAAM,GAAG,SAAS,GAAG,OAAgB;IAMpE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM;IAMrC,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,gBAAgB,CAAI;IAE5B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,eAAe;CAUxB"}
@@ -0,0 +1,111 @@
1
+ export class ExtensionClient {
2
+ constructor(manifestId, options) {
3
+ this.pendingRequests = new Map();
4
+ this.requestIdCounter = 0;
5
+ this.manifestId = manifestId;
6
+ this.requestTimeout = options?.requestTimeout ?? 30000;
7
+ this.initPromise = new Promise(resolve => {
8
+ this.initResolve = resolve;
9
+ });
10
+ window.addEventListener('message', this.handleMessage.bind(this));
11
+ // Send ready signal
12
+ this.send({ type: 'ext:ready', payload: { manifestId } });
13
+ }
14
+ /**
15
+ * Wait for the host to send init payload
16
+ */
17
+ async waitForInit() {
18
+ return this.initPromise;
19
+ }
20
+ // --- shapes:write ---
21
+ addShapes(shapes) {
22
+ this.send({ type: 'ext:shapes-add', payload: { shapes } });
23
+ }
24
+ updateShapes(updates) {
25
+ this.send({ type: 'ext:shapes-update', payload: { updates } });
26
+ }
27
+ deleteShapes(ids) {
28
+ this.send({ type: 'ext:shapes-delete', payload: { ids } });
29
+ }
30
+ // --- shapes:read ---
31
+ async requestShapes(filter) {
32
+ const requestId = this.nextRequestId();
33
+ this.send({ type: 'ext:shapes-request', payload: { requestId, filter } });
34
+ const response = await this.waitForResponse(requestId);
35
+ return response.shapes;
36
+ }
37
+ // --- snapshot:read ---
38
+ async requestSnapshot() {
39
+ const requestId = this.nextRequestId();
40
+ this.send({ type: 'ext:snapshot-request', payload: { requestId } });
41
+ const response = await this.waitForResponse(requestId);
42
+ return response.snapshot;
43
+ }
44
+ // --- viewport:read ---
45
+ async requestViewport() {
46
+ const requestId = this.nextRequestId();
47
+ this.send({ type: 'ext:viewport-request', payload: { requestId } });
48
+ return await this.waitForResponse(requestId);
49
+ }
50
+ // --- selection:read ---
51
+ async requestSelection() {
52
+ const requestId = this.nextRequestId();
53
+ this.send({ type: 'ext:selection-request', payload: { requestId } });
54
+ return await this.waitForResponse(requestId);
55
+ }
56
+ // --- ui:notify ---
57
+ notify(message, level = 'info') {
58
+ this.send({ type: 'ext:notify', payload: { message, level } });
59
+ }
60
+ // --- ui:panel ---
61
+ resize(height, width) {
62
+ this.send({ type: 'ext:resize', payload: { height, width } });
63
+ }
64
+ // --- Internal ---
65
+ send(message) {
66
+ window.parent.postMessage(message, '*');
67
+ }
68
+ handleMessage(event) {
69
+ const data = event.data;
70
+ if (!data || typeof data !== 'object' || typeof data.type !== 'string')
71
+ return;
72
+ if (!data.type.startsWith('ext:'))
73
+ return;
74
+ if (data.type === 'ext:init') {
75
+ this.initResolve(data.payload);
76
+ return;
77
+ }
78
+ // Handle responses
79
+ if (data.type === 'ext:error' && data.payload?.requestId) {
80
+ const pending = this.pendingRequests.get(data.payload.requestId);
81
+ if (pending) {
82
+ clearTimeout(pending.timeout);
83
+ this.pendingRequests.delete(data.payload.requestId);
84
+ pending.reject(new Error(data.payload.message));
85
+ }
86
+ return;
87
+ }
88
+ const requestId = data.payload?.requestId;
89
+ if (requestId) {
90
+ const pending = this.pendingRequests.get(requestId);
91
+ if (pending) {
92
+ clearTimeout(pending.timeout);
93
+ this.pendingRequests.delete(requestId);
94
+ pending.resolve(data.payload);
95
+ }
96
+ }
97
+ }
98
+ nextRequestId() {
99
+ return `${this.manifestId}_${++this.requestIdCounter}_${Date.now().toString(36)}`;
100
+ }
101
+ waitForResponse(requestId) {
102
+ return new Promise((resolve, reject) => {
103
+ const timeout = setTimeout(() => {
104
+ this.pendingRequests.delete(requestId);
105
+ reject(new Error(`Request ${requestId} timed out`));
106
+ }, this.requestTimeout);
107
+ this.pendingRequests.set(requestId, { resolve, reject, timeout });
108
+ });
109
+ }
110
+ }
111
+ //# sourceMappingURL=ExtensionClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ExtensionClient.js","sourceRoot":"","sources":["../src/ExtensionClient.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,54 @@
1
+ import type { BaseShape, PointProps, LinestringProps, LaneProps, VehicleProps, PedestrianProps, RectangleProps, EllipseProps, TextProps, DrawtonomySnapshot } from './types';
2
+ export declare function resetIdCounter(): void;
3
+ export declare function createPoint(x: number, y: number, options?: Partial<PointProps> & {
4
+ id?: string;
5
+ }): BaseShape<'point', PointProps>;
6
+ export declare function createLinestring(x: number, y: number, pointIds: string[], options?: Partial<LinestringProps> & {
7
+ id?: string;
8
+ }): BaseShape<'linestring', LinestringProps>;
9
+ export declare function createLane(x: number, y: number, leftBoundaryId: string, rightBoundaryId: string, options?: Partial<LaneProps> & {
10
+ id?: string;
11
+ }): BaseShape<'lane', LaneProps>;
12
+ export interface LaneWithBoundariesOptions {
13
+ laneOptions?: Partial<LaneProps> & {
14
+ id?: string;
15
+ };
16
+ leftOptions?: Partial<LinestringProps> & {
17
+ id?: string;
18
+ };
19
+ rightOptions?: Partial<LinestringProps> & {
20
+ id?: string;
21
+ };
22
+ }
23
+ /**
24
+ * Create a complete lane with its boundary linestrings and points.
25
+ *
26
+ * @param leftPoints - Array of {x, y} for left boundary
27
+ * @param rightPoints - Array of {x, y} for right boundary
28
+ * @param options - Optional configuration for lane and boundaries
29
+ * @returns Array of shapes: points, linestrings, lane (in dependency order)
30
+ */
31
+ export declare function createLaneWithBoundaries(leftPoints: Array<{
32
+ x: number;
33
+ y: number;
34
+ }>, rightPoints: Array<{
35
+ x: number;
36
+ y: number;
37
+ }>, options?: LaneWithBoundariesOptions): BaseShape<string, any>[];
38
+ export declare function createVehicle(x: number, y: number, options?: Partial<VehicleProps> & {
39
+ id?: string;
40
+ }): BaseShape<'vehicle', VehicleProps>;
41
+ export declare function createPedestrian(x: number, y: number, options?: Partial<PedestrianProps> & {
42
+ id?: string;
43
+ }): BaseShape<'pedestrian', PedestrianProps>;
44
+ export declare function createRectangle(x: number, y: number, w: number, h: number, options?: Partial<RectangleProps> & {
45
+ id?: string;
46
+ }): BaseShape<'rectangle', RectangleProps>;
47
+ export declare function createEllipse(x: number, y: number, w: number, h: number, options?: Partial<EllipseProps> & {
48
+ id?: string;
49
+ }): BaseShape<'ellipse', EllipseProps>;
50
+ export declare function createText(x: number, y: number, text: string, options?: Partial<TextProps> & {
51
+ id?: string;
52
+ }): BaseShape<'text', TextProps>;
53
+ export declare function createSnapshot(shapes: BaseShape[]): DrawtonomySnapshot;
54
+ //# sourceMappingURL=helpers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,204 @@
1
+ let idCounter = 0;
2
+ function nextId(prefix = 'ext') {
3
+ return `${prefix}_${++idCounter}_${Date.now().toString(36)}`;
4
+ }
5
+ export function resetIdCounter() {
6
+ idCounter = 0;
7
+ }
8
+ // --- Point ---
9
+ export function createPoint(x, y, options) {
10
+ return {
11
+ id: options?.id ?? nextId('pt'),
12
+ type: 'point',
13
+ x,
14
+ y,
15
+ rotation: 0,
16
+ zIndex: 0,
17
+ props: {
18
+ color: options?.color ?? 'black',
19
+ visible: options?.visible ?? true,
20
+ osmId: options?.osmId ?? '',
21
+ },
22
+ };
23
+ }
24
+ // --- Linestring ---
25
+ export function createLinestring(x, y, pointIds, options) {
26
+ return {
27
+ id: options?.id ?? nextId('ls'),
28
+ type: 'linestring',
29
+ x,
30
+ y,
31
+ rotation: 0,
32
+ zIndex: 0,
33
+ props: {
34
+ pointIds,
35
+ color: options?.color ?? 'black',
36
+ strokeWidth: options?.strokeWidth ?? 2,
37
+ attributes: options?.attributes ?? { type: 'linestring', subtype: 'solid' },
38
+ osmId: options?.osmId ?? '',
39
+ },
40
+ };
41
+ }
42
+ // --- Lane ---
43
+ export function createLane(x, y, leftBoundaryId, rightBoundaryId, options) {
44
+ return {
45
+ id: options?.id ?? nextId('lane'),
46
+ type: 'lane',
47
+ x,
48
+ y,
49
+ rotation: 0,
50
+ zIndex: 0,
51
+ props: {
52
+ leftBoundaryId,
53
+ rightBoundaryId,
54
+ invertLeft: options?.invertLeft ?? false,
55
+ invertRight: options?.invertRight ?? false,
56
+ color: options?.color ?? 'default',
57
+ size: options?.size ?? 'm',
58
+ attributes: options?.attributes ?? { type: 'lanelet', subtype: 'road', speed_limit: '30' },
59
+ next: options?.next ?? [],
60
+ prev: options?.prev ?? [],
61
+ osmId: options?.osmId ?? '',
62
+ },
63
+ };
64
+ }
65
+ /**
66
+ * Create a complete lane with its boundary linestrings and points.
67
+ *
68
+ * @param leftPoints - Array of {x, y} for left boundary
69
+ * @param rightPoints - Array of {x, y} for right boundary
70
+ * @param options - Optional configuration for lane and boundaries
71
+ * @returns Array of shapes: points, linestrings, lane (in dependency order)
72
+ */
73
+ export function createLaneWithBoundaries(leftPoints, rightPoints, options) {
74
+ const shapes = [];
75
+ // Create left boundary points
76
+ const leftPointIds = [];
77
+ for (const pt of leftPoints) {
78
+ const point = createPoint(pt.x, pt.y);
79
+ leftPointIds.push(point.id);
80
+ shapes.push(point);
81
+ }
82
+ // Create right boundary points
83
+ const rightPointIds = [];
84
+ for (const pt of rightPoints) {
85
+ const point = createPoint(pt.x, pt.y);
86
+ rightPointIds.push(point.id);
87
+ shapes.push(point);
88
+ }
89
+ // Create linestrings
90
+ const leftLs = createLinestring(0, 0, leftPointIds, options?.leftOptions);
91
+ const rightLs = createLinestring(0, 0, rightPointIds, options?.rightOptions);
92
+ shapes.push(leftLs);
93
+ shapes.push(rightLs);
94
+ // Create lane
95
+ const lane = createLane(0, 0, leftLs.id, rightLs.id, options?.laneOptions);
96
+ shapes.push(lane);
97
+ return shapes;
98
+ }
99
+ // --- Vehicle ---
100
+ export function createVehicle(x, y, options) {
101
+ return {
102
+ id: options?.id ?? nextId('veh'),
103
+ type: 'vehicle',
104
+ x,
105
+ y,
106
+ rotation: options?.templateId ? 0 : 0,
107
+ zIndex: 0,
108
+ props: {
109
+ w: options?.w ?? 90,
110
+ h: options?.h ?? 45,
111
+ color: options?.color ?? 'black',
112
+ size: options?.size ?? 'm',
113
+ attributes: options?.attributes ?? { type: 'vehicle', subtype: 'car' },
114
+ osmId: options?.osmId ?? '',
115
+ templateId: options?.templateId ?? 'default',
116
+ },
117
+ };
118
+ }
119
+ // --- Pedestrian ---
120
+ export function createPedestrian(x, y, options) {
121
+ return {
122
+ id: options?.id ?? nextId('ped'),
123
+ type: 'pedestrian',
124
+ x,
125
+ y,
126
+ rotation: 0,
127
+ zIndex: 0,
128
+ props: {
129
+ w: options?.w ?? 22,
130
+ h: options?.h ?? 22,
131
+ color: options?.color ?? 'black',
132
+ size: options?.size ?? 'm',
133
+ attributes: options?.attributes ?? { type: 'pedestrian', subtype: 'person' },
134
+ osmId: options?.osmId ?? '',
135
+ templateId: options?.templateId ?? 'filled',
136
+ },
137
+ };
138
+ }
139
+ // --- Rectangle ---
140
+ export function createRectangle(x, y, w, h, options) {
141
+ return {
142
+ id: options?.id ?? nextId('rect'),
143
+ type: 'rectangle',
144
+ x,
145
+ y,
146
+ rotation: 0,
147
+ zIndex: 0,
148
+ props: {
149
+ w,
150
+ h,
151
+ color: options?.color ?? '#000000',
152
+ fill: options?.fill ?? 'none',
153
+ strokeWidth: options?.strokeWidth ?? 2,
154
+ },
155
+ };
156
+ }
157
+ // --- Ellipse ---
158
+ export function createEllipse(x, y, w, h, options) {
159
+ return {
160
+ id: options?.id ?? nextId('ell'),
161
+ type: 'ellipse',
162
+ x,
163
+ y,
164
+ rotation: 0,
165
+ zIndex: 0,
166
+ props: {
167
+ w,
168
+ h,
169
+ color: options?.color ?? '#000000',
170
+ fill: options?.fill ?? 'none',
171
+ strokeWidth: options?.strokeWidth ?? 2,
172
+ },
173
+ };
174
+ }
175
+ // --- Text ---
176
+ export function createText(x, y, text, options) {
177
+ return {
178
+ id: options?.id ?? nextId('txt'),
179
+ type: 'text',
180
+ x,
181
+ y,
182
+ rotation: 0,
183
+ zIndex: 0,
184
+ props: {
185
+ w: options?.w ?? 200,
186
+ h: options?.h ?? 32,
187
+ text,
188
+ color: options?.color ?? 'black',
189
+ fontSize: options?.fontSize ?? 20,
190
+ font: options?.font ?? 'sans',
191
+ textAlign: options?.textAlign ?? 'left',
192
+ autoSize: options?.autoSize ?? true,
193
+ },
194
+ };
195
+ }
196
+ // --- Snapshot ---
197
+ export function createSnapshot(shapes) {
198
+ return {
199
+ version: '1.1',
200
+ timestamp: new Date().toISOString(),
201
+ shapes,
202
+ };
203
+ }
204
+ //# sourceMappingURL=helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from './types';
2
+ export * from './helpers';
3
+ export { ExtensionClient } from './ExtensionClient';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA"}
package/dist/index.js ADDED
@@ -0,0 +1,5 @@
1
+ // @drawtonomy/sdk - Entry Point
2
+ export * from './types';
3
+ export * from './helpers';
4
+ export { ExtensionClient } from './ExtensionClient';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA"}
@@ -0,0 +1,205 @@
1
+ export type ShapeId = string;
2
+ export interface BaseShape<Type extends string = string, Props = Record<string, unknown>> {
3
+ id: ShapeId;
4
+ type: Type;
5
+ x: number;
6
+ y: number;
7
+ rotation: number;
8
+ zIndex: number;
9
+ index?: string;
10
+ props: Props;
11
+ }
12
+ export interface PointProps {
13
+ color: string;
14
+ visible: boolean;
15
+ osmId: string;
16
+ }
17
+ export interface LinestringProps {
18
+ pointIds: string[];
19
+ color: string;
20
+ strokeWidth: number;
21
+ opacity?: number | null;
22
+ attributes: {
23
+ type: string;
24
+ subtype: string;
25
+ };
26
+ osmId: string;
27
+ isPath?: boolean;
28
+ arrowHead?: string | null;
29
+ arrowHeadSize?: number | null;
30
+ smooth?: boolean | null;
31
+ segments?: Record<string, {
32
+ color?: string;
33
+ strokeWidth?: number;
34
+ opacity?: number;
35
+ }> | null;
36
+ }
37
+ export interface LaneProps {
38
+ leftBoundaryId: string | null;
39
+ rightBoundaryId: string | null;
40
+ invertLeft: boolean;
41
+ invertRight: boolean;
42
+ color: string;
43
+ opacity?: number | null;
44
+ smooth?: boolean | null;
45
+ size: string;
46
+ attributes: {
47
+ type: string;
48
+ subtype: string;
49
+ speed_limit?: string;
50
+ };
51
+ next: string[];
52
+ prev: string[];
53
+ osmId: string;
54
+ }
55
+ export interface VehicleProps {
56
+ w: number;
57
+ h: number;
58
+ color: string;
59
+ size: string;
60
+ opacity?: number | null;
61
+ attributes: {
62
+ type: 'vehicle';
63
+ subtype: string;
64
+ };
65
+ osmId: string;
66
+ templateId: string;
67
+ }
68
+ export interface PedestrianProps {
69
+ w: number;
70
+ h: number;
71
+ color: string;
72
+ size: string;
73
+ opacity?: number | null;
74
+ attributes: {
75
+ type: 'pedestrian';
76
+ subtype: string;
77
+ };
78
+ osmId: string;
79
+ templateId: string;
80
+ }
81
+ export interface RectangleProps {
82
+ w: number;
83
+ h: number;
84
+ color: string;
85
+ fill: string;
86
+ strokeWidth: number;
87
+ opacity?: number | null;
88
+ }
89
+ export interface EllipseProps {
90
+ w: number;
91
+ h: number;
92
+ color: string;
93
+ fill: string;
94
+ strokeWidth: number;
95
+ opacity?: number | null;
96
+ }
97
+ export interface ArrowProps {
98
+ w: number;
99
+ h: number;
100
+ color: string;
101
+ fill: string;
102
+ strokeWidth: number;
103
+ opacity?: number | null;
104
+ direction: string;
105
+ headPosition: number;
106
+ bodyThickness: number;
107
+ }
108
+ export interface TextProps {
109
+ w: number;
110
+ h: number;
111
+ text: string;
112
+ color: string;
113
+ fontSize: number;
114
+ font: string;
115
+ textAlign: 'left' | 'center' | 'right';
116
+ autoSize: boolean;
117
+ }
118
+ export interface PolygonProps {
119
+ pointIds: string[];
120
+ color: string;
121
+ strokeWidth: number;
122
+ fillOpacity?: number | null;
123
+ attributes: Record<string, unknown>;
124
+ osmId: string;
125
+ smooth?: boolean | null;
126
+ segments?: Record<string, {
127
+ color?: string;
128
+ strokeWidth?: number;
129
+ opacity?: number;
130
+ }> | null;
131
+ }
132
+ export interface TrafficLightProps {
133
+ w: number;
134
+ h: number;
135
+ color: string;
136
+ attributes: {
137
+ type: 'traffic_light';
138
+ subtype?: string;
139
+ };
140
+ osmId: string;
141
+ }
142
+ export interface CrosswalkProps {
143
+ pointIds: string[];
144
+ color: string;
145
+ stripeWidth?: number;
146
+ stripeGap?: number;
147
+ attributes: {
148
+ type: 'crosswalk';
149
+ subtype?: string;
150
+ };
151
+ osmId: string;
152
+ }
153
+ export interface FreehandProps {
154
+ points: Array<{
155
+ x: number;
156
+ y: number;
157
+ }>;
158
+ color: string;
159
+ strokeWidth: number;
160
+ opacity?: number | null;
161
+ isComplete: boolean;
162
+ }
163
+ export interface DrawtonomySnapshot {
164
+ version: string;
165
+ timestamp: string;
166
+ shapes: BaseShape[];
167
+ camera?: {
168
+ x: number;
169
+ y: number;
170
+ z: number;
171
+ };
172
+ }
173
+ export type ExtensionCapability = 'shapes:write' | 'shapes:read' | 'snapshot:read' | 'viewport:read' | 'selection:read' | 'ui:panel' | 'ui:notify';
174
+ export interface ExtensionManifest {
175
+ id: string;
176
+ name: string;
177
+ version: string;
178
+ description: string;
179
+ author: {
180
+ name: string;
181
+ url?: string;
182
+ };
183
+ entry: string;
184
+ icon?: string;
185
+ capabilities: ExtensionCapability[];
186
+ minHostVersion?: string;
187
+ }
188
+ export interface ShapeFilter {
189
+ types?: string[];
190
+ ids?: string[];
191
+ selectedOnly?: boolean;
192
+ }
193
+ export interface ShapeUpdate {
194
+ id: string;
195
+ props: Record<string, unknown>;
196
+ }
197
+ export interface InitPayload {
198
+ hostVersion: string;
199
+ grantedCapabilities: ExtensionCapability[];
200
+ viewport: {
201
+ width: number;
202
+ height: number;
203
+ };
204
+ }
205
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,4 @@
1
+ // Public SDK Type Definitions
2
+ // These types are intended for extension developers
3
+ export {};
4
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,oDAAoD"}
package/package.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "@drawtonomy/sdk",
3
+ "version": "0.1.0",
4
+ "description": "SDK for building Drawtonomy extensions",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.js"
12
+ }
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "README.md"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsc",
20
+ "prepublishOnly": "npm run build"
21
+ },
22
+ "keywords": [
23
+ "drawtonomy",
24
+ "extension",
25
+ "sdk",
26
+ "traffic",
27
+ "drawing"
28
+ ],
29
+ "license": "Apache-2.0",
30
+ "devDependencies": {
31
+ "typescript": "^5.7.0"
32
+ }
33
+ }