@dorsk/yubisashi 0.1.0 → 0.2.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.
@@ -0,0 +1,23 @@
1
+ /** Every message in both directions carries this marker; anything without it is ignored. */
2
+ export const YUBI = 1;
3
+ const PARENT_TYPES = new Set([
4
+ 'pick:start',
5
+ 'pick:stop',
6
+ 'pick:clear',
7
+ 'pins:set',
8
+ ]);
9
+ const CHILD_TYPES = new Set([
10
+ 'pick:state',
11
+ 'pick:hover',
12
+ 'pick:selected',
13
+ 'pick:cancel',
14
+ 'pin:open',
15
+ 'route',
16
+ ]);
17
+ const isMarked = (data) => typeof data === 'object' &&
18
+ data !== null &&
19
+ data.yubi === YUBI &&
20
+ typeof data.type === 'string';
21
+ export const isParentMessage = (data) => isMarked(data) && PARENT_TYPES.has(data.type);
22
+ export const isChildMessage = (data) => isMarked(data) && CHILD_TYPES.has(data.type);
23
+ //# sourceMappingURL=protocol.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/picker/protocol.ts"],"names":[],"mappings":"AAAA,4FAA4F;AAC5F,MAAM,CAAC,MAAM,IAAI,GAAG,CAAU,CAAC;AA0C/B,MAAM,YAAY,GAAwB,IAAI,GAAG,CAAC;IACjD,YAAY;IACZ,WAAW;IACX,YAAY;IACZ,UAAU;CACV,CAAC,CAAC;AACH,MAAM,WAAW,GAAwB,IAAI,GAAG,CAAC;IAChD,YAAY;IACZ,YAAY;IACZ,eAAe;IACf,aAAa;IACb,UAAU;IACV,OAAO;CACP,CAAC,CAAC;AAEH,MAAM,QAAQ,GAAG,CAAC,IAAa,EAA+C,EAAE,CAC/E,OAAO,IAAI,KAAK,QAAQ;IACxB,IAAI,KAAK,IAAI;IACZ,IAA2B,CAAC,IAAI,KAAK,IAAI;IAC1C,OAAQ,IAA2B,CAAC,IAAI,KAAK,QAAQ,CAAC;AAEvD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAa,EAAyB,EAAE,CACvE,QAAQ,CAAC,IAAI,CAAC,IAAI,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAE/C,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,IAAa,EAAwB,EAAE,CACrE,QAAQ,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC"}
@@ -0,0 +1,15 @@
1
+ import { type Plugin } from 'vite';
2
+ export type YubisashiOptions = {
3
+ /** Origin(s) allowed to frame the app; falls back to `YUBI_PARENT_ORIGIN` (comma-separated). */
4
+ parentOrigin?: string | string[];
5
+ };
6
+ export declare const VIRTUAL_ID = "virtual:yubisashi";
7
+ export declare function parentOrigins(option: string | string[] | undefined, env?: NodeJS.ProcessEnv): string[];
8
+ export declare function relaxCsp(value: string, origins: string[]): string;
9
+ export declare function injectScript(html: string): string;
10
+ /**
11
+ * Dev-only: lets a review panel at `parentOrigin` frame the app and injects the yubisashi picker
12
+ * into every HTML page. Inactive unless an origin is configured.
13
+ */
14
+ export declare function yubisashi(options?: YubisashiOptions): Plugin;
15
+ export default yubisashi;
@@ -0,0 +1,150 @@
1
+ import { fileURLToPath } from 'node:url';
2
+ import { searchForWorkspaceRoot } from 'vite';
3
+ export const VIRTUAL_ID = 'virtual:yubisashi';
4
+ const RESOLVED_ID = `\0${VIRTUAL_ID}`;
5
+ const SCRIPT_SRC = `/@id/__x00__${VIRTUAL_ID}`;
6
+ const PICKER_URL = new URL('../picker/index.js', import.meta.url);
7
+ const CSP_HEADERS = ['content-security-policy', 'content-security-policy-report-only'];
8
+ export function parentOrigins(option, env = process.env) {
9
+ const raw = option ?? env.YUBI_PARENT_ORIGIN ?? '';
10
+ return [raw]
11
+ .flat()
12
+ .flatMap((s) => s.split(','))
13
+ .map((s) => s.trim())
14
+ .filter(Boolean)
15
+ .map((s) => new URL(s).origin);
16
+ }
17
+ export function relaxCsp(value, origins) {
18
+ const directives = value
19
+ .split(';')
20
+ .map((d) => d.trim())
21
+ .filter(Boolean);
22
+ const kept = directives.filter((d) => !/^frame-ancestors\b/i.test(d));
23
+ return [...kept, `frame-ancestors ${origins.join(' ')}`].join('; ');
24
+ }
25
+ export function injectScript(html) {
26
+ const nonce = html.match(/<script[^>]*\snonce="([^"]+)"/i)?.[1];
27
+ const tag = `<script type="module"${nonce ? ` nonce="${nonce}"` : ''} src="${SCRIPT_SRC}"></script>`;
28
+ if (/<\/head>/i.test(html))
29
+ return html.replace(/<\/head>/i, `${tag}</head>`);
30
+ if (/<\/body>/i.test(html))
31
+ return html.replace(/<\/body>/i, `${tag}</body>`);
32
+ return html + tag;
33
+ }
34
+ function relaxHeaders(res, origins) {
35
+ const fix = (name, value) => {
36
+ const key = name.toLowerCase();
37
+ if (key === 'x-frame-options')
38
+ return null;
39
+ if (CSP_HEADERS.includes(key) && typeof value === 'string')
40
+ return relaxCsp(value, origins);
41
+ return value;
42
+ };
43
+ const setHeader = res.setHeader.bind(res);
44
+ res.setHeader = (name, value) => {
45
+ const fixed = fix(name, value);
46
+ return fixed === null ? res : setHeader(name, fixed);
47
+ };
48
+ const writeHead = res.writeHead.bind(res);
49
+ res.writeHead = ((status, ...rest) => {
50
+ const headers = rest.find((r) => r && typeof r === 'object' && !Array.isArray(r));
51
+ if (headers)
52
+ for (const [name, value] of Object.entries(headers)) {
53
+ const fixed = fix(name, value);
54
+ if (fixed === null)
55
+ delete headers[name];
56
+ else
57
+ headers[name] = fixed;
58
+ }
59
+ if (isHtml(res, headers)) {
60
+ res.removeHeader('content-length');
61
+ for (const name of Object.keys(headers ?? {}))
62
+ if (name.toLowerCase() === 'content-length')
63
+ delete headers?.[name];
64
+ }
65
+ return writeHead(status, ...rest);
66
+ });
67
+ }
68
+ const header = (res, name, extra) => String(Object.entries(extra ?? {}).find(([k]) => k.toLowerCase() === name)?.[1] ??
69
+ res.getHeader(name) ??
70
+ '');
71
+ const isHtml = (res, extra) => header(res, 'content-type', extra).includes('text/html') &&
72
+ !header(res, 'content-encoding', extra);
73
+ const toBuffer = (chunk) => Buffer.isBuffer(chunk)
74
+ ? chunk
75
+ : chunk instanceof Uint8Array
76
+ ? Buffer.from(chunk)
77
+ : Buffer.from(String(chunk));
78
+ function injectHtml(res) {
79
+ const chunks = [];
80
+ const write = res.write.bind(res);
81
+ const end = res.end.bind(res);
82
+ let buffering;
83
+ const decide = () => {
84
+ if (buffering === undefined)
85
+ buffering = isHtml(res);
86
+ return buffering;
87
+ };
88
+ res.write = ((chunk, ...rest) => {
89
+ if (!decide())
90
+ return write(chunk, ...rest);
91
+ if (chunk)
92
+ chunks.push(toBuffer(chunk));
93
+ return true;
94
+ });
95
+ res.end = ((chunk, ...rest) => {
96
+ const callback = rest.find((r) => typeof r === 'function');
97
+ if (!decide())
98
+ return end(chunk, ...rest);
99
+ if (chunk && typeof chunk !== 'function')
100
+ chunks.push(toBuffer(chunk));
101
+ const html = injectScript(Buffer.concat(chunks).toString('utf8'));
102
+ if (!res.headersSent)
103
+ res.setHeader('content-length', Buffer.byteLength(html));
104
+ return end(html, callback);
105
+ });
106
+ }
107
+ /**
108
+ * Dev-only: lets a review panel at `parentOrigin` frame the app and injects the yubisashi picker
109
+ * into every HTML page. Inactive unless an origin is configured.
110
+ */
111
+ export function yubisashi(options = {}) {
112
+ const origins = parentOrigins(options.parentOrigin);
113
+ const pickerFile = fileURLToPath(PICKER_URL);
114
+ return {
115
+ name: 'yubisashi',
116
+ apply: 'serve',
117
+ config: (user) => origins.length
118
+ ? {
119
+ server: {
120
+ fs: {
121
+ allow: [
122
+ ...(user.server?.fs?.allow ?? [
123
+ searchForWorkspaceRoot(user.root ?? process.cwd()),
124
+ ]),
125
+ fileURLToPath(new URL('.', PICKER_URL)),
126
+ ],
127
+ },
128
+ },
129
+ }
130
+ : undefined,
131
+ resolveId: (id) => (id === VIRTUAL_ID ? RESOLVED_ID : undefined),
132
+ load: (id) => id === RESOLVED_ID
133
+ ? `import { createPicker } from ${JSON.stringify(pickerFile)};
134
+ if (window.parent !== window) createPicker({ parentOrigin: ${JSON.stringify(origins)} });
135
+ `
136
+ : undefined,
137
+ configureServer(server) {
138
+ if (!origins.length)
139
+ return;
140
+ server.config.logger.info(`yubisashi: framing allowed from ${origins.join(', ')}`);
141
+ server.middlewares.use((_req, res, next) => {
142
+ relaxHeaders(res, origins);
143
+ injectHtml(res);
144
+ next();
145
+ });
146
+ },
147
+ };
148
+ }
149
+ export default yubisashi;
150
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/vite/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,30 +1,78 @@
1
1
  {
2
2
  "name": "@dorsk/yubisashi",
3
- "version": "0.1.0",
4
- "description": "Point at your running app, comment, and hand it to the coding agent working on it.",
3
+ "version": "0.2.0",
4
+ "description": "Point at elements of your running app from a review panel: an iframe picker and the Vite plugin that injects it in dev.",
5
5
  "type": "module",
6
6
  "license": "MIT",
7
7
  "author": "Dorsk <dorsk.dev@gmail.com>",
8
+ "homepage": "https://github.com/DorskFR/yubisashi",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "git+https://github.com/DorskFR/yubisashi.git"
12
+ },
13
+ "bugs": {
14
+ "url": "https://github.com/DorskFR/yubisashi/issues"
15
+ },
16
+ "keywords": [
17
+ "vite-plugin",
18
+ "svelte",
19
+ "svelte5",
20
+ "review",
21
+ "feedback",
22
+ "picker",
23
+ "iframe",
24
+ "postmessage",
25
+ "devtools",
26
+ "coding-agent"
27
+ ],
8
28
  "engines": {
9
29
  "node": ">=22.18"
10
30
  },
