@hyperframes/core 0.5.0-alpha.8 → 0.5.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/compiler/compositionScoping.d.ts +2 -2
- package/dist/compiler/compositionScoping.d.ts.map +1 -1
- package/dist/compiler/compositionScoping.js +69 -15
- package/dist/compiler/compositionScoping.js.map +1 -1
- package/dist/compiler/htmlBundler.d.ts +16 -0
- package/dist/compiler/htmlBundler.d.ts.map +1 -1
- package/dist/compiler/htmlBundler.js +96 -71
- package/dist/compiler/htmlBundler.js.map +1 -1
- package/dist/compiler/htmlCompiler.d.ts.map +1 -1
- package/dist/compiler/htmlCompiler.js +2 -2
- package/dist/compiler/htmlCompiler.js.map +1 -1
- package/dist/compiler/htmlDocument.d.ts +10 -0
- package/dist/compiler/htmlDocument.d.ts.map +1 -0
- package/dist/compiler/htmlDocument.js +181 -0
- package/dist/compiler/htmlDocument.js.map +1 -0
- package/dist/compiler/index.d.ts +2 -1
- package/dist/compiler/index.d.ts.map +1 -1
- package/dist/compiler/index.js +2 -1
- package/dist/compiler/index.js.map +1 -1
- package/dist/compiler/rewriteSubCompPaths.d.ts +0 -4
- package/dist/compiler/rewriteSubCompPaths.d.ts.map +1 -1
- package/dist/compiler/rewriteSubCompPaths.js +0 -17
- package/dist/compiler/rewriteSubCompPaths.js.map +1 -1
- package/dist/compiler/timingCompiler.d.ts +2 -1
- package/dist/compiler/timingCompiler.d.ts.map +1 -1
- package/dist/compiler/timingCompiler.js +10 -3
- package/dist/compiler/timingCompiler.js.map +1 -1
- package/dist/core.types.d.ts +7 -0
- package/dist/core.types.d.ts.map +1 -1
- package/dist/core.types.js +13 -0
- package/dist/core.types.js.map +1 -1
- package/dist/generated/runtime-inline.js +1 -1
- package/dist/generated/runtime-inline.js.map +1 -1
- package/dist/hyperframe.manifest.json +1 -1
- package/dist/hyperframe.runtime.iife.js +82 -32
- package/dist/hyperframe.runtime.mjs +82 -32
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -2
- package/dist/index.js.map +1 -1
- package/dist/lint/context.d.ts.map +1 -1
- package/dist/lint/context.js +9 -1
- package/dist/lint/context.js.map +1 -1
- package/dist/lint/rules/captions.d.ts.map +1 -1
- package/dist/lint/rules/captions.js +1 -2
- package/dist/lint/rules/captions.js.map +1 -1
- package/dist/lint/rules/composition.d.ts.map +1 -1
- package/dist/lint/rules/composition.js +131 -4
- package/dist/lint/rules/composition.js.map +1 -1
- package/dist/lint/rules/core.d.ts.map +1 -1
- package/dist/lint/rules/core.js +101 -0
- package/dist/lint/rules/core.js.map +1 -1
- package/dist/lint/rules/gsap.d.ts.map +1 -1
- package/dist/lint/rules/gsap.js +59 -1
- package/dist/lint/rules/gsap.js.map +1 -1
- package/dist/lint/rules/media.d.ts.map +1 -1
- package/dist/lint/rules/media.js +38 -0
- package/dist/lint/rules/media.js.map +1 -1
- package/dist/lint/types.d.ts +4 -0
- package/dist/lint/types.d.ts.map +1 -1
- package/dist/lint/utils.d.ts +20 -0
- package/dist/lint/utils.d.ts.map +1 -1
- package/dist/lint/utils.js +46 -3
- package/dist/lint/utils.js.map +1 -1
- package/dist/registry/types.d.ts +4 -0
- package/dist/registry/types.d.ts.map +1 -1
- package/dist/registry/types.js.map +1 -1
- package/dist/runtime/getVariables.d.ts +30 -0
- package/dist/runtime/getVariables.d.ts.map +1 -0
- package/dist/runtime/getVariables.js +69 -0
- package/dist/runtime/getVariables.js.map +1 -0
- package/dist/runtime/validateVariables.d.ts +25 -0
- package/dist/runtime/validateVariables.d.ts.map +1 -0
- package/dist/runtime/validateVariables.js +92 -0
- package/dist/runtime/validateVariables.js.map +1 -0
- package/dist/studio-api/createStudioApi.d.ts.map +1 -1
- package/dist/studio-api/createStudioApi.js +0 -2
- package/dist/studio-api/createStudioApi.js.map +1 -1
- package/dist/studio-api/helpers/projectSignature.d.ts +2 -0
- package/dist/studio-api/helpers/projectSignature.d.ts.map +1 -0
- package/dist/studio-api/helpers/projectSignature.js +122 -0
- package/dist/studio-api/helpers/projectSignature.js.map +1 -0
- package/dist/studio-api/helpers/screenshotClip.d.ts +8 -0
- package/dist/studio-api/helpers/screenshotClip.d.ts.map +1 -0
- package/dist/studio-api/helpers/screenshotClip.js +20 -0
- package/dist/studio-api/helpers/screenshotClip.js.map +1 -0
- package/dist/studio-api/helpers/subComposition.d.ts.map +1 -1
- package/dist/studio-api/helpers/subComposition.js +1 -4
- package/dist/studio-api/helpers/subComposition.js.map +1 -1
- package/dist/studio-api/index.d.ts +2 -0
- package/dist/studio-api/index.d.ts.map +1 -1
- package/dist/studio-api/index.js +2 -0
- package/dist/studio-api/index.js.map +1 -1
- package/dist/studio-api/routes/preview.d.ts.map +1 -1
- package/dist/studio-api/routes/preview.js +19 -3
- package/dist/studio-api/routes/preview.js.map +1 -1
- package/dist/studio-api/routes/projects.js +1 -1
- package/dist/studio-api/routes/projects.js.map +1 -1
- package/dist/studio-api/routes/render.d.ts.map +1 -1
- package/dist/studio-api/routes/render.js +21 -37
- package/dist/studio-api/routes/render.js.map +1 -1
- package/dist/studio-api/routes/thumbnail.d.ts.map +1 -1
- package/dist/studio-api/routes/thumbnail.js +11 -15
- package/dist/studio-api/routes/thumbnail.js.map +1 -1
- package/dist/studio-api/types.d.ts +3 -1
- package/dist/studio-api/types.d.ts.map +1 -1
- package/package.json +9 -1
- package/schemas/registry-item.json +8 -0
- package/dist/studio-api/routes/fonts.d.ts +0 -3
- package/dist/studio-api/routes/fonts.d.ts.map +0 -1
- package/dist/studio-api/routes/fonts.js +0 -239
- package/dist/studio-api/routes/fonts.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getVariables.js","sourceRoot":"","sources":["../../src/runtime/getVariables.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,YAAY;IAG1B,IAAI,OAAO,QAAQ,KAAK,WAAW;QAAE,OAAO,EAAgB,CAAC;IAE7D,MAAM,gBAAgB,GAAG,oBAAoB,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;IACxE,MAAM,SAAS,GAAG,aAAa,EAAE,CAAC;IAElC,OAAO,EAAE,GAAG,gBAAgB,EAAE,GAAG,SAAS,EAAgB,CAAC;AAC7D,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAoB;IACvD,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IACrB,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,4BAA4B,CAAC,CAAC;IAC5D,IAAI,CAAC,GAAG;QAAE,OAAO,EAAE,CAAC;IAEpB,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,EAAE,CAAC;IAEtC,MAAM,GAAG,GAA4B,EAAE,CAAC;IACxC,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,SAAS;QAClD,MAAM,CAAC,GAAG,KAAgC,CAAC;QAC3C,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC;YAAE,SAAS;QAC5D,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;IACxB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa;IACpB,IAAI,OAAO,MAAM,KAAK,WAAW;QAAE,OAAO,EAAE,CAAC;IAC7C,MAAM,GAAG,GAAI,MAA+C,CAAC,aAAa,CAAC;IAC3E,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,EAAE,CAAC;IACrE,OAAO,GAA8B,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { CompositionVariable } from "../core.types";
|
|
2
|
+
export type VariableValidationIssue = {
|
|
3
|
+
kind: "undeclared";
|
|
4
|
+
variableId: string;
|
|
5
|
+
} | {
|
|
6
|
+
kind: "type-mismatch";
|
|
7
|
+
variableId: string;
|
|
8
|
+
expected: string;
|
|
9
|
+
actual: string;
|
|
10
|
+
} | {
|
|
11
|
+
kind: "enum-out-of-range";
|
|
12
|
+
variableId: string;
|
|
13
|
+
allowed: string[];
|
|
14
|
+
actual: string;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Compare a flat values map (from `--variables` / `data-variable-values`) to
|
|
18
|
+
* the declared schema (`data-composition-variables`). Returns issues for keys
|
|
19
|
+
* that aren't declared, plus per-key type mismatches against the declared
|
|
20
|
+
* type. Pure / sync — caller decides how to surface them (warning vs render
|
|
21
|
+
* failure under `--strict-variables`).
|
|
22
|
+
*/
|
|
23
|
+
export declare function validateVariables(values: Record<string, unknown>, declarations: readonly CompositionVariable[]): VariableValidationIssue[];
|
|
24
|
+
export declare function formatVariableValidationIssue(issue: VariableValidationIssue): string;
|
|
25
|
+
//# sourceMappingURL=validateVariables.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateVariables.d.ts","sourceRoot":"","sources":["../../src/runtime/validateVariables.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEzD,MAAM,MAAM,uBAAuB,GAC/B;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC1C;IAAE,IAAI,EAAE,eAAe,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAC/E;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzF;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,YAAY,EAAE,SAAS,mBAAmB,EAAE,GAC3C,uBAAuB,EAAE,CAe3B;AA2DD,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,uBAAuB,GAAG,MAAM,CASpF"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Compare a flat values map (from `--variables` / `data-variable-values`) to
|
|
3
|
+
* the declared schema (`data-composition-variables`). Returns issues for keys
|
|
4
|
+
* that aren't declared, plus per-key type mismatches against the declared
|
|
5
|
+
* type. Pure / sync — caller decides how to surface them (warning vs render
|
|
6
|
+
* failure under `--strict-variables`).
|
|
7
|
+
*/
|
|
8
|
+
export function validateVariables(values, declarations) {
|
|
9
|
+
const decls = new Map();
|
|
10
|
+
for (const decl of declarations)
|
|
11
|
+
decls.set(decl.id, decl);
|
|
12
|
+
const issues = [];
|
|
13
|
+
for (const [id, value] of Object.entries(values)) {
|
|
14
|
+
const decl = decls.get(id);
|
|
15
|
+
if (!decl) {
|
|
16
|
+
issues.push({ kind: "undeclared", variableId: id });
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
const mismatch = checkType(value, decl);
|
|
20
|
+
if (mismatch)
|
|
21
|
+
issues.push(mismatch);
|
|
22
|
+
}
|
|
23
|
+
return issues;
|
|
24
|
+
}
|
|
25
|
+
function checkType(value, decl) {
|
|
26
|
+
switch (decl.type) {
|
|
27
|
+
case "string":
|
|
28
|
+
case "color":
|
|
29
|
+
if (typeof value !== "string") {
|
|
30
|
+
return {
|
|
31
|
+
kind: "type-mismatch",
|
|
32
|
+
variableId: decl.id,
|
|
33
|
+
expected: decl.type,
|
|
34
|
+
actual: jsTypeOf(value),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
return null;
|
|
38
|
+
case "number":
|
|
39
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
40
|
+
return {
|
|
41
|
+
kind: "type-mismatch",
|
|
42
|
+
variableId: decl.id,
|
|
43
|
+
expected: "number",
|
|
44
|
+
actual: jsTypeOf(value),
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
return null;
|
|
48
|
+
case "boolean":
|
|
49
|
+
if (typeof value !== "boolean") {
|
|
50
|
+
return {
|
|
51
|
+
kind: "type-mismatch",
|
|
52
|
+
variableId: decl.id,
|
|
53
|
+
expected: "boolean",
|
|
54
|
+
actual: jsTypeOf(value),
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
return null;
|
|
58
|
+
case "enum": {
|
|
59
|
+
if (typeof value !== "string") {
|
|
60
|
+
return {
|
|
61
|
+
kind: "type-mismatch",
|
|
62
|
+
variableId: decl.id,
|
|
63
|
+
expected: "enum (string)",
|
|
64
|
+
actual: jsTypeOf(value),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
const allowed = decl.options.map((o) => o.value);
|
|
68
|
+
if (!allowed.includes(value)) {
|
|
69
|
+
return { kind: "enum-out-of-range", variableId: decl.id, allowed, actual: value };
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function jsTypeOf(value) {
|
|
76
|
+
if (value === null)
|
|
77
|
+
return "null";
|
|
78
|
+
if (Array.isArray(value))
|
|
79
|
+
return "array";
|
|
80
|
+
return typeof value;
|
|
81
|
+
}
|
|
82
|
+
export function formatVariableValidationIssue(issue) {
|
|
83
|
+
switch (issue.kind) {
|
|
84
|
+
case "undeclared":
|
|
85
|
+
return `Variable "${issue.variableId}" is not declared in data-composition-variables.`;
|
|
86
|
+
case "type-mismatch":
|
|
87
|
+
return `Variable "${issue.variableId}" expected ${issue.expected}, got ${issue.actual}.`;
|
|
88
|
+
case "enum-out-of-range":
|
|
89
|
+
return `Variable "${issue.variableId}" must be one of ${issue.allowed.map((v) => `"${v}"`).join(", ")} (got "${issue.actual}").`;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=validateVariables.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validateVariables.js","sourceRoot":"","sources":["../../src/runtime/validateVariables.ts"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB,CAC/B,MAA+B,EAC/B,YAA4C;IAE5C,MAAM,KAAK,GAAG,IAAI,GAAG,EAA+B,CAAC;IACrD,KAAK,MAAM,IAAI,IAAI,YAAY;QAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAE1D,MAAM,MAAM,GAA8B,EAAE,CAAC;IAC7C,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC3B,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,CAAC;YACpD,SAAS;QACX,CAAC;QACD,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QACxC,IAAI,QAAQ;YAAE,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,SAAS,CAAC,KAAc,EAAE,IAAyB;IAC1D,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;QAClB,KAAK,QAAQ,CAAC;QACd,KAAK,OAAO;YACV,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,OAAO;oBACL,IAAI,EAAE,eAAe;oBACrB,UAAU,EAAE,IAAI,CAAC,EAAE;oBACnB,QAAQ,EAAE,IAAI,CAAC,IAAI;oBACnB,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC;iBACxB,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC;QACd,KAAK,QAAQ;YACX,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBACzD,OAAO;oBACL,IAAI,EAAE,eAAe;oBACrB,UAAU,EAAE,IAAI,CAAC,EAAE;oBACnB,QAAQ,EAAE,QAAQ;oBAClB,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC;iBACxB,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC;QACd,KAAK,SAAS;YACZ,IAAI,OAAO,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC/B,OAAO;oBACL,IAAI,EAAE,eAAe;oBACrB,UAAU,EAAE,IAAI,CAAC,EAAE;oBACnB,QAAQ,EAAE,SAAS;oBACnB,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC;iBACxB,CAAC;YACJ,CAAC;YACD,OAAO,IAAI,CAAC;QACd,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBAC9B,OAAO;oBACL,IAAI,EAAE,eAAe;oBACrB,UAAU,EAAE,IAAI,CAAC,EAAE;oBACnB,QAAQ,EAAE,eAAe;oBACzB,MAAM,EAAE,QAAQ,CAAC,KAAK,CAAC;iBACxB,CAAC;YACJ,CAAC;YACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;YACjD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7B,OAAO,EAAE,IAAI,EAAE,mBAAmB,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;YACpF,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IACzC,OAAO,OAAO,KAAK,CAAC;AACtB,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,KAA8B;IAC1E,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,YAAY;YACf,OAAO,aAAa,KAAK,CAAC,UAAU,kDAAkD,CAAC;QACzF,KAAK,eAAe;YAClB,OAAO,aAAa,KAAK,CAAC,UAAU,cAAc,KAAK,CAAC,QAAQ,SAAS,KAAK,CAAC,MAAM,GAAG,CAAC;QAC3F,KAAK,mBAAmB;YACtB,OAAO,aAAa,KAAK,CAAC,UAAU,oBAAoB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,MAAM,KAAK,CAAC;IACrI,CAAC;AACH,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createStudioApi.d.ts","sourceRoot":"","sources":["../../src/studio-api/createStudioApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"createStudioApi.d.ts","sourceRoot":"","sources":["../../src/studio-api/createStudioApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AASnD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAY/D"}
|
|
@@ -6,7 +6,6 @@ import { registerLintRoutes } from "./routes/lint.js";
|
|
|
6
6
|
import { registerRenderRoutes } from "./routes/render.js";
|
|
7
7
|
import { registerThumbnailRoutes } from "./routes/thumbnail.js";
|
|
8
8
|
import { registerWaveformRoutes } from "./routes/waveform.js";
|
|
9
|
-
import { registerFontRoutes } from "./routes/fonts.js";
|
|
10
9
|
/**
|
|
11
10
|
* Create a Hono sub-app with all studio API routes.
|
|
12
11
|
*
|
|
@@ -22,7 +21,6 @@ export function createStudioApi(adapter) {
|
|
|
22
21
|
registerRenderRoutes(api, adapter);
|
|
23
22
|
registerThumbnailRoutes(api, adapter);
|
|
24
23
|
registerWaveformRoutes(api, adapter);
|
|
25
|
-
registerFontRoutes(api);
|
|
26
24
|
return api;
|
|
27
25
|
}
|
|
28
26
|
//# sourceMappingURL=createStudioApi.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"createStudioApi.js","sourceRoot":"","sources":["../../src/studio-api/createStudioApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"createStudioApi.js","sourceRoot":"","sources":["../../src/studio-api/createStudioApi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAE9D;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,OAAyB;IACvD,MAAM,GAAG,GAAG,IAAI,IAAI,EAAE,CAAC;IAEvB,qBAAqB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACpC,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACjC,qBAAqB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACpC,kBAAkB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACjC,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACnC,uBAAuB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IACtC,sBAAsB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAErC,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectSignature.d.ts","sourceRoot":"","sources":["../../../src/studio-api/helpers/projectSignature.ts"],"names":[],"mappings":"AA8GA,wBAAgB,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CA+BjE"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { lstatSync, readFileSync, readdirSync } from "node:fs";
|
|
3
|
+
import { extname, isAbsolute, relative, resolve } from "node:path";
|
|
4
|
+
const SIGNATURE_TEXT_EXTENSIONS = new Set([
|
|
5
|
+
".cjs",
|
|
6
|
+
".css",
|
|
7
|
+
".html",
|
|
8
|
+
".js",
|
|
9
|
+
".json",
|
|
10
|
+
".jsx",
|
|
11
|
+
".mjs",
|
|
12
|
+
".svg",
|
|
13
|
+
".ts",
|
|
14
|
+
".tsx",
|
|
15
|
+
]);
|
|
16
|
+
const SIGNATURE_EXCLUDED_DIRS = new Set([
|
|
17
|
+
".cache",
|
|
18
|
+
".git",
|
|
19
|
+
".hyperframes",
|
|
20
|
+
".next",
|
|
21
|
+
".vite",
|
|
22
|
+
"build",
|
|
23
|
+
"coverage",
|
|
24
|
+
"dist",
|
|
25
|
+
"node_modules",
|
|
26
|
+
"outputs",
|
|
27
|
+
"renders",
|
|
28
|
+
]);
|
|
29
|
+
const MAX_SIGNATURE_TEXT_BYTES = 2_000_000;
|
|
30
|
+
const projectSignatureCache = new Map();
|
|
31
|
+
function isPathWithin(parentDir, childPath) {
|
|
32
|
+
const childRelativePath = relative(parentDir, childPath);
|
|
33
|
+
return (childRelativePath === "" ||
|
|
34
|
+
(!childRelativePath.startsWith("..") && !isAbsolute(childRelativePath)));
|
|
35
|
+
}
|
|
36
|
+
function isTextContentEligible(file, size) {
|
|
37
|
+
return (SIGNATURE_TEXT_EXTENSIONS.has(extname(file).toLowerCase()) && size <= MAX_SIGNATURE_TEXT_BYTES);
|
|
38
|
+
}
|
|
39
|
+
function collectProjectSignatureFiles(projectDir, dir, files) {
|
|
40
|
+
let entries;
|
|
41
|
+
try {
|
|
42
|
+
entries = readdirSync(dir).sort();
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
for (const entry of entries) {
|
|
48
|
+
if (SIGNATURE_EXCLUDED_DIRS.has(entry))
|
|
49
|
+
continue;
|
|
50
|
+
const file = resolve(dir, entry);
|
|
51
|
+
if (!isPathWithin(projectDir, file))
|
|
52
|
+
continue;
|
|
53
|
+
let stat;
|
|
54
|
+
try {
|
|
55
|
+
stat = lstatSync(file);
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (stat.isSymbolicLink())
|
|
61
|
+
continue;
|
|
62
|
+
if (stat.isDirectory()) {
|
|
63
|
+
collectProjectSignatureFiles(projectDir, file, files);
|
|
64
|
+
}
|
|
65
|
+
else if (stat.isFile()) {
|
|
66
|
+
files.push({
|
|
67
|
+
file,
|
|
68
|
+
mtimeMs: stat.mtimeMs,
|
|
69
|
+
size: stat.size,
|
|
70
|
+
textContentEligible: isTextContentEligible(file, stat.size),
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function createProjectFingerprint(projectDir, files) {
|
|
76
|
+
const hash = createHash("sha256");
|
|
77
|
+
for (const entry of files) {
|
|
78
|
+
hash.update(relative(projectDir, entry.file));
|
|
79
|
+
hash.update("\0");
|
|
80
|
+
hash.update(String(entry.size));
|
|
81
|
+
hash.update("\0");
|
|
82
|
+
hash.update(String(entry.mtimeMs));
|
|
83
|
+
hash.update("\0");
|
|
84
|
+
hash.update(entry.textContentEligible ? "text" : "binary");
|
|
85
|
+
hash.update("\0");
|
|
86
|
+
}
|
|
87
|
+
return hash.digest("hex").slice(0, 24);
|
|
88
|
+
}
|
|
89
|
+
export function createProjectSignature(projectDir) {
|
|
90
|
+
const normalizedProjectDir = resolve(projectDir);
|
|
91
|
+
const files = [];
|
|
92
|
+
collectProjectSignatureFiles(normalizedProjectDir, normalizedProjectDir, files);
|
|
93
|
+
files.sort((a, b) => a.file.localeCompare(b.file));
|
|
94
|
+
const fingerprint = createProjectFingerprint(normalizedProjectDir, files);
|
|
95
|
+
const cached = projectSignatureCache.get(normalizedProjectDir);
|
|
96
|
+
if (cached?.fingerprint === fingerprint)
|
|
97
|
+
return cached.signature;
|
|
98
|
+
const hash = createHash("sha256");
|
|
99
|
+
for (const entry of files) {
|
|
100
|
+
const relativePath = relative(normalizedProjectDir, entry.file);
|
|
101
|
+
hash.update(relativePath);
|
|
102
|
+
hash.update("\0");
|
|
103
|
+
hash.update(String(entry.size));
|
|
104
|
+
hash.update("\0");
|
|
105
|
+
if (entry.textContentEligible) {
|
|
106
|
+
try {
|
|
107
|
+
hash.update(readFileSync(entry.file));
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
hash.update(String(entry.mtimeMs));
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
hash.update(String(entry.mtimeMs));
|
|
115
|
+
}
|
|
116
|
+
hash.update("\0");
|
|
117
|
+
}
|
|
118
|
+
const signature = hash.digest("hex").slice(0, 24);
|
|
119
|
+
projectSignatureCache.set(normalizedProjectDir, { fingerprint, signature });
|
|
120
|
+
return signature;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=projectSignature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectSignature.js","sourceRoot":"","sources":["../../../src/studio-api/helpers/projectSignature.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenshotClip.d.ts","sourceRoot":"","sources":["../../../src/studio-api/helpers/screenshotClip.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,CAAC,EAAE,MAAM,CAAC;IACV,CAAC,EAAE,MAAM,CAAC;IACV,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,MAAM,GAAG,cAAc,GAAG,SAAS,CAgBrF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export function getElementScreenshotClip(selector) {
|
|
2
|
+
const el = document.querySelector(selector);
|
|
3
|
+
if (!(el instanceof HTMLElement))
|
|
4
|
+
return undefined;
|
|
5
|
+
const rect = el.getBoundingClientRect();
|
|
6
|
+
if (rect.width < 4 || rect.height < 4)
|
|
7
|
+
return undefined;
|
|
8
|
+
const pad = 8;
|
|
9
|
+
const x = Math.max(0, rect.left - pad);
|
|
10
|
+
const y = Math.max(0, rect.top - pad);
|
|
11
|
+
const maxWidth = window.innerWidth - x;
|
|
12
|
+
const maxHeight = window.innerHeight - y;
|
|
13
|
+
return {
|
|
14
|
+
x,
|
|
15
|
+
y,
|
|
16
|
+
width: Math.max(1, Math.min(rect.width + pad * 2, maxWidth)),
|
|
17
|
+
height: Math.max(1, Math.min(rect.height + pad * 2, maxHeight)),
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=screenshotClip.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"screenshotClip.js","sourceRoot":"","sources":["../../../src/studio-api/helpers/screenshotClip.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,wBAAwB,CAAC,QAAgB;IACvD,MAAM,EAAE,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,CAAC,EAAE,YAAY,WAAW,CAAC;QAAE,OAAO,SAAS,CAAC;IACnD,MAAM,IAAI,GAAG,EAAE,CAAC,qBAAqB,EAAE,CAAC;IACxC,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IACxD,MAAM,GAAG,GAAG,CAAC,CAAC;IACd,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,CAAC;IACvC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,MAAM,CAAC,UAAU,GAAG,CAAC,CAAC;IACvC,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC;IACzC,OAAO;QACL,CAAC;QACD,CAAC;QACD,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,GAAG,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC5D,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;KAChE,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subComposition.d.ts","sourceRoot":"","sources":["../../../src/studio-api/helpers/subComposition.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"subComposition.d.ts","sourceRoot":"","sources":["../../../src/studio-api/helpers/subComposition.ts"],"names":[],"mappings":"AAKA;;;;;;GAMG;AACH,wBAAgB,uBAAuB,CACrC,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,MAAM,GAChB,MAAM,GAAG,IAAI,CAiEf"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from "node:fs";
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { parseHTML } from "linkedom";
|
|
4
|
-
import { rewriteAssetPaths, rewriteCssAssetUrls
|
|
4
|
+
import { rewriteAssetPaths, rewriteCssAssetUrls } from "../../compiler/rewriteSubCompPaths.js";
|
|
5
5
|
/**
|
|
6
6
|
* Build a standalone HTML page for a sub-composition.
|
|
7
7
|
*
|
|
@@ -21,9 +21,6 @@ export function buildSubCompositionHtml(projectDir, compPath, runtimeUrl, baseHr
|
|
|
21
21
|
rewriteAssetPaths(contentDoc.querySelectorAll("[src], [href]"), compPath, (el, attr) => el.getAttribute(attr), (el, attr, value) => {
|
|
22
22
|
el.setAttribute(attr, value);
|
|
23
23
|
});
|
|
24
|
-
rewriteInlineStyleAssetUrls(contentDoc.querySelectorAll("[style]"), compPath, (el) => el.getAttribute("style"), (el, value) => {
|
|
25
|
-
el.setAttribute("style", value);
|
|
26
|
-
});
|
|
27
24
|
for (const styleEl of contentDoc.querySelectorAll("style")) {
|
|
28
25
|
styleEl.textContent = rewriteCssAssetUrls(styleEl.textContent || "", compPath);
|
|
29
26
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subComposition.js","sourceRoot":"","sources":["../../../src/studio-api/helpers/subComposition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,
|
|
1
|
+
{"version":3,"file":"subComposition.js","sourceRoot":"","sources":["../../../src/studio-api/helpers/subComposition.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,uCAAuC,CAAC;AAE/F;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB,CACrC,UAAkB,EAClB,QAAgB,EAChB,UAAkB,EAClB,QAAiB;IAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvC,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IAEhD,8EAA8E;IAC9E,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC7E,MAAM,OAAO,GAAG,aAAa,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;IAC9C,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,SAAS,CACxC,2CAA2C,OAAO,gBAAgB,CACnE,CAAC;IAEF,iBAAiB,CACf,UAAU,CAAC,gBAAgB,CAAC,eAAe,CAAC,EAC5C,QAAQ,EACR,CAAC,EAAW,EAAE,IAAY,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EACpD,CAAC,EAAW,EAAE,IAAY,EAAE,KAAa,EAAE,EAAE;QAC3C,EAAE,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC,CACF,CAAC;IACF,KAAK,MAAM,OAAO,IAAI,UAAU,CAAC,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3D,OAAO,CAAC,WAAW,GAAG,mBAAmB,CAAC,OAAO,CAAC,WAAW,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,gBAAgB,GAAG,UAAU,CAAC,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC;IAE9D,mEAAmE;IACnE,MAAM,SAAS,GAAG,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;IACjD,IAAI,WAAW,GAAG,EAAE,CAAC;IAErB,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,SAAS,GAAG,SAAS,CAAC,KAAK,CAAC,gCAAgC,CAAC,CAAC;QACpE,WAAW,GAAG,SAAS,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,CAAC;IAED,kEAAkE;IAClE,IAAI,QAAQ,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC/C,WAAW,GAAG,eAAe,QAAQ,OAAO,WAAW,EAAE,CAAC;IAC5D,CAAC;IAED,sEAAsE;IACtE,IACE,CAAC,WAAW,CAAC,QAAQ,CAAC,oBAAoB,CAAC;QAC3C,CAAC,WAAW,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EACpD,CAAC;QACD,WAAW,IAAI,uDAAuD,UAAU,aAAa,CAAC;IAChG,CAAC;IAED,8DAA8D;IAC9D,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAClC,WAAW,IAAI,gFAAgF,CAAC;IAClG,CAAC;IAED,OAAO;;;EAGP,WAAW;;;;EAIX,gBAAgB;;QAEV,CAAC;AACT,CAAC"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export { createStudioApi } from "./createStudioApi.js";
|
|
2
|
+
export { createProjectSignature } from "./helpers/projectSignature.js";
|
|
2
3
|
export type { StudioApiAdapter, ResolvedProject, RenderJobState, LintResult } from "./types.js";
|
|
3
4
|
export { isSafePath, walkDir } from "./helpers/safePath.js";
|
|
4
5
|
export { getMimeType, MIME_TYPES } from "./helpers/mime.js";
|
|
5
6
|
export { buildSubCompositionHtml } from "./helpers/subComposition.js";
|
|
7
|
+
export { getElementScreenshotClip, type ScreenshotClip } from "./helpers/screenshotClip.js";
|
|
6
8
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/studio-api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAChG,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/studio-api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAChG,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,KAAK,cAAc,EAAE,MAAM,6BAA6B,CAAC"}
|
package/dist/studio-api/index.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export { createStudioApi } from "./createStudioApi.js";
|
|
2
|
+
export { createProjectSignature } from "./helpers/projectSignature.js";
|
|
2
3
|
export { isSafePath, walkDir } from "./helpers/safePath.js";
|
|
3
4
|
export { getMimeType, MIME_TYPES } from "./helpers/mime.js";
|
|
4
5
|
export { buildSubCompositionHtml } from "./helpers/subComposition.js";
|
|
6
|
+
export { getElementScreenshotClip } from "./helpers/screenshotClip.js";
|
|
5
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/studio-api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/studio-api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAEvE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAuB,MAAM,6BAA6B,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../../src/studio-api/routes/preview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAGjC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"preview.d.ts","sourceRoot":"","sources":["../../../src/studio-api/routes/preview.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAGjC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAwBpD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAmHhF"}
|
|
@@ -3,6 +3,20 @@ import { resolve } from "node:path";
|
|
|
3
3
|
import { isSafePath } from "../helpers/safePath.js";
|
|
4
4
|
import { getMimeType } from "../helpers/mime.js";
|
|
5
5
|
import { buildSubCompositionHtml } from "../helpers/subComposition.js";
|
|
6
|
+
import { createProjectSignature } from "../helpers/projectSignature.js";
|
|
7
|
+
const PROJECT_SIGNATURE_META = "hyperframes-project-signature";
|
|
8
|
+
function resolveProjectSignature(adapter, projectDir) {
|
|
9
|
+
return adapter.getProjectSignature?.(projectDir) ?? createProjectSignature(projectDir);
|
|
10
|
+
}
|
|
11
|
+
function injectProjectSignature(html, signature) {
|
|
12
|
+
const tag = `<meta name="${PROJECT_SIGNATURE_META}" content="${signature}">`;
|
|
13
|
+
if (html.includes(`name="${PROJECT_SIGNATURE_META}"`)) {
|
|
14
|
+
return html.replace(new RegExp(`<meta\\s+name=["']${PROJECT_SIGNATURE_META}["'][^>]*>`, "i"), tag);
|
|
15
|
+
}
|
|
16
|
+
if (html.includes("</head>"))
|
|
17
|
+
return html.replace("</head>", `${tag}\n</head>`);
|
|
18
|
+
return `${tag}\n${html}`;
|
|
19
|
+
}
|
|
6
20
|
export function registerPreviewRoutes(api, adapter) {
|
|
7
21
|
// Bundled composition preview
|
|
8
22
|
api.get("/projects/:id/preview", async (c) => {
|
|
@@ -30,12 +44,14 @@ export function registerPreviewRoutes(api, adapter) {
|
|
|
30
44
|
if (!bundled.includes("<base")) {
|
|
31
45
|
bundled = bundled.replace(/<head>/i, `<head><base href="${baseHref}">`);
|
|
32
46
|
}
|
|
47
|
+
bundled = injectProjectSignature(bundled, resolveProjectSignature(adapter, project.dir));
|
|
33
48
|
return c.html(bundled);
|
|
34
49
|
}
|
|
35
50
|
catch {
|
|
36
51
|
const file = resolve(project.dir, "index.html");
|
|
37
|
-
if (existsSync(file))
|
|
38
|
-
return c.html(readFileSync(file, "utf-8"));
|
|
52
|
+
if (existsSync(file)) {
|
|
53
|
+
return c.html(injectProjectSignature(readFileSync(file, "utf-8"), resolveProjectSignature(adapter, project.dir)));
|
|
54
|
+
}
|
|
39
55
|
return c.text("not found", 404);
|
|
40
56
|
}
|
|
41
57
|
});
|
|
@@ -55,7 +71,7 @@ export function registerPreviewRoutes(api, adapter) {
|
|
|
55
71
|
const html = buildSubCompositionHtml(project.dir, compPath, adapter.runtimeUrl, baseHref);
|
|
56
72
|
if (!html)
|
|
57
73
|
return c.text("not found", 404);
|
|
58
|
-
return c.html(html);
|
|
74
|
+
return c.html(injectProjectSignature(html, resolveProjectSignature(adapter, project.dir)));
|
|
59
75
|
});
|
|
60
76
|
// Static asset serving (with range request support for audio/video seeking)
|
|
61
77
|
api.get("/projects/:id/preview/*", async (c) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../src/studio-api/routes/preview.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../../src/studio-api/routes/preview.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAExE,MAAM,sBAAsB,GAAG,+BAA+B,CAAC;AAE/D,SAAS,uBAAuB,CAAC,OAAyB,EAAE,UAAkB;IAC5E,OAAO,OAAO,CAAC,mBAAmB,EAAE,CAAC,UAAU,CAAC,IAAI,sBAAsB,CAAC,UAAU,CAAC,CAAC;AACzF,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAY,EAAE,SAAiB;IAC7D,MAAM,GAAG,GAAG,eAAe,sBAAsB,cAAc,SAAS,IAAI,CAAC;IAC7E,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,sBAAsB,GAAG,CAAC,EAAE,CAAC;QACtD,OAAO,IAAI,CAAC,OAAO,CACjB,IAAI,MAAM,CAAC,qBAAqB,sBAAsB,YAAY,EAAE,GAAG,CAAC,EACxE,GAAG,CACJ,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,GAAG,WAAW,CAAC,CAAC;IAChF,OAAO,GAAG,GAAG,KAAK,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAS,EAAE,OAAyB;IACxE,8BAA8B;IAC9B,GAAG,CAAC,GAAG,CAAC,uBAAuB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC3C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,OAAO;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;QAEzD,IAAI,CAAC;YACH,IAAI,OAAO,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAChD,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;gBACrD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;oBAAE,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;gBAC5D,OAAO,GAAG,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC7C,CAAC;YAED,kFAAkF;YAClF,IACE,CAAC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAC;gBACvC,CAAC,OAAO,CAAC,QAAQ,CAAC,6BAA6B,CAAC,EAChD,CAAC;gBACD,MAAM,UAAU,GAAG,gBAAgB,OAAO,CAAC,UAAU,aAAa,CAAC;gBACnE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;oBACnC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,UAAU,WAAW,CAAC;oBACtD,CAAC,CAAC,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;YAClC,CAAC;YAED,8CAA8C;YAC9C,MAAM,QAAQ,GAAG,iBAAiB,OAAO,CAAC,EAAE,WAAW,CAAC;YACxD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC/B,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,qBAAqB,QAAQ,IAAI,CAAC,CAAC;YAC1E,CAAC;YAED,OAAO,GAAG,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;YACzF,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;YAChD,IAAI,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrB,OAAO,CAAC,CAAC,IAAI,CACX,sBAAsB,CACpB,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,EAC3B,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAC9C,CACF,CAAC;YACJ,CAAC;YACD,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,0BAA0B;IAC1B,GAAG,CAAC,GAAG,CAAC,8BAA8B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAClD,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,OAAO;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,kBAAkB,CACjC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,OAAO,CAAC,EAAE,gBAAgB,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CACpF,CAAC;QACF,MAAM,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAChD,IACE,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC;YAClC,CAAC,UAAU,CAAC,QAAQ,CAAC;YACrB,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,EAC5B,CAAC;YACD,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAClC,CAAC;QACD,MAAM,QAAQ,GAAG,iBAAiB,OAAO,CAAC,EAAE,WAAW,CAAC;QACxD,MAAM,IAAI,GAAG,uBAAuB,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QAC1F,IAAI,CAAC,IAAI;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAC3C,OAAO,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,IAAI,EAAE,uBAAuB,CAAC,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7F,CAAC,CAAC,CAAC;IAEH,4EAA4E;IAC5E,GAAG,CAAC,GAAG,CAAC,yBAAyB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC7C,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,OAAO;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;QACzD,MAAM,OAAO,GAAG,kBAAkB,CAChC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,aAAa,OAAO,CAAC,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAC/E,CAAC;QACF,MAAM,IAAI,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC3C,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YACpF,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;QAClC,CAAC;QACD,MAAM,WAAW,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,mCAAmC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACjE,MAAM,MAAM,GAAW,MAAM;YAC3B,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC;YACnD,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QACvB,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC;QAEhC,yEAAyE;QACzE,MAAM,WAAW,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,KAAK,GAAG,mBAAmB,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACpD,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAE,EAAE,EAAE,CAAC,CAAC;gBACtC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;gBAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,SAAS,GAAG,CAAC,CAAC,CAAC;gBAC7C,MAAM,SAAS,GAAG,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC;gBACtC,OAAO,IAAI,QAAQ,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE;oBACpE,MAAM,EAAE,GAAG;oBACX,OAAO,EAAE;wBACP,cAAc,EAAE,WAAW;wBAC3B,eAAe,EAAE,SAAS,KAAK,IAAI,OAAO,IAAI,SAAS,EAAE;wBACzD,eAAe,EAAE,OAAO;wBACxB,gBAAgB,EAAE,MAAM,CAAC,SAAS,CAAC;qBACpC;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,OAAO,IAAI,QAAQ,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE;YAC1C,OAAO,EAAE;gBACP,cAAc,EAAE,WAAW;gBAC3B,eAAe,EAAE,OAAO;gBACxB,gBAAgB,EAAE,MAAM,CAAC,SAAS,CAAC;aACpC;SACF,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -22,7 +22,7 @@ export function registerProjectRoutes(api, adapter) {
|
|
|
22
22
|
if (!project)
|
|
23
23
|
return c.json({ error: "not found" }, 404);
|
|
24
24
|
const files = walkDir(project.dir);
|
|
25
|
-
return c.json({ id: project.id,
|
|
25
|
+
return c.json({ id: project.id, files });
|
|
26
26
|
});
|
|
27
27
|
}
|
|
28
28
|
//# sourceMappingURL=projects.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../../src/studio-api/routes/projects.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,MAAM,UAAU,qBAAqB,CAAC,GAAS,EAAE,OAAyB;IACxE,oBAAoB;IACpB,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC/B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;QAC9C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,kDAAkD;IAClD,GAAG,CAAC,GAAG,CAAC,6BAA6B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACjD,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;YAC5B,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,GAAG,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;QAChE,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,oBAAoB;IACpB,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACnC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,OAAO;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"projects.js","sourceRoot":"","sources":["../../../src/studio-api/routes/projects.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEjD,MAAM,UAAU,qBAAqB,CAAC,GAAS,EAAE,OAAyB;IACxE,oBAAoB;IACpB,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QAC/B,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,YAAY,EAAE,CAAC;QAC9C,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,kDAAkD;IAClD,GAAG,CAAC,GAAG,CAAC,6BAA6B,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACjD,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC;YAC5B,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,eAAe,EAAE,EAAE,GAAG,CAAC,CAAC;QACjD,CAAC;QACD,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACvD,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,EAAE,GAAG,CAAC,CAAC;QAChE,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;IAEH,oBAAoB;IACpB,GAAG,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;QACnC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,OAAO;YAAE,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,GAAG,CAAC,CAAC;QACzD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3C,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/studio-api/routes/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAIjC,OAAO,KAAK,EAAE,gBAAgB,EAAkB,MAAM,aAAa,CAAC;AAEpE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../src/studio-api/routes/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAIjC,OAAO,KAAK,EAAE,gBAAgB,EAAkB,MAAM,aAAa,CAAC;AAEpE,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAkP/E"}
|
|
@@ -8,28 +8,30 @@ export function registerRenderRoutes(api, adapter) {
|
|
|
8
8
|
const TTL_MS = 300_000;
|
|
9
9
|
const CLEANUP_INTERVAL_MS = 60_000;
|
|
10
10
|
let cleanupTimer = null;
|
|
11
|
-
|
|
11
|
+
const cleanupEnabled = () => typeof process !== "undefined" &&
|
|
12
12
|
process.env.NODE_ENV !== "production" &&
|
|
13
|
-
!process.argv.includes("build")
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
renderJobs.delete(key);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
// Self-cleanup when no jobs remain
|
|
23
|
-
if (renderJobs.size === 0 && cleanupTimer) {
|
|
24
|
-
clearInterval(cleanupTimer);
|
|
25
|
-
cleanupTimer = null;
|
|
13
|
+
!process.argv.includes("build");
|
|
14
|
+
const cleanupFinishedJobs = () => {
|
|
15
|
+
const now = Date.now();
|
|
16
|
+
for (const [key, job] of renderJobs) {
|
|
17
|
+
if ((job.status === "complete" || job.status === "failed") && now - job.createdAt > TTL_MS) {
|
|
18
|
+
renderJobs.delete(key);
|
|
26
19
|
}
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
|
|
20
|
+
}
|
|
21
|
+
if (renderJobs.size === 0 && cleanupTimer) {
|
|
22
|
+
clearInterval(cleanupTimer);
|
|
23
|
+
cleanupTimer = null;
|
|
24
|
+
}
|
|
25
|
+
};
|
|
26
|
+
const ensureCleanupTimer = () => {
|
|
27
|
+
if (cleanupTimer || !cleanupEnabled())
|
|
28
|
+
return;
|
|
29
|
+
cleanupTimer = setInterval(cleanupFinishedJobs, CLEANUP_INTERVAL_MS);
|
|
30
|
+
if (typeof cleanupTimer === "object" && "unref" in cleanupTimer) {
|
|
30
31
|
cleanupTimer.unref();
|
|
31
32
|
}
|
|
32
|
-
}
|
|
33
|
+
};
|
|
34
|
+
ensureCleanupTimer();
|
|
33
35
|
// Start a render
|
|
34
36
|
api.post("/projects/:id/render", async (c) => {
|
|
35
37
|
const project = await adapter.resolveProject(c.req.param("id"));
|
|
@@ -62,25 +64,7 @@ export function registerRenderRoutes(api, adapter) {
|
|
|
62
64
|
});
|
|
63
65
|
jobState.createdAt = Date.now();
|
|
64
66
|
renderJobs.set(jobId, jobState);
|
|
65
|
-
|
|
66
|
-
if (!cleanupTimer && typeof process !== "undefined" && process.env.NODE_ENV !== "production") {
|
|
67
|
-
cleanupTimer = setInterval(() => {
|
|
68
|
-
const now = Date.now();
|
|
69
|
-
for (const [key, job] of renderJobs) {
|
|
70
|
-
if ((job.status === "complete" || job.status === "failed") &&
|
|
71
|
-
now - job.createdAt > TTL_MS) {
|
|
72
|
-
renderJobs.delete(key);
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
if (renderJobs.size === 0 && cleanupTimer) {
|
|
76
|
-
clearInterval(cleanupTimer);
|
|
77
|
-
cleanupTimer = null;
|
|
78
|
-
}
|
|
79
|
-
}, CLEANUP_INTERVAL_MS);
|
|
80
|
-
if (cleanupTimer && typeof cleanupTimer === "object" && "unref" in cleanupTimer) {
|
|
81
|
-
cleanupTimer.unref();
|
|
82
|
-
}
|
|
83
|
-
}
|
|
67
|
+
ensureCleanupTimer();
|
|
84
68
|
return c.json({ jobId, status: "rendering" });
|
|
85
69
|
});
|
|
86
70
|
// SSE progress stream
|