@noodleseed/one 0.89.1 → 0.91.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/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +3 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/auth-live-doctor.js +1 -1
- package/dist/commands/auth-live-doctor.js.map +1 -1
- package/dist/commands/billing-enforcement-activation-ops.js +1 -11
- package/dist/commands/billing-enforcement-activation-ops.js.map +1 -1
- package/dist/commands/billing-enforcement-ops.js +1 -11
- package/dist/commands/billing-enforcement-ops.js.map +1 -1
- package/dist/commands/billing-metering-ops.js +1 -11
- package/dist/commands/billing-metering-ops.js.map +1 -1
- package/dist/commands/billing-metering-validation-ops.js +1 -11
- package/dist/commands/billing-metering-validation-ops.js.map +1 -1
- package/dist/commands/billing-read-ops.js +1 -11
- package/dist/commands/billing-read-ops.js.map +1 -1
- package/dist/commands/billing-stripe-ops.js +1 -11
- package/dist/commands/billing-stripe-ops.js.map +1 -1
- package/dist/commands/catalog-data-local-authoring.d.ts.map +1 -1
- package/dist/commands/catalog-data-local-authoring.js +27 -0
- package/dist/commands/catalog-data-local-authoring.js.map +1 -1
- package/dist/commands/design.d.ts +7 -0
- package/dist/commands/design.d.ts.map +1 -0
- package/dist/commands/design.js +95 -0
- package/dist/commands/design.js.map +1 -0
- package/dist/commands/devtools.d.ts.map +1 -1
- package/dist/commands/devtools.js +5 -1
- package/dist/commands/devtools.js.map +1 -1
- package/dist/commands/org-admin.d.ts +6 -0
- package/dist/commands/org-admin.d.ts.map +1 -1
- package/dist/commands/org-admin.js +1 -29
- package/dist/commands/org-admin.js.map +1 -1
- package/dist/commands/org-domains.js +1 -22
- package/dist/commands/org-domains.js.map +1 -1
- package/dist/commands/org-member-args.d.ts +1 -1
- package/dist/commands/org-member-args.d.ts.map +1 -1
- package/dist/commands/org-member-args.js +1 -10
- package/dist/commands/org-member-args.js.map +1 -1
- package/dist/commands/org-openai-challenge.js +1 -22
- package/dist/commands/org-openai-challenge.js.map +1 -1
- package/dist/commands/platform-account-reset-args.d.ts.map +1 -1
- package/dist/commands/platform-account-reset-args.js +1 -6
- package/dist/commands/platform-account-reset-args.js.map +1 -1
- package/dist/commands/platform-account-reset-ops.js +1 -11
- package/dist/commands/platform-account-reset-ops.js.map +1 -1
- package/dist/commands/platform-auth-migration-args.d.ts +2 -0
- package/dist/commands/platform-auth-migration-args.d.ts.map +1 -1
- package/dist/commands/platform-auth-migration-args.js +2 -1
- package/dist/commands/platform-auth-migration-args.js.map +1 -1
- package/dist/commands/platform-auth-migration-ops.js +1 -11
- package/dist/commands/platform-auth-migration-ops.js.map +1 -1
- package/dist/commands/shared.d.ts +6 -0
- package/dist/commands/shared.d.ts.map +1 -1
- package/dist/commands/shared.js +34 -0
- package/dist/commands/shared.js.map +1 -1
- package/dist/deploy.d.ts +2 -0
- package/dist/deploy.d.ts.map +1 -1
- package/dist/deploy.js +4 -4
- package/dist/deploy.js.map +1 -1
- package/dist/dev.d.ts.map +1 -1
- package/dist/dev.js +1 -7
- package/dist/dev.js.map +1 -1
- package/dist/devtools-brand.d.ts +14 -0
- package/dist/devtools-brand.d.ts.map +1 -0
- package/dist/devtools-brand.js +98 -0
- package/dist/devtools-brand.js.map +1 -0
- package/dist/devtools-chat-anthropic.d.ts +3 -0
- package/dist/devtools-chat-anthropic.d.ts.map +1 -0
- package/dist/devtools-chat-anthropic.js +75 -0
- package/dist/devtools-chat-anthropic.js.map +1 -0
- package/dist/devtools-chat-gemini.d.ts +3 -0
- package/dist/devtools-chat-gemini.d.ts.map +1 -0
- package/dist/devtools-chat-gemini.js +82 -0
- package/dist/devtools-chat-gemini.js.map +1 -0
- package/dist/devtools-chat-types.d.ts +64 -0
- package/dist/devtools-chat-types.d.ts.map +1 -0
- package/dist/devtools-chat-types.js +64 -0
- package/dist/devtools-chat-types.js.map +1 -0
- package/dist/devtools-chat.d.ts +7 -39
- package/dist/devtools-chat.d.ts.map +1 -1
- package/dist/devtools-chat.js +33 -48
- package/dist/devtools-chat.js.map +1 -1
- package/dist/devtools-copy-styles.d.ts +3 -0
- package/dist/devtools-copy-styles.d.ts.map +1 -0
- package/dist/devtools-copy-styles.js +54 -0
- package/dist/devtools-copy-styles.js.map +1 -0
- package/dist/devtools-design-brief.d.ts +10 -0
- package/dist/devtools-design-brief.d.ts.map +1 -0
- package/dist/devtools-design-brief.js +121 -0
- package/dist/devtools-design-brief.js.map +1 -0
- package/dist/devtools-design-contract.d.ts +74 -0
- package/dist/devtools-design-contract.d.ts.map +1 -0
- package/dist/devtools-design-contract.js +306 -0
- package/dist/devtools-design-contract.js.map +1 -0
- package/dist/devtools-design-element.d.ts +6 -0
- package/dist/devtools-design-element.d.ts.map +1 -0
- package/dist/devtools-design-element.js +233 -0
- package/dist/devtools-design-element.js.map +1 -0
- package/dist/devtools-design-preview.d.ts +6 -0
- package/dist/devtools-design-preview.d.ts.map +1 -0
- package/dist/devtools-design-preview.js +438 -0
- package/dist/devtools-design-preview.js.map +1 -0
- package/dist/devtools-design-routes.d.ts +14 -0
- package/dist/devtools-design-routes.d.ts.map +1 -0
- package/dist/devtools-design-routes.js +197 -0
- package/dist/devtools-design-routes.js.map +1 -0
- package/dist/devtools-design-store.d.ts +16 -0
- package/dist/devtools-design-store.d.ts.map +1 -0
- package/dist/devtools-design-store.js +209 -0
- package/dist/devtools-design-store.js.map +1 -0
- package/dist/devtools-design-styles.d.ts +3 -0
- package/dist/devtools-design-styles.d.ts.map +1 -0
- package/dist/devtools-design-styles.js +509 -0
- package/dist/devtools-design-styles.js.map +1 -0
- package/dist/devtools-design.d.ts +3 -0
- package/dist/devtools-design.d.ts.map +1 -0
- package/dist/devtools-design.js +455 -0
- package/dist/devtools-design.js.map +1 -0
- package/dist/devtools-harness.d.ts +2 -2
- package/dist/devtools-harness.d.ts.map +1 -1
- package/dist/devtools-harness.js +138 -221
- package/dist/devtools-harness.js.map +1 -1
- package/dist/devtools-json.d.ts +10 -0
- package/dist/devtools-json.d.ts.map +1 -0
- package/dist/devtools-json.js +23 -0
- package/dist/devtools-json.js.map +1 -0
- package/dist/devtools-preview-control-styles.d.ts +3 -0
- package/dist/devtools-preview-control-styles.d.ts.map +1 -0
- package/dist/devtools-preview-control-styles.js +207 -0
- package/dist/devtools-preview-control-styles.js.map +1 -0
- package/dist/devtools-preview.d.ts +10 -3
- package/dist/devtools-preview.d.ts.map +1 -1
- package/dist/devtools-preview.js +192 -43
- package/dist/devtools-preview.js.map +1 -1
- package/dist/devtools-provider-logos.d.ts +5 -0
- package/dist/devtools-provider-logos.d.ts.map +1 -0
- package/dist/devtools-provider-logos.js +5 -0
- package/dist/devtools-provider-logos.js.map +1 -0
- package/dist/devtools-responsive-styles.d.ts +3 -0
- package/dist/devtools-responsive-styles.d.ts.map +1 -0
- package/dist/devtools-responsive-styles.js +90 -0
- package/dist/devtools-responsive-styles.js.map +1 -0
- package/dist/devtools-styles.d.ts +3 -0
- package/dist/devtools-styles.d.ts.map +1 -0
- package/dist/devtools-styles.js +694 -0
- package/dist/devtools-styles.js.map +1 -0
- package/dist/local-target.d.ts.map +1 -1
- package/dist/local-target.js +1 -6
- package/dist/local-target.js.map +1 -1
- package/dist/plugin-mode/build-readiness-server.d.ts +4 -10
- package/dist/plugin-mode/build-readiness-server.d.ts.map +1 -1
- package/dist/plugin-mode/build-readiness-server.js +68 -67
- package/dist/plugin-mode/build-readiness-server.js.map +1 -1
- package/dist/plugin-mode/plugin-command-runner.d.ts +41 -0
- package/dist/plugin-mode/plugin-command-runner.d.ts.map +1 -0
- package/dist/plugin-mode/plugin-command-runner.js +122 -0
- package/dist/plugin-mode/plugin-command-runner.js.map +1 -0
- package/dist/plugin-mode/plugin-operation-contract.d.ts +237 -0
- package/dist/plugin-mode/plugin-operation-contract.d.ts.map +1 -0
- package/dist/plugin-mode/plugin-operation-contract.js +164 -0
- package/dist/plugin-mode/plugin-operation-contract.js.map +1 -0
- package/dist/plugin-mode/plugin-operation-tools.d.ts +20 -0
- package/dist/plugin-mode/plugin-operation-tools.d.ts.map +1 -0
- package/dist/plugin-mode/plugin-operation-tools.js +289 -0
- package/dist/plugin-mode/plugin-operation-tools.js.map +1 -0
- package/dist/preview-session.d.ts +5 -0
- package/dist/preview-session.d.ts.map +1 -1
- package/dist/preview-session.js +23 -5
- package/dist/preview-session.js.map +1 -1
- package/dist/project.d.ts.map +1 -1
- package/dist/project.js +1 -7
- package/dist/project.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js +4 -0
- package/node_modules/@noodle-borg/agent-kit/dist/curated/command-groups.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/curated/hook-notes.js +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/curated/hook-notes.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js +5 -5
- package/node_modules/@noodle-borg/agent-kit/dist/generated/example-files.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js +1 -0
- package/node_modules/@noodle-borg/agent-kit/dist/generated/surface.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/plugin-bundle.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/plugin-bundle.js +16 -12
- package/node_modules/@noodle-borg/agent-kit/dist/plugin-bundle.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/plugin-marketplace-docs.js +9 -9
- package/node_modules/@noodle-borg/agent-kit/dist/skill-design-refs.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-design-refs.js +12 -0
- package/node_modules/@noodle-borg/agent-kit/dist/skill-design-refs.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-feedback-ref.js +4 -4
- package/node_modules/@noodle-borg/agent-kit/dist/skill-feedback-ref.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-router.d.ts.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/dist/skill-router.js +6 -3
- package/node_modules/@noodle-borg/agent-kit/dist/skill-router.js.map +1 -1
- package/node_modules/@noodle-borg/agent-kit/package.json +1 -1
- package/node_modules/@noodle-borg/auth/dist/verify.d.ts +3 -1
- package/node_modules/@noodle-borg/auth/dist/verify.d.ts.map +1 -1
- package/node_modules/@noodle-borg/auth/dist/verify.js +16 -4
- package/node_modules/@noodle-borg/auth/dist/verify.js.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/widget-ui-style.d.ts +0 -2
- package/node_modules/@noodle-borg/compiler/dist/widget-ui-style.d.ts.map +1 -1
- package/node_modules/@noodle-borg/compiler/dist/widget-ui-style.js +0 -76
- package/node_modules/@noodle-borg/compiler/dist/widget-ui-style.js.map +1 -1
- package/node_modules/@noodle-borg/connector-defs/dist/index.d.ts +1 -1
- package/node_modules/@noodle-borg/connector-defs/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/connector-defs/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/connector-http/dist/http-connector.d.ts +2 -8
- package/node_modules/@noodle-borg/connector-http/dist/http-connector.d.ts.map +1 -1
- package/node_modules/@noodle-borg/connector-http/dist/http-connector.js +8 -237
- package/node_modules/@noodle-borg/connector-http/dist/http-connector.js.map +1 -1
- package/node_modules/@noodle-borg/connector-http/dist/http-response.d.ts +26 -0
- package/node_modules/@noodle-borg/connector-http/dist/http-response.d.ts.map +1 -0
- package/node_modules/@noodle-borg/connector-http/dist/http-response.js +249 -0
- package/node_modules/@noodle-borg/connector-http/dist/http-response.js.map +1 -0
- package/node_modules/@noodle-borg/module-audit/dist/route.d.ts +0 -2
- package/node_modules/@noodle-borg/module-audit/dist/route.d.ts.map +1 -1
- package/node_modules/@noodle-borg/module-audit/dist/route.js +0 -4
- package/node_modules/@noodle-borg/module-audit/dist/route.js.map +1 -1
- package/node_modules/@noodle-borg/protocol/dist/input-validation.d.ts +0 -2
- package/node_modules/@noodle-borg/protocol/dist/input-validation.d.ts.map +1 -1
- package/node_modules/@noodle-borg/protocol/dist/input-validation.js +1 -5
- package/node_modules/@noodle-borg/protocol/dist/input-validation.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.d.ts +0 -2
- package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.js +0 -7
- package/node_modules/@noodle-borg/service/dist/auth/deploy-gate.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/credential-binding-index.d.ts +1 -3
- package/node_modules/@noodle-borg/service/dist/credential-binding-index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/credential-binding-index.js +1 -14
- package/node_modules/@noodle-borg/service/dist/credential-binding-index.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/customer-verifier.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/customer-verifier.js +8 -5
- package/node_modules/@noodle-borg/service/dist/customer-verifier.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/index.d.ts +5 -5
- package/node_modules/@noodle-borg/service/dist/index.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/index.js +1 -1
- package/node_modules/@noodle-borg/service/dist/index.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/mcp-public-routing.d.ts +0 -2
- package/node_modules/@noodle-borg/service/dist/mcp-public-routing.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/mcp-public-routing.js +0 -6
- package/node_modules/@noodle-borg/service/dist/mcp-public-routing.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/console-url.d.ts +2 -0
- package/node_modules/@noodle-borg/service/dist/oauth/console-url.d.ts.map +1 -0
- package/node_modules/@noodle-borg/service/dist/oauth/console-url.js +4 -0
- package/node_modules/@noodle-borg/service/dist/oauth/console-url.js.map +1 -0
- package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.js +2 -1
- package/node_modules/@noodle-borg/service/dist/oauth/service-bootstrap.js.map +1 -1
- package/node_modules/@noodle-borg/service/dist/registry-targets.d.ts +1 -3
- package/node_modules/@noodle-borg/service/dist/registry-targets.d.ts.map +1 -1
- package/node_modules/@noodle-borg/service/dist/registry-targets.js +0 -17
- package/node_modules/@noodle-borg/service/dist/registry-targets.js.map +1 -1
- package/node_modules/@noodle-borg/service/package.json +0 -1
- package/package.json +1 -1
- package/node_modules/@noodle-borg/compiler/dist/widget-tailwind-tokens.d.ts +0 -2
- package/node_modules/@noodle-borg/compiler/dist/widget-tailwind-tokens.d.ts.map +0 -1
- package/node_modules/@noodle-borg/compiler/dist/widget-tailwind-tokens.js +0 -22
- package/node_modules/@noodle-borg/compiler/dist/widget-tailwind-tokens.js.map +0 -1
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
import { DESIGN_STYLE_PROPERTIES } from './devtools-design-contract.js';
|
|
2
|
+
/**
|
|
3
|
+
* Browser state machine for local Design mode. It owns selection interception, reversible annotation
|
|
4
|
+
* history, preview-only CSS, debounced persistence, and ready-brief finalization.
|
|
5
|
+
*/
|
|
6
|
+
export const DEVTOOLS_DESIGN_PREVIEW_CLIENT_JS = `
|
|
7
|
+
(function(){
|
|
8
|
+
var STYLE_PROPERTIES=${JSON.stringify(DESIGN_STYLE_PROPERTIES)};
|
|
9
|
+
var config=null;
|
|
10
|
+
var data={
|
|
11
|
+
active:false,
|
|
12
|
+
selecting:false,
|
|
13
|
+
session:null,
|
|
14
|
+
selected:null,
|
|
15
|
+
hovered:null,
|
|
16
|
+
history:[],
|
|
17
|
+
future:[],
|
|
18
|
+
dirty:false,
|
|
19
|
+
unresolved:0
|
|
20
|
+
};
|
|
21
|
+
data.selectionId=0;
|
|
22
|
+
var saveTimer=null;
|
|
23
|
+
var overlay=null;
|
|
24
|
+
var styleElement=null;
|
|
25
|
+
var draftStyleElement=null;
|
|
26
|
+
var wiredDocument=null;
|
|
27
|
+
|
|
28
|
+
function snapshot(){
|
|
29
|
+
return {
|
|
30
|
+
active:data.active,
|
|
31
|
+
selecting:data.selecting,
|
|
32
|
+
selectionId:data.selectionId,
|
|
33
|
+
session:data.session,
|
|
34
|
+
selected:data.selected,
|
|
35
|
+
hovered:data.hovered,
|
|
36
|
+
historyLength:data.history.length,
|
|
37
|
+
futureLength:data.future.length,
|
|
38
|
+
dirty:data.dirty,
|
|
39
|
+
unresolved:data.unresolved
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
function changed(){
|
|
43
|
+
if(config&&typeof config.onChange==="function") config.onChange(snapshot());
|
|
44
|
+
}
|
|
45
|
+
function status(message,isError){
|
|
46
|
+
if(config&&typeof config.onStatus==="function") config.onStatus(message,Boolean(isError));
|
|
47
|
+
}
|
|
48
|
+
function frameDocument(){
|
|
49
|
+
try{return config&&config.frame&&config.frame.contentDocument;}catch(error){return null;}
|
|
50
|
+
}
|
|
51
|
+
function context(){
|
|
52
|
+
return config&&typeof config.getContext==="function"?config.getContext():null;
|
|
53
|
+
}
|
|
54
|
+
function query(){
|
|
55
|
+
var current=context()||{};
|
|
56
|
+
var params=new URLSearchParams();
|
|
57
|
+
params.set("toolName",current.toolName||"widget");
|
|
58
|
+
if(current.resourceUri) params.set("resourceUri",current.resourceUri);
|
|
59
|
+
params.set("width",String(current.width||820));
|
|
60
|
+
params.set("height",String(current.height||640));
|
|
61
|
+
params.set("device",current.device==="mobile"?"mobile":"desktop");
|
|
62
|
+
params.set("theme",current.theme==="dark"?"dark":"light");
|
|
63
|
+
return params.toString();
|
|
64
|
+
}
|
|
65
|
+
function requestJson(url,options){
|
|
66
|
+
return fetch(url,options).then(function(response){
|
|
67
|
+
return response.json().then(function(body){
|
|
68
|
+
if(!response.ok||!body||body.ok===false){
|
|
69
|
+
var message=body&&body.error&&body.error.message?body.error.message:"Design request failed.";
|
|
70
|
+
var error=new Error(message); error.status=response.status; throw error;
|
|
71
|
+
}
|
|
72
|
+
return body;
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
function ensureOverlay(doc){
|
|
77
|
+
if(overlay&&overlay.ownerDocument===doc) return overlay;
|
|
78
|
+
overlay=doc.createElement("div");
|
|
79
|
+
overlay.id="noodle-design-overlay";
|
|
80
|
+
overlay.setAttribute("aria-hidden","true");
|
|
81
|
+
overlay.style.cssText="position:fixed;top:0;left:0;display:none;z-index:2147483646;pointer-events:none;overflow:visible;border:2px solid #f97316;border-radius:3px;background:rgba(249,115,22,.12);box-shadow:0 0 0 1px rgba(255,255,255,.3),0 0 22px rgba(249,115,22,.2);transition:transform 100ms cubic-bezier(.23,1,.32,1),width 100ms cubic-bezier(.23,1,.32,1),height 100ms cubic-bezier(.23,1,.32,1);";
|
|
82
|
+
overlay.innerHTML='<span data-design-overlay-dot style="position:absolute;left:50%;top:-7px;width:12px;height:12px;transform:translateX(-50%);border-radius:999px;background:#f97316;box-shadow:0 0 0 2px #fff"></span><span data-design-overlay-label style="position:absolute;left:-2px;min-width:200px;max-width:300px;padding:7px 9px;border-radius:7px;background:#29292c;color:#fafafa;box-shadow:0 8px 28px rgba(0,0,0,.38);font:600 11px/1.4 Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif;letter-spacing:0;white-space:nowrap;text-align:left"></span>';
|
|
83
|
+
(doc.body||doc.documentElement).appendChild(overlay);
|
|
84
|
+
return overlay;
|
|
85
|
+
}
|
|
86
|
+
function paintOverlay(element,state){
|
|
87
|
+
var doc=frameDocument();
|
|
88
|
+
if(!doc||!element){if(overlay) overlay.style.display="none";return;}
|
|
89
|
+
var box=element.getBoundingClientRect();
|
|
90
|
+
var layer=ensureOverlay(doc);
|
|
91
|
+
var view=doc.defaultView;
|
|
92
|
+
var computed=view&&view.getComputedStyle?view.getComputedStyle(element):null;
|
|
93
|
+
var tag=String(element.tagName||"element").toLowerCase();
|
|
94
|
+
var width=Math.max(0,Math.round(box.width));
|
|
95
|
+
var height=Math.max(0,Math.round(box.height));
|
|
96
|
+
var color=computed&&computed.color?computed.color:"unknown";
|
|
97
|
+
var fontSize=computed&&computed.fontSize?computed.fontSize:"unknown";
|
|
98
|
+
var fontFamily=computed&&computed.fontFamily?computed.fontFamily.split(",")[0].replace(/[\\"']/g,"").trim():"system";
|
|
99
|
+
var label=layer.querySelector("[data-design-overlay-label]");
|
|
100
|
+
if(label){
|
|
101
|
+
label.textContent=tag+" "+width+"×"+height+"\\ncolor "+color+" font "+fontSize+" "+fontFamily.slice(0,28);
|
|
102
|
+
label.style.top=box.top>72?"-58px":height+8+"px";
|
|
103
|
+
label.style.whiteSpace="pre";
|
|
104
|
+
}
|
|
105
|
+
layer.dataset.state=state==="selected"?"selected":"hover";
|
|
106
|
+
layer.style.background=state==="selected"?"rgba(249,115,22,.18)":"rgba(249,115,22,.1)";
|
|
107
|
+
layer.style.display="block";
|
|
108
|
+
layer.style.transform="translate("+Math.round(box.left)+"px,"+Math.round(box.top)+"px)";
|
|
109
|
+
layer.style.width=width+"px";
|
|
110
|
+
layer.style.height=height+"px";
|
|
111
|
+
}
|
|
112
|
+
function validValue(doc,property,value){
|
|
113
|
+
if(STYLE_PROPERTIES.indexOf(property)<0) return false;
|
|
114
|
+
if(typeof value!=="string"||!value.trim()) return false;
|
|
115
|
+
var probe=doc.createElement("div").style;
|
|
116
|
+
probe.setProperty(property,value);
|
|
117
|
+
return Boolean(probe.getPropertyValue(property));
|
|
118
|
+
}
|
|
119
|
+
function clearTargets(doc){
|
|
120
|
+
var targets=doc.querySelectorAll("[data-noodle-design-target]");
|
|
121
|
+
for(var i=0;i<targets.length;i++) targets[i].removeAttribute("data-noodle-design-target");
|
|
122
|
+
var draftTargets=doc.querySelectorAll("[data-noodle-design-draft]");
|
|
123
|
+
for(var d=0;d<draftTargets.length;d++) draftTargets[d].removeAttribute("data-noodle-design-draft");
|
|
124
|
+
var existing=doc.getElementById("noodle-design-preview-styles");
|
|
125
|
+
if(existing) existing.remove();
|
|
126
|
+
var existingDraft=doc.getElementById("noodle-design-draft-styles");
|
|
127
|
+
if(existingDraft) existingDraft.remove();
|
|
128
|
+
styleElement=null;
|
|
129
|
+
draftStyleElement=null;
|
|
130
|
+
}
|
|
131
|
+
function clearDraftPreview(){
|
|
132
|
+
var doc=frameDocument();
|
|
133
|
+
if(!doc) return;
|
|
134
|
+
var targets=doc.querySelectorAll("[data-noodle-design-draft]");
|
|
135
|
+
for(var i=0;i<targets.length;i++) targets[i].removeAttribute("data-noodle-design-draft");
|
|
136
|
+
var existing=doc.getElementById("noodle-design-draft-styles");
|
|
137
|
+
if(existing) existing.remove();
|
|
138
|
+
draftStyleElement=null;
|
|
139
|
+
}
|
|
140
|
+
function previewChanges(changes){
|
|
141
|
+
var doc=frameDocument();
|
|
142
|
+
clearDraftPreview();
|
|
143
|
+
if(!doc||!data.selected||!data.selected.element||!Array.isArray(changes)) return;
|
|
144
|
+
var declarations=[];
|
|
145
|
+
for(var i=0;i<changes.length;i++){
|
|
146
|
+
var change=changes[i];
|
|
147
|
+
if(change&&validValue(doc,change.property,change.to)){
|
|
148
|
+
declarations.push(change.property+":"+change.to+"!important");
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
if(!declarations.length) return;
|
|
152
|
+
data.selected.element.setAttribute("data-noodle-design-draft","true");
|
|
153
|
+
draftStyleElement=doc.createElement("style");
|
|
154
|
+
draftStyleElement.id="noodle-design-draft-styles";
|
|
155
|
+
draftStyleElement.textContent='[data-noodle-design-draft="true"]{'+declarations.join(";")+'}';
|
|
156
|
+
doc.head.appendChild(draftStyleElement);
|
|
157
|
+
}
|
|
158
|
+
function applyAnnotations(){
|
|
159
|
+
var doc=frameDocument();
|
|
160
|
+
if(!doc||!window.NoodleDesignElement||!data.session) return;
|
|
161
|
+
clearTargets(doc);
|
|
162
|
+
var rules=[];
|
|
163
|
+
var unresolved=0;
|
|
164
|
+
var annotations=data.session.annotations||[];
|
|
165
|
+
for(var i=0;i<annotations.length;i++){
|
|
166
|
+
var annotation=annotations[i];
|
|
167
|
+
var resolution=window.NoodleDesignElement.resolve(doc,annotation.target);
|
|
168
|
+
if(!resolution.element){unresolved++;continue;}
|
|
169
|
+
var targetId="annotation-"+i;
|
|
170
|
+
resolution.element.setAttribute("data-noodle-design-target",targetId);
|
|
171
|
+
var declarations=[];
|
|
172
|
+
for(var j=0;j<annotation.changes.length;j++){
|
|
173
|
+
var change=annotation.changes[j];
|
|
174
|
+
if(validValue(doc,change.property,change.to)){
|
|
175
|
+
declarations.push(change.property+":"+change.to+"!important");
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
if(declarations.length){
|
|
179
|
+
rules.push('[data-noodle-design-target="'+targetId+'"]{'+declarations.join(";")+'}');
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
styleElement=doc.createElement("style");
|
|
183
|
+
styleElement.id="noodle-design-preview-styles";
|
|
184
|
+
styleElement.textContent=rules.join("\\n");
|
|
185
|
+
doc.head.appendChild(styleElement);
|
|
186
|
+
data.unresolved=unresolved;
|
|
187
|
+
}
|
|
188
|
+
function selectableElement(element){
|
|
189
|
+
if(!element||!element.closest) return element;
|
|
190
|
+
var interactive=element.closest("button,a[href],input,textarea,select,[role=button],[role=link],[role=tab],[role=menuitem]");
|
|
191
|
+
if(interactive) return interactive;
|
|
192
|
+
var inlineTags={span:true,strong:true,em:true,small:true,b:true,i:true,u:true,svg:true,path:true,g:true,use:true};
|
|
193
|
+
var current=element;
|
|
194
|
+
var body=wiredDocument&&wiredDocument.body;
|
|
195
|
+
while(current&¤t.parentElement&¤t.parentElement!==body&&inlineTags[String(current.tagName||"").toLowerCase()]){
|
|
196
|
+
current=current.parentElement;
|
|
197
|
+
}
|
|
198
|
+
return current||element;
|
|
199
|
+
}
|
|
200
|
+
function select(element){
|
|
201
|
+
element=selectableElement(element);
|
|
202
|
+
if(!element||!window.NoodleDesignElement) return null;
|
|
203
|
+
clearDraftPreview();
|
|
204
|
+
data.selected={
|
|
205
|
+
element:element,
|
|
206
|
+
target:window.NoodleDesignElement.capture(element)
|
|
207
|
+
};
|
|
208
|
+
data.selectionId+=1;
|
|
209
|
+
paintOverlay(element,"selected");
|
|
210
|
+
changed();
|
|
211
|
+
return data.selected.target;
|
|
212
|
+
}
|
|
213
|
+
function pointerOver(event){
|
|
214
|
+
if(!data.active||!data.selecting||!event.target||event.target===overlay) return;
|
|
215
|
+
var element=selectableElement(event.target);
|
|
216
|
+
if(data.hovered===element) return;
|
|
217
|
+
data.hovered=element;
|
|
218
|
+
paintOverlay(element,"hover");
|
|
219
|
+
}
|
|
220
|
+
function pointerOut(event){
|
|
221
|
+
if(!data.active||!data.selecting||event.relatedTarget) return;
|
|
222
|
+
data.hovered=null;
|
|
223
|
+
paintOverlay(data.selected&&data.selected.element,"selected");
|
|
224
|
+
}
|
|
225
|
+
function repaintOverlay(){
|
|
226
|
+
var element=data.hovered||(data.selected&&data.selected.element);
|
|
227
|
+
paintOverlay(element,data.hovered?"hover":"selected");
|
|
228
|
+
}
|
|
229
|
+
function click(event){
|
|
230
|
+
if(!data.active||!data.selecting||!event.target||event.target===overlay) return;
|
|
231
|
+
event.preventDefault();
|
|
232
|
+
event.stopPropagation();
|
|
233
|
+
if(event.stopImmediatePropagation) event.stopImmediatePropagation();
|
|
234
|
+
select(event.target);
|
|
235
|
+
}
|
|
236
|
+
function keydown(event){
|
|
237
|
+
if(!data.active||!data.selecting) return;
|
|
238
|
+
if(event.key==="Escape"){
|
|
239
|
+
clearDraftPreview(); data.selected=null; data.hovered=null; paintOverlay(null); changed(); return;
|
|
240
|
+
}
|
|
241
|
+
if(event.key==="Enter"&&event.target&&event.target!==wiredDocument.body){
|
|
242
|
+
event.preventDefault(); event.stopPropagation(); select(event.target);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
function wire(){
|
|
246
|
+
var doc=frameDocument();
|
|
247
|
+
if(!doc||wiredDocument===doc) return;
|
|
248
|
+
unwire();
|
|
249
|
+
wiredDocument=doc;
|
|
250
|
+
doc.addEventListener("pointerover",pointerOver,true);
|
|
251
|
+
doc.addEventListener("mousemove",pointerOver,true);
|
|
252
|
+
doc.addEventListener("pointerout",pointerOut,true);
|
|
253
|
+
doc.addEventListener("click",click,true);
|
|
254
|
+
doc.addEventListener("keydown",keydown,true);
|
|
255
|
+
if(doc.defaultView){
|
|
256
|
+
doc.defaultView.addEventListener("resize",repaintOverlay);
|
|
257
|
+
doc.defaultView.addEventListener("scroll",repaintOverlay,true);
|
|
258
|
+
}
|
|
259
|
+
ensureOverlay(doc);
|
|
260
|
+
updateCursor();
|
|
261
|
+
}
|
|
262
|
+
function updateCursor(){
|
|
263
|
+
if(!wiredDocument) return;
|
|
264
|
+
wiredDocument.documentElement.style.cursor=data.selecting
|
|
265
|
+
? 'url("data:image/svg+xml,%3Csvg xmlns=%22http://www.w3.org/2000/svg%22 width=%2224%22 height=%2224%22 viewBox=%220 0 24 24%22%3E%3Cpath d=%22M4 2.8v15.6l4.2-4.1 2.9 6.2 3.2-1.5-2.8-6.1h5.8L4 2.8Z%22 fill=%22%23f97316%22 stroke=%22%23fff%22 stroke-width=%221.2%22 stroke-linejoin=%22round%22/%3E%3C/svg%3E") 4 3, pointer'
|
|
266
|
+
:"";
|
|
267
|
+
}
|
|
268
|
+
function setSelecting(enabled){
|
|
269
|
+
data.selecting=Boolean(enabled);
|
|
270
|
+
if(!data.selecting){
|
|
271
|
+
clearDraftPreview();
|
|
272
|
+
data.selected=null;
|
|
273
|
+
data.hovered=null;
|
|
274
|
+
paintOverlay(null);
|
|
275
|
+
}
|
|
276
|
+
updateCursor();
|
|
277
|
+
status(data.selecting?"Select an element in the widget.":"Annotations are off.",false);
|
|
278
|
+
changed();
|
|
279
|
+
}
|
|
280
|
+
function unwire(){
|
|
281
|
+
if(!wiredDocument) return;
|
|
282
|
+
wiredDocument.removeEventListener("pointerover",pointerOver,true);
|
|
283
|
+
wiredDocument.removeEventListener("mousemove",pointerOver,true);
|
|
284
|
+
wiredDocument.removeEventListener("pointerout",pointerOut,true);
|
|
285
|
+
wiredDocument.removeEventListener("click",click,true);
|
|
286
|
+
wiredDocument.removeEventListener("keydown",keydown,true);
|
|
287
|
+
if(wiredDocument.defaultView){
|
|
288
|
+
wiredDocument.defaultView.removeEventListener("resize",repaintOverlay);
|
|
289
|
+
wiredDocument.defaultView.removeEventListener("scroll",repaintOverlay,true);
|
|
290
|
+
}
|
|
291
|
+
wiredDocument.documentElement.style.cursor="";
|
|
292
|
+
if(overlay) overlay.remove();
|
|
293
|
+
overlay=null;
|
|
294
|
+
wiredDocument=null;
|
|
295
|
+
}
|
|
296
|
+
function nextUpdatedAt(previous){
|
|
297
|
+
var now=new Date();
|
|
298
|
+
if(previous&&now.toISOString()<=previous) now=new Date(Date.parse(previous)+1);
|
|
299
|
+
return now.toISOString();
|
|
300
|
+
}
|
|
301
|
+
function persist(){
|
|
302
|
+
if(saveTimer){clearTimeout(saveTimer);saveTimer=null;}
|
|
303
|
+
if(!data.session||!data.dirty) return Promise.resolve(data.session);
|
|
304
|
+
var previous=data.session.updatedAt;
|
|
305
|
+
var pending=Object.assign({},data.session,{updatedAt:nextUpdatedAt(previous)});
|
|
306
|
+
data.session=pending;
|
|
307
|
+
return requestJson("/design/session",{
|
|
308
|
+
method:"PUT",
|
|
309
|
+
headers:{"content-type":"application/json","if-unmodified-since":previous},
|
|
310
|
+
body:JSON.stringify(pending)
|
|
311
|
+
}).then(function(body){
|
|
312
|
+
data.session=body.session; data.dirty=false; status("Design draft saved.",false); changed();
|
|
313
|
+
return data.session;
|
|
314
|
+
}).catch(function(error){
|
|
315
|
+
data.session=Object.assign({},data.session,{updatedAt:previous});
|
|
316
|
+
data.dirty=true; status(error.message||"Could not save the design draft.",true); changed(); throw error;
|
|
317
|
+
});
|
|
318
|
+
}
|
|
319
|
+
function schedulePersist(){
|
|
320
|
+
if(saveTimer) clearTimeout(saveTimer);
|
|
321
|
+
saveTimer=setTimeout(function(){persist().catch(function(){});},250);
|
|
322
|
+
}
|
|
323
|
+
function pushHistory(){
|
|
324
|
+
if(!data.session) return;
|
|
325
|
+
data.history.push(JSON.stringify(data.session.annotations||[]));
|
|
326
|
+
if(data.history.length>50) data.history.shift();
|
|
327
|
+
data.future=[];
|
|
328
|
+
}
|
|
329
|
+
function replaceAnnotations(annotations){
|
|
330
|
+
if(!data.session) return;
|
|
331
|
+
data.session=Object.assign({},data.session,{annotations:annotations});
|
|
332
|
+
data.dirty=true;
|
|
333
|
+
applyAnnotations();
|
|
334
|
+
schedulePersist();
|
|
335
|
+
changed();
|
|
336
|
+
}
|
|
337
|
+
function saveAnnotation(annotation){
|
|
338
|
+
if(!data.session||!annotation) return;
|
|
339
|
+
clearDraftPreview();
|
|
340
|
+
pushHistory();
|
|
341
|
+
var annotations=(data.session.annotations||[]).slice();
|
|
342
|
+
var index=annotations.findIndex(function(item){return item.id===annotation.id;});
|
|
343
|
+
if(index>=0) annotations[index]=annotation; else annotations.push(annotation);
|
|
344
|
+
replaceAnnotations(annotations);
|
|
345
|
+
data.selected=null;
|
|
346
|
+
data.hovered=null;
|
|
347
|
+
paintOverlay(null);
|
|
348
|
+
changed();
|
|
349
|
+
status("Annotation saved.",false);
|
|
350
|
+
}
|
|
351
|
+
function removeAnnotation(id){
|
|
352
|
+
if(!data.session) return;
|
|
353
|
+
pushHistory();
|
|
354
|
+
replaceAnnotations((data.session.annotations||[]).filter(function(item){return item.id!==id;}));
|
|
355
|
+
status("Annotation removed.",false);
|
|
356
|
+
}
|
|
357
|
+
function undo(){
|
|
358
|
+
if(!data.session||!data.history.length) return;
|
|
359
|
+
data.future.push(JSON.stringify(data.session.annotations||[]));
|
|
360
|
+
replaceAnnotations(JSON.parse(data.history.pop()));
|
|
361
|
+
status("Undid the last design change.",false);
|
|
362
|
+
}
|
|
363
|
+
function redo(){
|
|
364
|
+
if(!data.session||!data.future.length) return;
|
|
365
|
+
data.history.push(JSON.stringify(data.session.annotations||[]));
|
|
366
|
+
replaceAnnotations(JSON.parse(data.future.pop()));
|
|
367
|
+
status("Restored the design change.",false);
|
|
368
|
+
}
|
|
369
|
+
function rehydrate(){
|
|
370
|
+
if(!data.active) return Promise.resolve();
|
|
371
|
+
wire();
|
|
372
|
+
applyAnnotations();
|
|
373
|
+
if(data.selected&&data.selected.target){
|
|
374
|
+
var doc=frameDocument();
|
|
375
|
+
var resolved=doc&&window.NoodleDesignElement.resolve(doc,data.selected.target);
|
|
376
|
+
data.selected=resolved&&resolved.element?{element:resolved.element,target:data.selected.target}:null;
|
|
377
|
+
paintOverlay(data.selected&&data.selected.element,"selected");
|
|
378
|
+
}
|
|
379
|
+
changed();
|
|
380
|
+
return Promise.resolve();
|
|
381
|
+
}
|
|
382
|
+
function enter(){
|
|
383
|
+
data.active=true;
|
|
384
|
+
data.selecting=false;
|
|
385
|
+
var current=context();
|
|
386
|
+
if(!current||!current.toolName){
|
|
387
|
+
data.session=null; status("Open a widget in Preview, then return to Design.",true); changed();
|
|
388
|
+
return Promise.resolve(null);
|
|
389
|
+
}
|
|
390
|
+
return requestJson("/design/session?"+query()).then(function(body){
|
|
391
|
+
data.session=body.session;
|
|
392
|
+
data.dirty=false;
|
|
393
|
+
wire();
|
|
394
|
+
applyAnnotations();
|
|
395
|
+
status("Turn on annotations when you are ready to select an element.",false);
|
|
396
|
+
changed();
|
|
397
|
+
return data.session;
|
|
398
|
+
}).catch(function(error){
|
|
399
|
+
status(error.message||"Could not open Design.",true); changed(); throw error;
|
|
400
|
+
});
|
|
401
|
+
}
|
|
402
|
+
function leave(){
|
|
403
|
+
return persist().catch(function(){}).then(function(){
|
|
404
|
+
data.active=false; data.selected=null; data.hovered=null;
|
|
405
|
+
data.selecting=false;
|
|
406
|
+
var doc=frameDocument(); if(doc) clearTargets(doc);
|
|
407
|
+
unwire(); changed();
|
|
408
|
+
});
|
|
409
|
+
}
|
|
410
|
+
function finalize(){
|
|
411
|
+
return persist().then(function(){
|
|
412
|
+
if(!data.session) throw new Error("Open a widget before sending design feedback.");
|
|
413
|
+
return requestJson("/design/finalize",{
|
|
414
|
+
method:"POST",
|
|
415
|
+
headers:{"content-type":"application/json"},
|
|
416
|
+
body:JSON.stringify({expectedUpdatedAt:data.session.updatedAt})
|
|
417
|
+
});
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
function configure(next){config=next;}
|
|
421
|
+
window.NoodleDesign={
|
|
422
|
+
configure:configure,
|
|
423
|
+
enter:enter,
|
|
424
|
+
leave:leave,
|
|
425
|
+
select:select,
|
|
426
|
+
setSelecting:setSelecting,
|
|
427
|
+
previewChanges:previewChanges,
|
|
428
|
+
saveAnnotation:saveAnnotation,
|
|
429
|
+
removeAnnotation:removeAnnotation,
|
|
430
|
+
undo:undo,
|
|
431
|
+
redo:redo,
|
|
432
|
+
rehydrate:rehydrate,
|
|
433
|
+
persist:persist,
|
|
434
|
+
finalize:finalize,
|
|
435
|
+
state:snapshot
|
|
436
|
+
};
|
|
437
|
+
})();`;
|
|
438
|
+
//# sourceMappingURL=devtools-design-preview.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devtools-design-preview.js","sourceRoot":"","sources":["../src/devtools-design-preview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AAExE;;;GAGG;AACH,MAAM,CAAC,MAAM,iCAAiC,GAAG;;yBAExB,IAAI,CAAC,SAAS,CAAC,uBAAuB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA6a1D,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { IncomingMessage, ServerResponse } from 'node:http';
|
|
2
|
+
import { type DesignSessionV1 } from './devtools-design-contract.js';
|
|
3
|
+
import { type DesignStore } from './devtools-design-store.js';
|
|
4
|
+
export interface DesignRouteContext {
|
|
5
|
+
readonly projectRoot: string;
|
|
6
|
+
readonly entrypoint: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function readOrCreateDesignDraft(store: DesignStore, url: URL, context: DesignRouteContext): DesignSessionV1;
|
|
9
|
+
/**
|
|
10
|
+
* Handle loopback-only Design requests. The trusted filesystem context comes from the CLI process, never
|
|
11
|
+
* from the browser request.
|
|
12
|
+
*/
|
|
13
|
+
export declare function handleDesignRoute(req: IncomingMessage, res: ServerResponse, url: URL, context: DesignRouteContext | undefined): boolean;
|
|
14
|
+
//# sourceMappingURL=devtools-design-routes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devtools-design-routes.d.ts","sourceRoot":"","sources":["../src/devtools-design-routes.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEjE,OAAO,EAEL,KAAK,eAAe,EAErB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAEL,KAAK,WAAW,EAGjB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AA4DD,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,WAAW,EAClB,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,kBAAkB,GAC1B,eAAe,CAajB;AA8CD;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,GAAG,EAAE,eAAe,EACpB,GAAG,EAAE,cAAc,EACnB,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,kBAAkB,GAAG,SAAS,GACtC,OAAO,CAgFT"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { randomUUID } from 'node:crypto';
|
|
2
|
+
import { DESIGN_AGENT_INSTRUCTION } from './devtools-design-brief.js';
|
|
3
|
+
import { DESIGN_MAX_BODY_BYTES, validateDesignSession, } from './devtools-design-contract.js';
|
|
4
|
+
import { createDesignStore, DesignStoreConflictError, DesignStoreCorruptError, } from './devtools-design-store.js';
|
|
5
|
+
const DESIGN_HEADERS = {
|
|
6
|
+
'content-type': 'application/json; charset=utf-8',
|
|
7
|
+
'cache-control': 'no-store',
|
|
8
|
+
'x-content-type-options': 'nosniff',
|
|
9
|
+
'cross-origin-resource-policy': 'same-origin',
|
|
10
|
+
};
|
|
11
|
+
function reply(res, status, value) {
|
|
12
|
+
res.writeHead(status, DESIGN_HEADERS);
|
|
13
|
+
res.end(JSON.stringify(value));
|
|
14
|
+
}
|
|
15
|
+
function error(res, status, code, message) {
|
|
16
|
+
reply(res, status, { ok: false, error: { code, message } });
|
|
17
|
+
}
|
|
18
|
+
function boundedInteger(raw, fallback, minimum, maximum) {
|
|
19
|
+
const value = Number(raw);
|
|
20
|
+
return Number.isInteger(value) && value >= minimum && value <= maximum ? value : fallback;
|
|
21
|
+
}
|
|
22
|
+
function safeText(raw, fallback, maximum) {
|
|
23
|
+
if (raw === null)
|
|
24
|
+
return fallback;
|
|
25
|
+
const normalized = raw.replace(/\s+/g, ' ').trim();
|
|
26
|
+
return normalized.length > 0 ? normalized.slice(0, maximum) : fallback;
|
|
27
|
+
}
|
|
28
|
+
function newDraft(url, context) {
|
|
29
|
+
const now = new Date().toISOString();
|
|
30
|
+
const device = url.searchParams.get('device') === 'mobile' ? 'mobile' : 'desktop';
|
|
31
|
+
const theme = url.searchParams.get('theme') === 'dark' ? 'dark' : 'light';
|
|
32
|
+
const resourceUri = safeText(url.searchParams.get('resourceUri'), '', 500);
|
|
33
|
+
return validateDesignSession({
|
|
34
|
+
version: 1,
|
|
35
|
+
id: randomUUID(),
|
|
36
|
+
status: 'draft',
|
|
37
|
+
project: {
|
|
38
|
+
entrypoint: context.entrypoint,
|
|
39
|
+
toolName: safeText(url.searchParams.get('toolName'), 'widget', 200),
|
|
40
|
+
...(resourceUri ? { resourceUri } : {}),
|
|
41
|
+
},
|
|
42
|
+
viewport: {
|
|
43
|
+
width: boundedInteger(url.searchParams.get('width'), 820, 280, 3840),
|
|
44
|
+
height: boundedInteger(url.searchParams.get('height'), 640, 200, 2160),
|
|
45
|
+
device,
|
|
46
|
+
theme,
|
|
47
|
+
},
|
|
48
|
+
createdAt: now,
|
|
49
|
+
updatedAt: now,
|
|
50
|
+
annotations: [],
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
export function readOrCreateDesignDraft(store, url, context) {
|
|
54
|
+
const current = store.readDraft();
|
|
55
|
+
if (current)
|
|
56
|
+
return current;
|
|
57
|
+
const session = newDraft(url, context);
|
|
58
|
+
try {
|
|
59
|
+
store.writeDraft(session);
|
|
60
|
+
return session;
|
|
61
|
+
}
|
|
62
|
+
catch (caught) {
|
|
63
|
+
if (!(caught instanceof DesignStoreConflictError))
|
|
64
|
+
throw caught;
|
|
65
|
+
const raced = store.readDraft();
|
|
66
|
+
if (raced)
|
|
67
|
+
return raced;
|
|
68
|
+
throw caught;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function readJsonBody(req, res, onBody) {
|
|
72
|
+
if (!(req.headers['content-type'] ?? '').toLowerCase().startsWith('application/json')) {
|
|
73
|
+
error(res, 415, 'design_media_type', 'Design requests require application/json.');
|
|
74
|
+
req.resume();
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const declared = Number(req.headers['content-length']);
|
|
78
|
+
if (Number.isFinite(declared) && declared > DESIGN_MAX_BODY_BYTES) {
|
|
79
|
+
error(res, 413, 'design_body_too_large', 'Design request is too large.');
|
|
80
|
+
req.resume();
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
const chunks = [];
|
|
84
|
+
let size = 0;
|
|
85
|
+
let rejected = false;
|
|
86
|
+
req.on('data', (chunk) => {
|
|
87
|
+
if (rejected)
|
|
88
|
+
return;
|
|
89
|
+
size += chunk.byteLength;
|
|
90
|
+
if (size > DESIGN_MAX_BODY_BYTES) {
|
|
91
|
+
rejected = true;
|
|
92
|
+
error(res, 413, 'design_body_too_large', 'Design request is too large.');
|
|
93
|
+
req.destroy();
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
chunks.push(chunk);
|
|
97
|
+
});
|
|
98
|
+
req.on('end', () => {
|
|
99
|
+
if (rejected)
|
|
100
|
+
return;
|
|
101
|
+
try {
|
|
102
|
+
const parsed = JSON.parse(Buffer.concat(chunks).toString('utf8'));
|
|
103
|
+
if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) {
|
|
104
|
+
throw new Error('body must be an object');
|
|
105
|
+
}
|
|
106
|
+
onBody(parsed);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
error(res, 400, 'design_invalid_json', 'Design request contains invalid JSON.');
|
|
110
|
+
}
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Handle loopback-only Design requests. The trusted filesystem context comes from the CLI process, never
|
|
115
|
+
* from the browser request.
|
|
116
|
+
*/
|
|
117
|
+
export function handleDesignRoute(req, res, url, context) {
|
|
118
|
+
if (!url.pathname.startsWith('/design/'))
|
|
119
|
+
return false;
|
|
120
|
+
if (!context) {
|
|
121
|
+
error(res, 409, 'design_project_missing', 'Design needs a local Noodle project.');
|
|
122
|
+
return true;
|
|
123
|
+
}
|
|
124
|
+
const store = createDesignStore(context.projectRoot);
|
|
125
|
+
try {
|
|
126
|
+
if (url.pathname === '/design/session' && req.method === 'GET') {
|
|
127
|
+
const session = readOrCreateDesignDraft(store, url, context);
|
|
128
|
+
reply(res, 200, { ok: true, session });
|
|
129
|
+
return true;
|
|
130
|
+
}
|
|
131
|
+
if (url.pathname === '/design/session' && req.method === 'PUT') {
|
|
132
|
+
readJsonBody(req, res, (body) => {
|
|
133
|
+
try {
|
|
134
|
+
const session = validateDesignSession(body);
|
|
135
|
+
const expectedUpdatedAt = typeof req.headers['if-unmodified-since'] === 'string'
|
|
136
|
+
? req.headers['if-unmodified-since']
|
|
137
|
+
: undefined;
|
|
138
|
+
store.writeDraft(session, expectedUpdatedAt);
|
|
139
|
+
reply(res, 200, { ok: true, session });
|
|
140
|
+
}
|
|
141
|
+
catch (caught) {
|
|
142
|
+
if (caught instanceof DesignStoreCorruptError) {
|
|
143
|
+
error(res, 500, 'design_storage_invalid', 'Local Design storage needs recovery.');
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
if (caught instanceof DesignStoreConflictError) {
|
|
147
|
+
error(res, 409, 'design_conflict', 'The design draft changed in another tab.');
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
error(res, 400, 'design_invalid_session', 'Design Session is invalid.');
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
return true;
|
|
154
|
+
}
|
|
155
|
+
if (url.pathname === '/design/finalize' && req.method === 'POST') {
|
|
156
|
+
readJsonBody(req, res, (body) => {
|
|
157
|
+
try {
|
|
158
|
+
const current = store.readDraft();
|
|
159
|
+
if (!current) {
|
|
160
|
+
error(res, 409, 'design_draft_missing', 'No design draft is ready to finalize.');
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const expectedUpdatedAt = typeof body.expectedUpdatedAt === 'string' ? body.expectedUpdatedAt : undefined;
|
|
164
|
+
if (!expectedUpdatedAt || current.updatedAt !== expectedUpdatedAt) {
|
|
165
|
+
error(res, 409, 'design_conflict', 'The design draft changed in another tab.');
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
store.finalize(current);
|
|
169
|
+
reply(res, 200, {
|
|
170
|
+
ok: true,
|
|
171
|
+
delivery: { kind: 'clipboard', instruction: DESIGN_AGENT_INSTRUCTION },
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
catch (caught) {
|
|
175
|
+
if (caught instanceof DesignStoreCorruptError) {
|
|
176
|
+
error(res, 500, 'design_storage_invalid', 'Local Design storage needs recovery.');
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
error(res, 409, 'design_not_ready', 'Add at least one design change before continuing.');
|
|
180
|
+
}
|
|
181
|
+
});
|
|
182
|
+
return true;
|
|
183
|
+
}
|
|
184
|
+
error(res, 405, 'design_method_not_allowed', 'This Design request method is not supported.');
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
catch (caught) {
|
|
188
|
+
if (caught instanceof DesignStoreCorruptError) {
|
|
189
|
+
error(res, 500, 'design_storage_invalid', 'Local Design storage needs recovery.');
|
|
190
|
+
}
|
|
191
|
+
else {
|
|
192
|
+
error(res, 500, 'design_storage_failed', 'Could not access local Design storage.');
|
|
193
|
+
}
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=devtools-design-routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"devtools-design-routes.js","sourceRoot":"","sources":["../src/devtools-design-routes.ts"],"names":[],"mappings":"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"}
|