11
- "bin": {
12
- "yubi": "src/cli.ts"
13
- },
14
31
  "files": [
15
- "src",
16
- "shell",
17
- "skill"
32
+ "dist"
18
33
  ],
34
+ "sideEffects": false,
35
+ "exports": {
36
+ "./picker": {
37
+ "types": "./dist/picker/index.d.ts",
38
+ "import": "./dist/picker/index.js"
39
+ },
40
+ "./vite": {
41
+ "types": "./dist/vite/index.d.ts",
42
+ "import": "./dist/vite/index.js"
43
+ },
44
+ "./package.json": "./package.json"
45
+ },
46
+ "publishConfig": {
47
+ "access": "public",
48
+ "provenance": true
49
+ },
19
50
  "scripts": {
20
- "check": "tsc -p tsconfig.json && biome check .",
51
+ "build": "rm -rf dist && tsc -p tsconfig.build.json",
52
+ "check": "npm run build && tsc -p tsconfig.json",
53
+ "lint": "biome check .",
21
54
  "format": "biome check --write .",
22
- "test": "node --test test/*.test.ts"
55
+ "test": "npm run build && node --test test/*.test.ts",
56
+ "prepare": "lefthook install || true",
57
+ "prepublishOnly": "npm run build"
58
+ },
59
+ "peerDependencies": {
60
+ "vite": ">=5"
61
+ },
62
+ "peerDependenciesMeta": {
63
+ "vite": {
64
+ "optional": true
65
+ }
23
66
  },
24
67
  "devDependencies": {
25
- "@biomejs/biome": "^2.2.0",
68
+ "@biomejs/biome": "^2.5.12",
69
+ "@sveltejs/kit": "^2.70.3",
70
+ "@sveltejs/vite-plugin-svelte": "^7.3.1",
26
71
  "@types/node": "^22.18.0",
72
+ "lefthook": "^2.1.12",
27
73
  "playwright": "^1.55.0",
28
- "typescript": "^5.9.0"
74
+ "svelte": "^5.57.1",
75
+ "typescript": "^5.9.0",
76
+ "vite": "^8.3.1"
29
77
  }
30
78
  }