human2ai 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 +120 -0
- package/assets/quaternius/License_Standard.txt +22 -0
- package/assets/quaternius/README.md +31 -0
- package/assets/quaternius/Superhero_Female_FullBody.bin +0 -0
- package/assets/quaternius/Superhero_Female_FullBody.gltf +2056 -0
- package/assets/quaternius/Superhero_Male_FullBody.bin +0 -0
- package/assets/quaternius/Superhero_Male_FullBody.gltf +2018 -0
- package/dist/cli/integration.d.ts +39 -0
- package/dist/cli/integration.js +466 -0
- package/dist/cli/integration.js.map +1 -0
- package/dist/cli/main.d.ts +17 -0
- package/dist/cli/main.js +1455 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/database/composition-session-repository.d.ts +37 -0
- package/dist/database/composition-session-repository.js +147 -0
- package/dist/database/composition-session-repository.js.map +1 -0
- package/dist/database/draft-version-errors.d.ts +29 -0
- package/dist/database/draft-version-errors.js +47 -0
- package/dist/database/draft-version-errors.js.map +1 -0
- package/dist/database/draft-version-store.d.ts +30 -0
- package/dist/database/draft-version-store.js +168 -0
- package/dist/database/draft-version-store.js.map +1 -0
- package/dist/database/image-asset-repository.d.ts +37 -0
- package/dist/database/image-asset-repository.js +101 -0
- package/dist/database/image-asset-repository.js.map +1 -0
- package/dist/database/image-input.d.ts +15 -0
- package/dist/database/image-input.js +28 -0
- package/dist/database/image-input.js.map +1 -0
- package/dist/database/migrate.d.ts +4 -0
- package/dist/database/migrate.js +45 -0
- package/dist/database/migrate.js.map +1 -0
- package/dist/database/project-session-repository.d.ts +72 -0
- package/dist/database/project-session-repository.js +291 -0
- package/dist/database/project-session-repository.js.map +1 -0
- package/dist/database/spatial-session-repository.d.ts +26 -0
- package/dist/database/spatial-session-repository.js +44 -0
- package/dist/database/spatial-session-repository.js.map +1 -0
- package/dist/database/style-library-repository.d.ts +70 -0
- package/dist/database/style-library-repository.js +290 -0
- package/dist/database/style-library-repository.js.map +1 -0
- package/dist/database/svg-input.d.ts +1 -0
- package/dist/database/svg-input.js +77 -0
- package/dist/database/svg-input.js.map +1 -0
- package/dist/database/ui-sketch-session-repository.d.ts +19 -0
- package/dist/database/ui-sketch-session-repository.js +35 -0
- package/dist/database/ui-sketch-session-repository.js.map +1 -0
- package/dist/domain/canvas-layer-order.d.ts +6 -0
- package/dist/domain/canvas-layer-order.js +40 -0
- package/dist/domain/canvas-layer-order.js.map +1 -0
- package/dist/domain/canvas-node-metadata.d.ts +20 -0
- package/dist/domain/canvas-node-metadata.js +17 -0
- package/dist/domain/canvas-node-metadata.js.map +1 -0
- package/dist/domain/canvas-states.d.ts +8 -0
- package/dist/domain/canvas-states.js +23 -0
- package/dist/domain/canvas-states.js.map +1 -0
- package/dist/domain/composition/analysis.d.ts +104 -0
- package/dist/domain/composition/analysis.js +337 -0
- package/dist/domain/composition/analysis.js.map +1 -0
- package/dist/domain/composition/camera-reference.d.ts +24 -0
- package/dist/domain/composition/camera-reference.js +34 -0
- package/dist/domain/composition/camera-reference.js.map +1 -0
- package/dist/domain/composition/draft.d.ts +50 -0
- package/dist/domain/composition/draft.js +609 -0
- package/dist/domain/composition/draft.js.map +1 -0
- package/dist/domain/composition/frame.d.ts +23 -0
- package/dist/domain/composition/frame.js +154 -0
- package/dist/domain/composition/frame.js.map +1 -0
- package/dist/domain/composition/geometry.d.ts +15 -0
- package/dist/domain/composition/geometry.js +262 -0
- package/dist/domain/composition/geometry.js.map +1 -0
- package/dist/domain/composition/index.d.ts +13 -0
- package/dist/domain/composition/index.js +10 -0
- package/dist/domain/composition/index.js.map +1 -0
- package/dist/domain/composition/layers.d.ts +4 -0
- package/dist/domain/composition/layers.js +12 -0
- package/dist/domain/composition/layers.js.map +1 -0
- package/dist/domain/composition/records.d.ts +14 -0
- package/dist/domain/composition/records.js +2 -0
- package/dist/domain/composition/records.js.map +1 -0
- package/dist/domain/composition/refinement/engine.d.ts +12 -0
- package/dist/domain/composition/refinement/engine.js +521 -0
- package/dist/domain/composition/refinement/engine.js.map +1 -0
- package/dist/domain/composition/refinement/relations.d.ts +16 -0
- package/dist/domain/composition/refinement/relations.js +293 -0
- package/dist/domain/composition/refinement/relations.js.map +1 -0
- package/dist/domain/composition/refinement/types.d.ts +181 -0
- package/dist/domain/composition/refinement/types.js +2 -0
- package/dist/domain/composition/refinement/types.js.map +1 -0
- package/dist/domain/composition/render.d.ts +5 -0
- package/dist/domain/composition/render.js +169 -0
- package/dist/domain/composition/render.js.map +1 -0
- package/dist/domain/composition/states.d.ts +9 -0
- package/dist/domain/composition/states.js +104 -0
- package/dist/domain/composition/states.js.map +1 -0
- package/dist/domain/composition/types.d.ts +149 -0
- package/dist/domain/composition/types.js +2 -0
- package/dist/domain/composition/types.js.map +1 -0
- package/dist/domain/composition/workflow.d.ts +15 -0
- package/dist/domain/composition/workflow.js +77 -0
- package/dist/domain/composition/workflow.js.map +1 -0
- package/dist/domain/fingerprint.d.ts +2 -0
- package/dist/domain/fingerprint.js +25 -0
- package/dist/domain/fingerprint.js.map +1 -0
- package/dist/domain/session/canvas-edit-history.d.ts +17 -0
- package/dist/domain/session/canvas-edit-history.js +53 -0
- package/dist/domain/session/canvas-edit-history.js.map +1 -0
- package/dist/domain/session/capabilities.d.ts +16 -0
- package/dist/domain/session/capabilities.js +84 -0
- package/dist/domain/session/capabilities.js.map +1 -0
- package/dist/domain/session/draft-version.d.ts +41 -0
- package/dist/domain/session/draft-version.js +2 -0
- package/dist/domain/session/draft-version.js.map +1 -0
- package/dist/domain/session/index.d.ts +5 -0
- package/dist/domain/session/index.js +3 -0
- package/dist/domain/session/index.js.map +1 -0
- package/dist/domain/session/types.d.ts +23 -0
- package/dist/domain/session/types.js +2 -0
- package/dist/domain/session/types.js.map +1 -0
- package/dist/domain/spatial/assets/quaternius-female-rig.json +799 -0
- package/dist/domain/spatial/assets/quaternius-rig.json +799 -0
- package/dist/domain/spatial/assets/quaternius-superhero-female.json +1 -0
- package/dist/domain/spatial/assets/quaternius-superhero.json +1 -0
- package/dist/domain/spatial/camera-box.d.ts +13 -0
- package/dist/domain/spatial/camera-box.js +52 -0
- package/dist/domain/spatial/camera-box.js.map +1 -0
- package/dist/domain/spatial/geometric-model.d.ts +4 -0
- package/dist/domain/spatial/geometric-model.js +101 -0
- package/dist/domain/spatial/geometric-model.js.map +1 -0
- package/dist/domain/spatial/hands.d.ts +36 -0
- package/dist/domain/spatial/hands.js +128 -0
- package/dist/domain/spatial/hands.js.map +1 -0
- package/dist/domain/spatial/index.d.ts +30 -0
- package/dist/domain/spatial/index.js +381 -0
- package/dist/domain/spatial/index.js.map +1 -0
- package/dist/domain/spatial/kinematics.d.ts +27 -0
- package/dist/domain/spatial/kinematics.js +285 -0
- package/dist/domain/spatial/kinematics.js.map +1 -0
- package/dist/domain/spatial/lighting.d.ts +35 -0
- package/dist/domain/spatial/lighting.js +173 -0
- package/dist/domain/spatial/lighting.js.map +1 -0
- package/dist/domain/spatial/model.d.ts +5 -0
- package/dist/domain/spatial/model.js +193 -0
- package/dist/domain/spatial/model.js.map +1 -0
- package/dist/domain/spatial/morph.d.ts +3 -0
- package/dist/domain/spatial/morph.js +187 -0
- package/dist/domain/spatial/morph.js.map +1 -0
- package/dist/domain/spatial/proportions.d.ts +46 -0
- package/dist/domain/spatial/proportions.js +59 -0
- package/dist/domain/spatial/proportions.js.map +1 -0
- package/dist/domain/spatial/reference-lines.d.ts +6 -0
- package/dist/domain/spatial/reference-lines.js +58 -0
- package/dist/domain/spatial/reference-lines.js.map +1 -0
- package/dist/domain/spatial/scene-cache.d.ts +15 -0
- package/dist/domain/spatial/scene-cache.js +69 -0
- package/dist/domain/spatial/scene-cache.js.map +1 -0
- package/dist/domain/spatial/scene.d.ts +8 -0
- package/dist/domain/spatial/scene.js +69 -0
- package/dist/domain/spatial/scene.js.map +1 -0
- package/dist/domain/spatial/types.d.ts +187 -0
- package/dist/domain/spatial/types.js +5 -0
- package/dist/domain/spatial/types.js.map +1 -0
- package/dist/domain/style/index.d.ts +1 -0
- package/dist/domain/style/index.js +2 -0
- package/dist/domain/style/index.js.map +1 -0
- package/dist/domain/style/prompt-summary.d.ts +2 -0
- package/dist/domain/style/prompt-summary.js +11 -0
- package/dist/domain/style/prompt-summary.js.map +1 -0
- package/dist/domain/style/types.d.ts +32 -0
- package/dist/domain/style/types.js +3 -0
- package/dist/domain/style/types.js.map +1 -0
- package/dist/domain/ui-sketch/draft.d.ts +12 -0
- package/dist/domain/ui-sketch/draft.js +424 -0
- package/dist/domain/ui-sketch/draft.js.map +1 -0
- package/dist/domain/ui-sketch/geometry.d.ts +7 -0
- package/dist/domain/ui-sketch/geometry.js +11 -0
- package/dist/domain/ui-sketch/geometry.js.map +1 -0
- package/dist/domain/ui-sketch/groups.d.ts +5 -0
- package/dist/domain/ui-sketch/groups.js +40 -0
- package/dist/domain/ui-sketch/groups.js.map +1 -0
- package/dist/domain/ui-sketch/index.d.ts +8 -0
- package/dist/domain/ui-sketch/index.js +8 -0
- package/dist/domain/ui-sketch/index.js.map +1 -0
- package/dist/domain/ui-sketch/layers.d.ts +4 -0
- package/dist/domain/ui-sketch/layers.js +11 -0
- package/dist/domain/ui-sketch/layers.js.map +1 -0
- package/dist/domain/ui-sketch/render.d.ts +2 -0
- package/dist/domain/ui-sketch/render.js +58 -0
- package/dist/domain/ui-sketch/render.js.map +1 -0
- package/dist/domain/ui-sketch/standardize.d.ts +17 -0
- package/dist/domain/ui-sketch/standardize.js +139 -0
- package/dist/domain/ui-sketch/standardize.js.map +1 -0
- package/dist/domain/ui-sketch/states.d.ts +5 -0
- package/dist/domain/ui-sketch/states.js +21 -0
- package/dist/domain/ui-sketch/states.js.map +1 -0
- package/dist/domain/ui-sketch/types.d.ts +73 -0
- package/dist/domain/ui-sketch/types.js +2 -0
- package/dist/domain/ui-sketch/types.js.map +1 -0
- package/dist/server/app.d.ts +18 -0
- package/dist/server/app.js +108 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/image-content-type-parser.d.ts +2 -0
- package/dist/server/image-content-type-parser.js +5 -0
- package/dist/server/image-content-type-parser.js.map +1 -0
- package/dist/server/routes/composition-sessions.d.ts +3 -0
- package/dist/server/routes/composition-sessions.js +190 -0
- package/dist/server/routes/composition-sessions.js.map +1 -0
- package/dist/server/routes/draft-version-routes.d.ts +10 -0
- package/dist/server/routes/draft-version-routes.js +201 -0
- package/dist/server/routes/draft-version-routes.js.map +1 -0
- package/dist/server/routes/image-assets.d.ts +3 -0
- package/dist/server/routes/image-assets.js +114 -0
- package/dist/server/routes/image-assets.js.map +1 -0
- package/dist/server/routes/project-sessions.d.ts +48 -0
- package/dist/server/routes/project-sessions.js +305 -0
- package/dist/server/routes/project-sessions.js.map +1 -0
- package/dist/server/routes/spatial-sessions.d.ts +3 -0
- package/dist/server/routes/spatial-sessions.js +80 -0
- package/dist/server/routes/spatial-sessions.js.map +1 -0
- package/dist/server/routes/style-library.d.ts +3 -0
- package/dist/server/routes/style-library.js +308 -0
- package/dist/server/routes/style-library.js.map +1 -0
- package/dist/server/routes/ui-sketch-sessions.d.ts +3 -0
- package/dist/server/routes/ui-sketch-sessions.js +14 -0
- package/dist/server/routes/ui-sketch-sessions.js.map +1 -0
- package/dist/server/runtime.d.ts +30 -0
- package/dist/server/runtime.js +123 -0
- package/dist/server/runtime.js.map +1 -0
- package/dist/server/spatial-render.d.ts +5 -0
- package/dist/server/spatial-render.js +360 -0
- package/dist/server/spatial-render.js.map +1 -0
- package/dist/server/start.d.ts +1 -0
- package/dist/server/start.js +3 -0
- package/dist/server/start.js.map +1 -0
- package/licenses/THIRD-PARTY-NOTICES.txt +16664 -0
- package/licenses/YisiUI-LICENSE +21 -0
- package/locales/en/common.json +671 -0
- package/migrations/0001_projects_and_sessions.sql +45 -0
- package/migrations/0002_composition_versions_and_refinements.sql +26 -0
- package/migrations/0003_ui_sketch_draft_versions.sql +12 -0
- package/migrations/0004_image_assets.sql +16 -0
- package/migrations/0005_style_library.sql +31 -0
- package/migrations/0006_session_styles.sql +6 -0
- package/migrations/0007_svg_image_assets.sql +19 -0
- package/migrations/0008_spatial_spaces.sql +20 -0
- package/package.json +82 -0
- package/schemas/composition-draft.schema.json +234 -0
- package/schemas/composition-refinement-plan.schema.json +758 -0
- package/schemas/spatial-draft.schema.json +517 -0
- package/schemas/spatial-operations.schema.json +1082 -0
- package/schemas/ui-layout-standardization-plan.schema.json +29 -0
- package/schemas/ui-sketch-draft.schema.json +197 -0
- package/skills/human2ai/SKILL.md +149 -0
- package/skills/human2ai/agents/openai.yaml +3 -0
- package/skills/human2ai/references/composition-projection.md +170 -0
- package/skills/human2ai/references/composition.md +79 -0
- package/skills/human2ai/references/spatial.md +188 -0
- package/skills/human2ai/references/svg-images.md +27 -0
- package/skills/human2ai/references/ui-layout.md +100 -0
- package/web/out/404/index.html +1 -0
- package/web/out/404.html +1 -0
- package/web/out/__next.__PAGE__.txt +26 -0
- package/web/out/__next._full.txt +21 -0
- package/web/out/__next._tree.txt +4 -0
- package/web/out/_next/static/TV-jgcACg6HANZAMZTE2S/_buildManifest.js +1 -0
- package/web/out/_next/static/TV-jgcACg6HANZAMZTE2S/_ssgManifest.js +1 -0
- package/web/out/_next/static/chunks/130-9fadd0432daff55d.js +1 -0
- package/web/out/_next/static/chunks/158-eb00456e1bab68b3.js +52 -0
- package/web/out/_next/static/chunks/20-0801fc297cda2a7a.js +1 -0
- package/web/out/_next/static/chunks/248-d4a79649dae2a3f8.js +259 -0
- package/web/out/_next/static/chunks/678-1305cadf8254d814.js +1 -0
- package/web/out/_next/static/chunks/728-eb8b667f79229443.js +1 -0
- package/web/out/_next/static/chunks/83607670-bc1279370476e59f.js +1 -0
- package/web/out/_next/static/chunks/app/_global-error/page-5eece43b8152c414.js +1 -0
- package/web/out/_next/static/chunks/app/_not-found/page-c0cd75ac39fbf9cf.js +1 -0
- package/web/out/_next/static/chunks/app/composition/page-051ee2fabb12110a.js +1 -0
- package/web/out/_next/static/chunks/app/layout-745ca27ef8830f4f.js +1 -0
- package/web/out/_next/static/chunks/app/page-0027378a269a6168.js +1 -0
- package/web/out/_next/static/chunks/app/spatial/page-266dedc81784d4f6.js +1 -0
- package/web/out/_next/static/chunks/app/styles/page-d5cb83af828ea9ed.js +1 -0
- package/web/out/_next/static/chunks/app/ui-sketch/page-2a8436e05a05c618.js +1 -0
- package/web/out/_next/static/chunks/c3f2cda1-9e279dab137b7272.js +342 -0
- package/web/out/_next/static/chunks/c7879cf7-7873c8afd9c9c666.js +1 -0
- package/web/out/_next/static/chunks/framework-6eacf80ec1e4c887.js +1 -0
- package/web/out/_next/static/chunks/main-5ee8fd93319f955c.js +5 -0
- package/web/out/_next/static/chunks/main-app-0cf10803ab17c700.js +1 -0
- package/web/out/_next/static/chunks/next/dist/client/components/builtin/app-error-5eece43b8152c414.js +1 -0
- package/web/out/_next/static/chunks/next/dist/client/components/builtin/forbidden-5eece43b8152c414.js +1 -0
- package/web/out/_next/static/chunks/next/dist/client/components/builtin/global-error-728204b7cccc4ed2.js +1 -0
- package/web/out/_next/static/chunks/next/dist/client/components/builtin/not-found-5eece43b8152c414.js +1 -0
- package/web/out/_next/static/chunks/next/dist/client/components/builtin/unauthorized-5eece43b8152c414.js +1 -0
- package/web/out/_next/static/chunks/polyfills-42372ed130431b0a.js +1 -0
- package/web/out/_next/static/chunks/webpack-97ae63c0e0b2a512.js +1 -0
- package/web/out/_next/static/css/3b7982b41ed8eccd.css +4 -0
- package/web/out/_next/static/css/81ae71f1d3e9a866.css +1 -0
- package/web/out/_next/static/css/8c3843f4951fa9f6.css +5 -0
- package/web/out/_next/static/css/c739d0131cdcc891.css +1 -0
- package/web/out/_next/static/css/ce1b4bb3ad3c6073.css +1 -0
- package/web/out/_next/static/css/db96ae2e88545d96.css +1 -0
- package/web/out/_not-found/__next._full.txt +18 -0
- package/web/out/_not-found/__next._not-found.__PAGE__.txt +24 -0
- package/web/out/_not-found/__next._tree.txt +3 -0
- package/web/out/_not-found/index.html +1 -0
- package/web/out/_not-found/index.txt +18 -0
- package/web/out/composition/__next._full.txt +25 -0
- package/web/out/composition/__next._tree.txt +6 -0
- package/web/out/composition/__next.composition.__PAGE__.txt +31 -0
- package/web/out/composition/index.html +1 -0
- package/web/out/composition/index.txt +25 -0
- package/web/out/index.html +1 -0
- package/web/out/index.txt +21 -0
- package/web/out/spatial/__next._full.txt +23 -0
- package/web/out/spatial/__next._tree.txt +4 -0
- package/web/out/spatial/__next.spatial.__PAGE__.txt +29 -0
- package/web/out/spatial/index.html +1 -0
- package/web/out/spatial/index.txt +23 -0
- package/web/out/styles/__next._full.txt +23 -0
- package/web/out/styles/__next._tree.txt +4 -0
- package/web/out/styles/__next.styles.__PAGE__.txt +29 -0
- package/web/out/styles/index.html +1 -0
- package/web/out/styles/index.txt +23 -0
- package/web/out/ui-sketch/__next._full.txt +25 -0
- package/web/out/ui-sketch/__next._tree.txt +6 -0
- package/web/out/ui-sketch/__next.ui-sketch.__PAGE__.txt +31 -0
- package/web/out/ui-sketch/index.html +1 -0
- package/web/out/ui-sketch/index.txt +25 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { DraftVersionStore } from "./draft-version-store.js";
|
|
2
|
+
import { applySpatialOperations, createSpatialDraft, spatialDraftFingerprint, validateSpatialDraft, validateSpatialTransition } from "../domain/spatial/index.js";
|
|
3
|
+
export class SpatialSessionRepository {
|
|
4
|
+
database;
|
|
5
|
+
draftVersions;
|
|
6
|
+
applyingOperations = false;
|
|
7
|
+
constructor(database) {
|
|
8
|
+
this.database = database;
|
|
9
|
+
this.draftVersions = new DraftVersionStore(database, {
|
|
10
|
+
table: "spatial_draft_versions", storesFingerprint: false,
|
|
11
|
+
sessionType: "spatial", sessionLabel: "3D space",
|
|
12
|
+
validateDraft: validateSpatialDraft, fingerprint: spatialDraftFingerprint,
|
|
13
|
+
validateTransition: (before, after) => { if (!this.applyingOperations)
|
|
14
|
+
validateSpatialTransition(before, after); },
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
listDraftVersions(sessionId) { return this.draftVersions.listDraftVersions(sessionId); }
|
|
18
|
+
getLatestDraftVersion(sessionId, knownRevision) { return this.draftVersions.getLatestDraftVersion(sessionId, knownRevision); }
|
|
19
|
+
getDraftVersion(sessionId, revision) { return this.draftVersions.getDraftVersion(sessionId, revision); }
|
|
20
|
+
createDraftVersion(sessionId, input) { return this.draftVersions.createDraftVersion(sessionId, input); }
|
|
21
|
+
restoreDraftVersion(sessionId, input) {
|
|
22
|
+
return this.draftVersions.restoreDraftVersion(sessionId, input);
|
|
23
|
+
}
|
|
24
|
+
undoDraftVersion(sessionId, input) { return this.draftVersions.undoDraftVersion(sessionId, input); }
|
|
25
|
+
apply(sessionId, expectedLatestRevision, operations) {
|
|
26
|
+
return this.database.transaction(() => {
|
|
27
|
+
const current = expectedLatestRevision > 0 ? this.getDraftVersion(sessionId, expectedLatestRevision).draft : createSpatialDraft();
|
|
28
|
+
const result = applySpatialOperations(current, operations);
|
|
29
|
+
if (expectedLatestRevision === 0)
|
|
30
|
+
this.createDraftVersion(sessionId, { expectedLatestRevision: 0, draft: current });
|
|
31
|
+
// Each operation has already checked its own transition, including explicit
|
|
32
|
+
// unlock/move/relock sequences that a final-state comparison cannot express.
|
|
33
|
+
this.applyingOperations = true;
|
|
34
|
+
try {
|
|
35
|
+
const version = this.createDraftVersion(sessionId, { expectedLatestRevision: expectedLatestRevision || 1, draft: result.draft });
|
|
36
|
+
return { ...version, constrained: result.constrained };
|
|
37
|
+
}
|
|
38
|
+
finally {
|
|
39
|
+
this.applyingOperations = false;
|
|
40
|
+
}
|
|
41
|
+
})();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=spatial-session-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spatial-session-repository.js","sourceRoot":"","sources":["../../src/database/spatial-session-repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { type StyleCategory, type StyleCreatorType, type StyleEntry, type StyleReferenceImage, type SessionStyleState } from "../domain/style/index.ts";
|
|
2
|
+
import type { DatabaseConnection } from "./migrate.ts";
|
|
3
|
+
export declare class StyleNotFoundError extends Error {
|
|
4
|
+
readonly styleId: string;
|
|
5
|
+
readonly code = "STYLE_NOT_FOUND";
|
|
6
|
+
constructor(styleId: string);
|
|
7
|
+
}
|
|
8
|
+
export declare class StyleReferenceNotFoundError extends Error {
|
|
9
|
+
readonly styleId: string;
|
|
10
|
+
readonly referenceId: string;
|
|
11
|
+
readonly code = "STYLE_REFERENCE_NOT_FOUND";
|
|
12
|
+
constructor(styleId: string, referenceId: string);
|
|
13
|
+
}
|
|
14
|
+
export declare class InvalidStyleError extends Error {
|
|
15
|
+
readonly code = "INVALID_STYLE";
|
|
16
|
+
}
|
|
17
|
+
export declare class StyleRevisionConflictError extends Error {
|
|
18
|
+
readonly expectedRevision: number;
|
|
19
|
+
readonly actualRevision: number;
|
|
20
|
+
readonly code = "STYLE_REVISION_CONFLICT";
|
|
21
|
+
constructor(expectedRevision: number, actualRevision: number);
|
|
22
|
+
}
|
|
23
|
+
export declare class InvalidStyleReferenceError extends Error {
|
|
24
|
+
readonly code = "INVALID_STYLE_REFERENCE";
|
|
25
|
+
}
|
|
26
|
+
export declare class StyleLibraryRepository {
|
|
27
|
+
private readonly database;
|
|
28
|
+
private readonly artifactsRoot;
|
|
29
|
+
constructor(database: DatabaseConnection, artifactsDirectory: string);
|
|
30
|
+
listStyles(): StyleEntry[];
|
|
31
|
+
getStyle(styleId: string): StyleEntry;
|
|
32
|
+
getSessionStyle(sessionId: string): SessionStyleState;
|
|
33
|
+
bindSessionStyle(sessionId: string, input: {
|
|
34
|
+
styleId: string | null;
|
|
35
|
+
expectedRevision: number;
|
|
36
|
+
}): SessionStyleState;
|
|
37
|
+
createStyle(input: {
|
|
38
|
+
name: string;
|
|
39
|
+
category: StyleCategory;
|
|
40
|
+
creatorType: StyleCreatorType;
|
|
41
|
+
description: string;
|
|
42
|
+
promptSummary?: string;
|
|
43
|
+
}): StyleEntry;
|
|
44
|
+
updateStyle(styleId: string, input: {
|
|
45
|
+
expectedRevision: number;
|
|
46
|
+
name?: string;
|
|
47
|
+
category?: StyleCategory;
|
|
48
|
+
description?: string;
|
|
49
|
+
promptSummary?: string;
|
|
50
|
+
}): StyleEntry;
|
|
51
|
+
deleteStyle(styleId: string, input: {
|
|
52
|
+
expectedRevision: number;
|
|
53
|
+
}): Promise<void>;
|
|
54
|
+
addReferenceImage(styleId: string, input: {
|
|
55
|
+
expectedRevision: number;
|
|
56
|
+
filename: string;
|
|
57
|
+
data: Buffer;
|
|
58
|
+
}): Promise<StyleEntry>;
|
|
59
|
+
deleteReferenceImage(styleId: string, referenceId: string, input: {
|
|
60
|
+
expectedRevision: number;
|
|
61
|
+
}): Promise<StyleEntry>;
|
|
62
|
+
getReferenceImage(styleId: string, referenceId: string): {
|
|
63
|
+
reference: StyleReferenceImage;
|
|
64
|
+
filePath: string;
|
|
65
|
+
};
|
|
66
|
+
private mapStyle;
|
|
67
|
+
private referenceRow;
|
|
68
|
+
private incrementRevision;
|
|
69
|
+
private filePath;
|
|
70
|
+
}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { existsSync } from "node:fs";
|
|
3
|
+
import { mkdir, rm, unlink, writeFile } from "node:fs/promises";
|
|
4
|
+
import { basename, dirname, join, resolve, sep } from "node:path";
|
|
5
|
+
import { STYLE_CATEGORIES, STYLE_CREATOR_TYPES, } from "../domain/style/index.js";
|
|
6
|
+
import { defaultStylePromptSummary, MAX_STYLE_PROMPT_SUMMARY_LENGTH } from "../domain/style/prompt-summary.js";
|
|
7
|
+
import { inspectImageInput, MAX_IMAGE_ASSET_BYTES } from "./image-input.js";
|
|
8
|
+
import { ProjectSessionRepository, RevisionConflictError } from "./project-session-repository.js";
|
|
9
|
+
export class StyleNotFoundError extends Error {
|
|
10
|
+
styleId;
|
|
11
|
+
code = "STYLE_NOT_FOUND";
|
|
12
|
+
constructor(styleId) {
|
|
13
|
+
super(`Style not found: ${styleId}`);
|
|
14
|
+
this.styleId = styleId;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export class StyleReferenceNotFoundError extends Error {
|
|
18
|
+
styleId;
|
|
19
|
+
referenceId;
|
|
20
|
+
code = "STYLE_REFERENCE_NOT_FOUND";
|
|
21
|
+
constructor(styleId, referenceId) {
|
|
22
|
+
super(`Style reference ${referenceId} was not found in style ${styleId}`);
|
|
23
|
+
this.styleId = styleId;
|
|
24
|
+
this.referenceId = referenceId;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
export class InvalidStyleError extends Error {
|
|
28
|
+
code = "INVALID_STYLE";
|
|
29
|
+
}
|
|
30
|
+
export class StyleRevisionConflictError extends Error {
|
|
31
|
+
expectedRevision;
|
|
32
|
+
actualRevision;
|
|
33
|
+
code = "STYLE_REVISION_CONFLICT";
|
|
34
|
+
constructor(expectedRevision, actualRevision) {
|
|
35
|
+
super(`Expected style revision ${expectedRevision}, received ${actualRevision}`);
|
|
36
|
+
this.expectedRevision = expectedRevision;
|
|
37
|
+
this.actualRevision = actualRevision;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export class InvalidStyleReferenceError extends Error {
|
|
41
|
+
code = "INVALID_STYLE_REFERENCE";
|
|
42
|
+
}
|
|
43
|
+
export class StyleLibraryRepository {
|
|
44
|
+
database;
|
|
45
|
+
artifactsRoot;
|
|
46
|
+
constructor(database, artifactsDirectory) {
|
|
47
|
+
this.database = database;
|
|
48
|
+
this.artifactsRoot = resolve(artifactsDirectory);
|
|
49
|
+
}
|
|
50
|
+
listStyles() {
|
|
51
|
+
const rows = this.database.prepare(`${STYLE_SELECT}
|
|
52
|
+
ORDER BY updated_at DESC, id
|
|
53
|
+
`).all();
|
|
54
|
+
return rows.map((row) => this.mapStyle(row));
|
|
55
|
+
}
|
|
56
|
+
getStyle(styleId) {
|
|
57
|
+
const row = this.database.prepare(`${STYLE_SELECT}
|
|
58
|
+
WHERE id = ?
|
|
59
|
+
`).get(styleId);
|
|
60
|
+
if (!row)
|
|
61
|
+
throw new StyleNotFoundError(styleId);
|
|
62
|
+
return this.mapStyle(row);
|
|
63
|
+
}
|
|
64
|
+
getSessionStyle(sessionId) {
|
|
65
|
+
const session = new ProjectSessionRepository(this.database).getSession(sessionId);
|
|
66
|
+
return { session, style: session.styleId ? this.getStyle(session.styleId) : null };
|
|
67
|
+
}
|
|
68
|
+
bindSessionStyle(sessionId, input) {
|
|
69
|
+
return this.database.transaction(() => {
|
|
70
|
+
const { session } = this.getSessionStyle(sessionId);
|
|
71
|
+
if (session.revision !== input.expectedRevision) {
|
|
72
|
+
throw new RevisionConflictError(input.expectedRevision, session.revision);
|
|
73
|
+
}
|
|
74
|
+
if (input.styleId !== null)
|
|
75
|
+
this.getStyle(input.styleId);
|
|
76
|
+
if (session.styleId !== input.styleId) {
|
|
77
|
+
this.database.prepare(`UPDATE sessions SET style_id = ?, revision = revision + 1, updated_at = ?
|
|
78
|
+
WHERE id = ? AND revision = ?`).run(input.styleId, new Date().toISOString(), sessionId, input.expectedRevision);
|
|
79
|
+
}
|
|
80
|
+
return this.getSessionStyle(sessionId);
|
|
81
|
+
})();
|
|
82
|
+
}
|
|
83
|
+
createStyle(input) {
|
|
84
|
+
const name = requiredText(input.name, "Style name", 200);
|
|
85
|
+
const description = requiredText(input.description, "Style description", 20_000);
|
|
86
|
+
const promptSummary = normalizedPromptSummary(input.promptSummary ?? defaultStylePromptSummary(description));
|
|
87
|
+
const category = styleCategory(input.category);
|
|
88
|
+
const creatorType = styleCreatorType(input.creatorType);
|
|
89
|
+
const id = randomUUID();
|
|
90
|
+
const now = new Date().toISOString();
|
|
91
|
+
this.database.prepare(`INSERT INTO style_entries
|
|
92
|
+
(id, name, category, creator_type, description, prompt_summary, revision, created_at, updated_at)
|
|
93
|
+
VALUES (?, ?, ?, ?, ?, ?, 1, ?, ?)`).run(id, name, category, creatorType, description, promptSummary, now, now);
|
|
94
|
+
return this.getStyle(id);
|
|
95
|
+
}
|
|
96
|
+
updateStyle(styleId, input) {
|
|
97
|
+
const style = this.getStyle(styleId);
|
|
98
|
+
assertRevision(input.expectedRevision, style.revision);
|
|
99
|
+
const name = input.name === undefined
|
|
100
|
+
? style.name
|
|
101
|
+
: requiredText(input.name, "Style name", 200);
|
|
102
|
+
const category = input.category === undefined
|
|
103
|
+
? style.category
|
|
104
|
+
: styleCategory(input.category);
|
|
105
|
+
const description = input.description === undefined
|
|
106
|
+
? style.description
|
|
107
|
+
: requiredText(input.description, "Style description", 20_000);
|
|
108
|
+
const promptSummary = input.promptSummary !== undefined
|
|
109
|
+
? normalizedPromptSummary(input.promptSummary)
|
|
110
|
+
: input.description !== undefined
|
|
111
|
+
? defaultStylePromptSummary(description)
|
|
112
|
+
: style.promptSummary;
|
|
113
|
+
if (name === style.name
|
|
114
|
+
&& category === style.category
|
|
115
|
+
&& description === style.description
|
|
116
|
+
&& promptSummary === style.promptSummary) {
|
|
117
|
+
return style;
|
|
118
|
+
}
|
|
119
|
+
const updatedAt = new Date().toISOString();
|
|
120
|
+
this.database.prepare(`UPDATE style_entries
|
|
121
|
+
SET name = ?, category = ?, description = ?, prompt_summary = ?, revision = revision + 1, updated_at = ?
|
|
122
|
+
WHERE id = ? AND revision = ?`).run(name, category, description, promptSummary, updatedAt, styleId, input.expectedRevision);
|
|
123
|
+
return this.getStyle(styleId);
|
|
124
|
+
}
|
|
125
|
+
async deleteStyle(styleId, input) {
|
|
126
|
+
const style = this.getStyle(styleId);
|
|
127
|
+
assertRevision(input.expectedRevision, style.revision);
|
|
128
|
+
this.database.transaction(() => {
|
|
129
|
+
this.database.prepare("UPDATE sessions SET style_id = NULL, revision = revision + 1, updated_at = ? WHERE style_id = ?").run(new Date().toISOString(), styleId);
|
|
130
|
+
this.database.prepare("DELETE FROM style_entries WHERE id = ? AND revision = ?").run(styleId, input.expectedRevision);
|
|
131
|
+
})();
|
|
132
|
+
await rm(this.filePath(join("styles", styleId)), { recursive: true, force: true });
|
|
133
|
+
}
|
|
134
|
+
async addReferenceImage(styleId, input) {
|
|
135
|
+
const style = this.getStyle(styleId);
|
|
136
|
+
assertRevision(input.expectedRevision, style.revision);
|
|
137
|
+
const image = await inspectImage(input.data);
|
|
138
|
+
const id = randomUUID();
|
|
139
|
+
const extension = image.format === "jpeg" ? "jpg" : image.format;
|
|
140
|
+
const relativePath = join("styles", styleId, `${id}.${extension}`);
|
|
141
|
+
const filePath = this.filePath(relativePath);
|
|
142
|
+
const originalFilename = safeFilename(input.filename);
|
|
143
|
+
const createdAt = new Date().toISOString();
|
|
144
|
+
await mkdir(dirname(filePath), { recursive: true, mode: 0o700 });
|
|
145
|
+
await writeFile(filePath, input.data, { flag: "wx", mode: 0o600 });
|
|
146
|
+
try {
|
|
147
|
+
this.database.transaction(() => {
|
|
148
|
+
this.incrementRevision(styleId, input.expectedRevision, createdAt);
|
|
149
|
+
const position = this.database.prepare(`SELECT coalesce(max(position) + 1, 0) AS position
|
|
150
|
+
FROM style_reference_images
|
|
151
|
+
WHERE style_id = ?`).get(styleId)?.position ?? 0;
|
|
152
|
+
this.database.prepare(`INSERT INTO style_reference_images
|
|
153
|
+
(id, style_id, relative_path, original_filename, mime_type,
|
|
154
|
+
byte_size, width, height, position, created_at)
|
|
155
|
+
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, styleId, relativePath, originalFilename, image.mimeType, input.data.byteLength, image.width, image.height, position, createdAt);
|
|
156
|
+
})();
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
await unlink(filePath).catch(() => undefined);
|
|
160
|
+
throw error;
|
|
161
|
+
}
|
|
162
|
+
return this.getStyle(styleId);
|
|
163
|
+
}
|
|
164
|
+
async deleteReferenceImage(styleId, referenceId, input) {
|
|
165
|
+
const style = this.getStyle(styleId);
|
|
166
|
+
assertRevision(input.expectedRevision, style.revision);
|
|
167
|
+
const reference = this.referenceRow(styleId, referenceId);
|
|
168
|
+
const updatedAt = new Date().toISOString();
|
|
169
|
+
this.database.transaction(() => {
|
|
170
|
+
this.database.prepare("DELETE FROM style_reference_images WHERE style_id = ? AND id = ?").run(styleId, referenceId);
|
|
171
|
+
this.incrementRevision(styleId, input.expectedRevision, updatedAt);
|
|
172
|
+
})();
|
|
173
|
+
await unlink(this.filePath(reference.relative_path)).catch(() => undefined);
|
|
174
|
+
return this.getStyle(styleId);
|
|
175
|
+
}
|
|
176
|
+
getReferenceImage(styleId, referenceId) {
|
|
177
|
+
this.getStyle(styleId);
|
|
178
|
+
const row = this.referenceRow(styleId, referenceId);
|
|
179
|
+
const filePath = this.filePath(row.relative_path);
|
|
180
|
+
if (!existsSync(filePath))
|
|
181
|
+
throw new StyleReferenceNotFoundError(styleId, referenceId);
|
|
182
|
+
return { reference: mapReference(row), filePath };
|
|
183
|
+
}
|
|
184
|
+
mapStyle(row) {
|
|
185
|
+
const references = this.database.prepare(`${REFERENCE_SELECT}
|
|
186
|
+
WHERE style_id = ?
|
|
187
|
+
ORDER BY position, id`).all(row.id);
|
|
188
|
+
return {
|
|
189
|
+
id: row.id,
|
|
190
|
+
name: row.name,
|
|
191
|
+
category: row.category,
|
|
192
|
+
creatorType: row.creator_type,
|
|
193
|
+
description: row.description,
|
|
194
|
+
promptSummary: row.prompt_summary ?? defaultStylePromptSummary(row.description),
|
|
195
|
+
referenceImages: references.map(mapReference),
|
|
196
|
+
revision: row.revision,
|
|
197
|
+
createdAt: row.created_at,
|
|
198
|
+
updatedAt: row.updated_at,
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
referenceRow(styleId, referenceId) {
|
|
202
|
+
const row = this.database.prepare(`${REFERENCE_SELECT}
|
|
203
|
+
WHERE style_id = ? AND id = ?`).get(styleId, referenceId);
|
|
204
|
+
if (!row)
|
|
205
|
+
throw new StyleReferenceNotFoundError(styleId, referenceId);
|
|
206
|
+
return row;
|
|
207
|
+
}
|
|
208
|
+
incrementRevision(styleId, expectedRevision, updatedAt) {
|
|
209
|
+
const result = this.database.prepare(`UPDATE style_entries
|
|
210
|
+
SET revision = revision + 1, updated_at = ?
|
|
211
|
+
WHERE id = ? AND revision = ?`).run(updatedAt, styleId, expectedRevision);
|
|
212
|
+
if (result.changes === 0) {
|
|
213
|
+
const actualRevision = this.getStyle(styleId).revision;
|
|
214
|
+
throw new StyleRevisionConflictError(expectedRevision, actualRevision);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
filePath(relativePath) {
|
|
218
|
+
const filePath = resolve(this.artifactsRoot, relativePath);
|
|
219
|
+
if (filePath !== this.artifactsRoot
|
|
220
|
+
&& !filePath.startsWith(`${this.artifactsRoot}${sep}`)) {
|
|
221
|
+
throw new InvalidStyleReferenceError("Style reference path must stay inside the artifacts directory.");
|
|
222
|
+
}
|
|
223
|
+
return filePath;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
const STYLE_SELECT = `
|
|
227
|
+
SELECT id, name, category, creator_type, description, prompt_summary, revision, created_at, updated_at
|
|
228
|
+
FROM style_entries
|
|
229
|
+
`;
|
|
230
|
+
const REFERENCE_SELECT = `
|
|
231
|
+
SELECT id, style_id, relative_path, original_filename, mime_type,
|
|
232
|
+
byte_size, width, height, position, created_at
|
|
233
|
+
FROM style_reference_images
|
|
234
|
+
`;
|
|
235
|
+
async function inspectImage(data) {
|
|
236
|
+
const inspected = await inspectImageInput(data);
|
|
237
|
+
if ("error" in inspected) {
|
|
238
|
+
throw new InvalidStyleReferenceError(inspected.error === "size"
|
|
239
|
+
? `Reference images must be between 1 byte and ${MAX_IMAGE_ASSET_BYTES} bytes.`
|
|
240
|
+
: "Only valid PNG, JPEG, and WebP reference images are supported.");
|
|
241
|
+
}
|
|
242
|
+
return inspected.image;
|
|
243
|
+
}
|
|
244
|
+
function requiredText(value, label, maxLength) {
|
|
245
|
+
const trimmed = value.trim();
|
|
246
|
+
if (!trimmed)
|
|
247
|
+
throw new InvalidStyleError(`${label} cannot be empty`);
|
|
248
|
+
if (trimmed.length > maxLength) {
|
|
249
|
+
throw new InvalidStyleError(`${label} cannot exceed ${maxLength} characters`);
|
|
250
|
+
}
|
|
251
|
+
return trimmed;
|
|
252
|
+
}
|
|
253
|
+
function normalizedPromptSummary(value) {
|
|
254
|
+
return requiredText(value.replace(/\s+/gu, " "), "Style prompt summary", MAX_STYLE_PROMPT_SUMMARY_LENGTH);
|
|
255
|
+
}
|
|
256
|
+
function styleCategory(value) {
|
|
257
|
+
if (!STYLE_CATEGORIES.includes(value)) {
|
|
258
|
+
throw new InvalidStyleError(`Unsupported style category: ${value}`);
|
|
259
|
+
}
|
|
260
|
+
return value;
|
|
261
|
+
}
|
|
262
|
+
function styleCreatorType(value) {
|
|
263
|
+
if (!STYLE_CREATOR_TYPES.includes(value)) {
|
|
264
|
+
throw new InvalidStyleError(`Unsupported style creator type: ${value}`);
|
|
265
|
+
}
|
|
266
|
+
return value;
|
|
267
|
+
}
|
|
268
|
+
function assertRevision(expectedRevision, actualRevision) {
|
|
269
|
+
if (expectedRevision !== actualRevision) {
|
|
270
|
+
throw new StyleRevisionConflictError(expectedRevision, actualRevision);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
function safeFilename(filename) {
|
|
274
|
+
const value = basename(filename.trim()).slice(0, 255);
|
|
275
|
+
return value || "reference-image";
|
|
276
|
+
}
|
|
277
|
+
function mapReference(row) {
|
|
278
|
+
return {
|
|
279
|
+
id: row.id,
|
|
280
|
+
styleId: row.style_id,
|
|
281
|
+
originalFilename: row.original_filename,
|
|
282
|
+
mimeType: row.mime_type,
|
|
283
|
+
byteSize: row.byte_size,
|
|
284
|
+
width: row.width,
|
|
285
|
+
height: row.height,
|
|
286
|
+
position: row.position,
|
|
287
|
+
createdAt: row.created_at,
|
|
288
|
+
};
|
|
289
|
+
}
|
|
290
|
+
//# sourceMappingURL=style-library-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style-library-repository.js","sourceRoot":"","sources":["../../src/database/style-library-repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function isSelfContainedSvg(data: Buffer): boolean;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { SaxesParser } from "saxes";
|
|
2
|
+
const svgNamespace = "http://www.w3.org/2000/svg";
|
|
3
|
+
const elements = new Set([
|
|
4
|
+
"svg", "g", "defs", "title", "desc", "path", "rect", "circle", "ellipse",
|
|
5
|
+
"line", "polyline", "polygon", "text", "tspan", "textPath", "style",
|
|
6
|
+
"linearGradient", "radialGradient", "stop", "clipPath", "mask", "pattern",
|
|
7
|
+
"marker", "symbol", "use", "image", "filter", "feBlend", "feColorMatrix",
|
|
8
|
+
"feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting",
|
|
9
|
+
"feDisplacementMap", "feDistantLight", "feDropShadow", "feFlood", "feFuncA",
|
|
10
|
+
"feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feMerge", "feMergeNode",
|
|
11
|
+
"feMorphology", "feOffset", "fePointLight", "feSpecularLighting", "feSpotLight",
|
|
12
|
+
"feTile", "feTurbulence",
|
|
13
|
+
]);
|
|
14
|
+
// Image nodes accept portable static SVG, without executing or fetching content.
|
|
15
|
+
export function isSelfContainedSvg(data) {
|
|
16
|
+
try {
|
|
17
|
+
const source = new TextDecoder("utf-8", { fatal: true }).decode(data);
|
|
18
|
+
const parser = new SaxesParser({ xmlns: true });
|
|
19
|
+
let depth = 0;
|
|
20
|
+
let rootSeen = false;
|
|
21
|
+
let styleText = null;
|
|
22
|
+
const reject = () => { throw new Error("Invalid SVG image"); };
|
|
23
|
+
parser.on("doctype", reject);
|
|
24
|
+
parser.on("processinginstruction", reject);
|
|
25
|
+
parser.on("opentag", (tag) => {
|
|
26
|
+
if (tag.uri !== svgNamespace || !elements.has(tag.local))
|
|
27
|
+
reject();
|
|
28
|
+
if (depth === 0) {
|
|
29
|
+
if (tag.local !== "svg")
|
|
30
|
+
reject();
|
|
31
|
+
rootSeen = true;
|
|
32
|
+
}
|
|
33
|
+
depth += 1;
|
|
34
|
+
if (tag.local === "style")
|
|
35
|
+
styleText = "";
|
|
36
|
+
for (const attribute of Object.values(tag.attributes)) {
|
|
37
|
+
if (/^on/i.test(attribute.local)
|
|
38
|
+
|| (attribute.local === "base" && attribute.uri === "http://www.w3.org/XML/1998/namespace"))
|
|
39
|
+
reject();
|
|
40
|
+
if (attribute.local === "href") {
|
|
41
|
+
const value = attribute.value.trim();
|
|
42
|
+
const localReference = /^#[^\s]+$/.test(value);
|
|
43
|
+
const embeddedBitmap = tag.local === "image"
|
|
44
|
+
&& /^data:image\/(?:png|jpeg|webp);base64,[a-z\d+/=\s]+$/i.test(value);
|
|
45
|
+
if (!localReference && !embeddedBitmap)
|
|
46
|
+
reject();
|
|
47
|
+
}
|
|
48
|
+
if (["style", "fill", "stroke", "filter", "clip-path", "mask", "marker", "marker-start", "marker-mid", "marker-end", "cursor"].includes(attribute.local)
|
|
49
|
+
&& !hasLocalStyles(attribute.value))
|
|
50
|
+
reject();
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
const readText = (text) => { if (styleText !== null)
|
|
54
|
+
styleText += text; };
|
|
55
|
+
parser.on("text", readText);
|
|
56
|
+
parser.on("cdata", readText);
|
|
57
|
+
parser.on("closetag", (tag) => {
|
|
58
|
+
if (tag.local === "style") {
|
|
59
|
+
if (!hasLocalStyles(styleText ?? ""))
|
|
60
|
+
reject();
|
|
61
|
+
styleText = null;
|
|
62
|
+
}
|
|
63
|
+
depth -= 1;
|
|
64
|
+
});
|
|
65
|
+
parser.write(source).close();
|
|
66
|
+
return rootSeen;
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function hasLocalStyles(value) {
|
|
73
|
+
const css = value.replace(/\/\*[\s\S]*?\*\//g, "")
|
|
74
|
+
.replace(/url\(\s*(['"]?)#[\w:.-]+\1\s*\)/gi, "");
|
|
75
|
+
return !/[\\@]|url\s*\(|expression\s*\(/i.test(css);
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=svg-input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"svg-input.js","sourceRoot":"","sources":["../../src/database/svg-input.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { RestoreDraftVersionInput } from "../domain/session/index.ts";
|
|
2
|
+
import { type UiSketchDraftVersion } from "../domain/ui-sketch/index.ts";
|
|
3
|
+
import type { UiSketchDraft } from "../domain/ui-sketch/index.ts";
|
|
4
|
+
import type { CreateDraftVersionInput } from "../domain/session/index.ts";
|
|
5
|
+
import type { DatabaseConnection } from "./migrate.ts";
|
|
6
|
+
export { DraftRevisionConflictError as UiSketchDraftRevisionConflictError, DraftSessionTypeMismatchError as UiSketchSessionRequiredError, DraftVersionNotFoundError as UiSketchDraftVersionNotFoundError, } from "./draft-version-errors.ts";
|
|
7
|
+
export declare class UiSketchSessionRepository {
|
|
8
|
+
private readonly draftVersions;
|
|
9
|
+
constructor(database: DatabaseConnection);
|
|
10
|
+
listDraftVersions(sessionId: string): UiSketchDraftVersion[];
|
|
11
|
+
getDraftVersion(sessionId: string, revision: number): UiSketchDraftVersion;
|
|
12
|
+
getLatestDraftVersion(sessionId: string, knownRevision?: number): UiSketchDraftVersion | null;
|
|
13
|
+
createDraftVersion(sessionId: string, input: CreateDraftVersionInput): UiSketchDraftVersion;
|
|
14
|
+
restoreDraftVersion(sessionId: string, input: RestoreDraftVersionInput): import("../domain/session/draft-version.ts").DraftVersion<UiSketchDraft>;
|
|
15
|
+
undoDraftVersion(sessionId: string, input: {
|
|
16
|
+
changeRevision: number;
|
|
17
|
+
expectedLatestRevision: number;
|
|
18
|
+
}): UiSketchDraftVersion;
|
|
19
|
+
}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { uiSketchDraftFingerprint, validateUiSketchDraft, } from "../domain/ui-sketch/index.js";
|
|
2
|
+
import { DraftVersionStore } from "./draft-version-store.js";
|
|
3
|
+
export { DraftRevisionConflictError as UiSketchDraftRevisionConflictError, DraftSessionTypeMismatchError as UiSketchSessionRequiredError, DraftVersionNotFoundError as UiSketchDraftVersionNotFoundError, } from "./draft-version-errors.js";
|
|
4
|
+
export class UiSketchSessionRepository {
|
|
5
|
+
draftVersions;
|
|
6
|
+
constructor(database) {
|
|
7
|
+
this.draftVersions = new DraftVersionStore(database, {
|
|
8
|
+
table: "ui_sketch_draft_versions",
|
|
9
|
+
storesFingerprint: false,
|
|
10
|
+
sessionType: "ui-layout",
|
|
11
|
+
sessionLabel: "UI sketch session",
|
|
12
|
+
validateDraft: validateUiSketchDraft,
|
|
13
|
+
fingerprint: uiSketchDraftFingerprint,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
listDraftVersions(sessionId) {
|
|
17
|
+
return this.draftVersions.listDraftVersions(sessionId);
|
|
18
|
+
}
|
|
19
|
+
getDraftVersion(sessionId, revision) {
|
|
20
|
+
return this.draftVersions.getDraftVersion(sessionId, revision);
|
|
21
|
+
}
|
|
22
|
+
getLatestDraftVersion(sessionId, knownRevision) {
|
|
23
|
+
return this.draftVersions.getLatestDraftVersion(sessionId, knownRevision);
|
|
24
|
+
}
|
|
25
|
+
createDraftVersion(sessionId, input) {
|
|
26
|
+
return this.draftVersions.createDraftVersion(sessionId, input);
|
|
27
|
+
}
|
|
28
|
+
restoreDraftVersion(sessionId, input) {
|
|
29
|
+
return this.draftVersions.restoreDraftVersion(sessionId, input);
|
|
30
|
+
}
|
|
31
|
+
undoDraftVersion(sessionId, input) {
|
|
32
|
+
return this.draftVersions.undoDraftVersion(sessionId, input);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=ui-sketch-session-repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ui-sketch-session-repository.js","sourceRoot":"","sources":["../../src/database/ui-sketch-session-repository.ts"],"names":[],"mappings":"AACA,OAAO,EACL,wBAAwB,EACxB,qBAAqB,GAEtB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAI7D,OAAO,EACL,0BAA0B,IAAI,kCAAkC,EAChE,6BAA6B,IAAI,4BAA4B,EAC7D,yBAAyB,IAAI,iCAAiC,GAC/D,MAAM,2BAA2B,CAAC;AAEnC,MAAM,OAAO,yBAAyB;IACnB,aAAa,CAAmC;IAEjE,YAAY,QAA4B;QACtC,IAAI,CAAC,aAAa,GAAG,IAAI,iBAAiB,CAAgB,QAAQ,EAAE;YAClE,KAAK,EAAE,0BAA0B;YACjC,iBAAiB,EAAE,KAAK;YACxB,WAAW,EAAE,WAAW;YACxB,YAAY,EAAE,mBAAmB;YACjC,aAAa,EAAE,qBAAqB;YACpC,WAAW,EAAE,wBAAwB;SACtC,CAAC,CAAC;IACL,CAAC;IAED,iBAAiB,CAAC,SAAiB;QACjC,OAAO,IAAI,CAAC,aAAa,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;IACzD,CAAC;IAED,eAAe,CAAC,SAAiB,EAAE,QAAgB;QACjD,OAAO,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACjE,CAAC;IAED,qBAAqB,CAAC,SAAiB,EAAE,aAAsB;QAC7D,OAAO,IAAI,CAAC,aAAa,CAAC,qBAAqB,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IAC5E,CAAC;IAED,kBAAkB,CAChB,SAAiB,EACjB,KAA8B;QAE9B,OAAO,IAAI,CAAC,aAAa,CAAC,kBAAkB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACjE,CAAC;IAED,mBAAmB,CAAC,SAAiB,EAAE,KAA+B;QACpE,OAAO,IAAI,CAAC,aAAa,CAAC,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAClE,CAAC;IAED,gBAAgB,CACd,SAAiB,EACjB,KAAiE;QAEjE,OAAO,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC/D,CAAC;CACF"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export declare const CANVAS_LAYER_ACTIONS: readonly ["bringToFront", "bringForward", "sendBackward", "sendToBack"];
|
|
2
|
+
export type CanvasLayerAction = typeof CANVAS_LAYER_ACTIONS[number];
|
|
3
|
+
/** Back to front; legacy nodes keep their drawing order and new nodes follow saved nodes. */
|
|
4
|
+
export declare function resolveCanvasLayerOrder(ids: readonly string[], order?: readonly string[]): string[];
|
|
5
|
+
export declare function moveCanvasLayers(order: readonly string[], selectedIds: readonly string[], action: CanvasLayerAction): readonly string[];
|
|
6
|
+
export declare function sortCanvasLayers<T>(items: readonly T[], order: readonly string[] | undefined, id: (item: T) => string): T[];
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
export const CANVAS_LAYER_ACTIONS = ["bringToFront", "bringForward", "sendBackward", "sendToBack"];
|
|
2
|
+
/** Back to front; legacy nodes keep their drawing order and new nodes follow saved nodes. */
|
|
3
|
+
export function resolveCanvasLayerOrder(ids, order) {
|
|
4
|
+
const remaining = new Set(ids);
|
|
5
|
+
const result = [];
|
|
6
|
+
for (const id of order ?? []) {
|
|
7
|
+
if (remaining.delete(id))
|
|
8
|
+
result.push(id);
|
|
9
|
+
}
|
|
10
|
+
return [...result, ...remaining];
|
|
11
|
+
}
|
|
12
|
+
export function moveCanvasLayers(order, selectedIds, action) {
|
|
13
|
+
const selected = new Set(selectedIds);
|
|
14
|
+
let next = [...order];
|
|
15
|
+
if (action === "bringToFront" || action === "sendToBack") {
|
|
16
|
+
const moving = order.filter((id) => selected.has(id));
|
|
17
|
+
const staying = order.filter((id) => !selected.has(id));
|
|
18
|
+
next = action === "bringToFront" ? [...staying, ...moving] : [...moving, ...staying];
|
|
19
|
+
}
|
|
20
|
+
else if (action === "bringForward") {
|
|
21
|
+
for (let index = next.length - 2; index >= 0; index -= 1) {
|
|
22
|
+
if (selected.has(next[index]) && !selected.has(next[index + 1])) {
|
|
23
|
+
[next[index], next[index + 1]] = [next[index + 1], next[index]];
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
for (let index = 1; index < next.length; index += 1) {
|
|
29
|
+
if (selected.has(next[index]) && !selected.has(next[index - 1])) {
|
|
30
|
+
[next[index], next[index - 1]] = [next[index - 1], next[index]];
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return next.every((id, index) => id === order[index]) ? order : next;
|
|
35
|
+
}
|
|
36
|
+
export function sortCanvasLayers(items, order, id) {
|
|
37
|
+
const byId = new Map(items.map((item) => [id(item), item]));
|
|
38
|
+
return resolveCanvasLayerOrder([...byId.keys()], order).map((key) => byId.get(key));
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=canvas-layer-order.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-layer-order.js","sourceRoot":"","sources":["../../src/domain/canvas-layer-order.ts"],"names":[],"mappings":"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"}
|