stagebook 0.1.0 → 0.3.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/{chunk-SSOMQ3BK.js → chunk-2J4CDBDM.js} +50 -1
- package/dist/chunk-2J4CDBDM.js.map +1 -0
- package/dist/{chunk-I2WMGA4Q.cjs → chunk-YUWSH74M.cjs} +51 -2
- package/dist/chunk-YUWSH74M.cjs.map +1 -0
- package/dist/components/index.cjs +156 -19
- package/dist/components/index.cjs.map +1 -1
- package/dist/components/index.d.cts +7 -4
- package/dist/components/index.d.ts +7 -4
- package/dist/components/index.js +145 -8
- package/dist/components/index.js.map +1 -1
- package/dist/{evaluateConditions-DzlC6fez.d.cts → evaluateConditions-fqWC3Vz2.d.cts} +2 -1
- package/dist/{evaluateConditions-DzlC6fez.d.ts → evaluateConditions-fqWC3Vz2.d.ts} +2 -1
- package/dist/index.cjs +20 -48
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +19 -47
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/chunk-I2WMGA4Q.cjs.map +0 -1
- package/dist/chunk-SSOMQ3BK.js.map +0 -1
|
@@ -360,6 +360,53 @@ function computeWatchedRanges(events) {
|
|
|
360
360
|
return merged;
|
|
361
361
|
}
|
|
362
362
|
|
|
363
|
+
// src/utils/reference.ts
|
|
364
|
+
function getNestedValueByPath(obj, path = []) {
|
|
365
|
+
return path.reduce(
|
|
366
|
+
(acc, key) => acc !== null && acc !== void 0 ? acc[key] : void 0,
|
|
367
|
+
obj
|
|
368
|
+
);
|
|
369
|
+
}
|
|
370
|
+
function getReferenceKeyAndPath(reference) {
|
|
371
|
+
const segments = reference.split(".");
|
|
372
|
+
const [type, ...rest] = segments;
|
|
373
|
+
let name;
|
|
374
|
+
let path = [];
|
|
375
|
+
let referenceKey;
|
|
376
|
+
if (["survey", "submitButton", "qualtrics", "timeline"].includes(type)) {
|
|
377
|
+
[name, ...path] = rest;
|
|
378
|
+
referenceKey = `${type}_${name}`;
|
|
379
|
+
} else if (type === "prompt") {
|
|
380
|
+
[name] = rest;
|
|
381
|
+
referenceKey = `${type}_${name}`;
|
|
382
|
+
path = ["value"];
|
|
383
|
+
} else if (type === "trackedLink") {
|
|
384
|
+
[name, ...path] = rest;
|
|
385
|
+
referenceKey = `trackedLink_${name}`;
|
|
386
|
+
} else if (["urlParams", "connectionInfo", "browserInfo"].includes(type)) {
|
|
387
|
+
path = rest;
|
|
388
|
+
referenceKey = type;
|
|
389
|
+
} else if (["participantInfo", "discussion"].includes(type)) {
|
|
390
|
+
[name, ...path] = rest;
|
|
391
|
+
referenceKey = name;
|
|
392
|
+
} else {
|
|
393
|
+
throw new Error(`Invalid reference type: ${type}`);
|
|
394
|
+
}
|
|
395
|
+
if (!referenceKey || !name && [
|
|
396
|
+
"survey",
|
|
397
|
+
"submitButton",
|
|
398
|
+
"qualtrics",
|
|
399
|
+
"timeline",
|
|
400
|
+
"prompt",
|
|
401
|
+
"trackedLink",
|
|
402
|
+
"participantInfo",
|
|
403
|
+
"discussion"
|
|
404
|
+
].includes(type)) {
|
|
405
|
+
throw new Error(`Reference ${reference} is missing a name segment.`);
|
|
406
|
+
}
|
|
407
|
+
return { referenceKey, path };
|
|
408
|
+
}
|
|
409
|
+
|
|
363
410
|
// src/utils/evaluateConditions.ts
|
|
364
411
|
function evaluateCondition(condition, referenceValues) {
|
|
365
412
|
const { position, comparator, value } = condition;
|
|
@@ -403,7 +450,9 @@ export {
|
|
|
403
450
|
promptFileSchema,
|
|
404
451
|
compare,
|
|
405
452
|
computeWatchedRanges,
|
|
453
|
+
getNestedValueByPath,
|
|
454
|
+
getReferenceKeyAndPath,
|
|
406
455
|
evaluateCondition,
|
|
407
456
|
evaluateConditions
|
|
408
457
|
};
|
|
409
|
-
//# sourceMappingURL=chunk-
|
|
458
|
+
//# sourceMappingURL=chunk-2J4CDBDM.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/schemas/promptFile.ts","../src/utils/compare.ts","../src/utils/watchedRanges.ts","../src/utils/reference.ts","../src/utils/evaluateConditions.ts"],"sourcesContent":["import { z, ZodIssue } from \"zod\";\nimport { load as loadYaml } from \"js-yaml\";\n\n// This schema is used to ensure that the metadata conforms to the expected structure and types.\n// Cannot be combined with the refine schema, if conditions within z.object fail, superRefine conditions will not be checked.\n// We want all of the condtions to be checked simultaneously, so we use a separate refine schema.\nexport const metadataTypeSchema = z.object({\n name: z.string().optional(),\n type: z.enum([\n \"openResponse\",\n \"multipleChoice\",\n \"noResponse\",\n \"listSorter\",\n \"slider\",\n ]),\n notes: z.string().optional(),\n rows: z.number().int().min(1).optional(),\n shuffleOptions: z.boolean().optional(),\n select: z.enum([\"single\", \"multiple\", \"undefined\"]).optional(),\n layout: z.enum([\"vertical\", \"horizontal\"]).optional(),\n minLength: z.number().int().min(0).optional(),\n maxLength: z.number().int().min(1).optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n interval: z.number().optional(),\n labelPts: z.array(z.number()).optional(),\n});\n\n// Refined schema that adds additional validation rules based on the type of prompt\n// This schema checks that certain fields are only present for specific types of prompts.\n// Conditions in z.object will always pass as long as the extension detects the file,\n// so we are guarenteed to always check against superRefine conditions.\nexport const metadataRefineSchema = z\n .object({\n name: z.any(),\n type: z.any(),\n notes: z.any().optional(),\n rows: z.any().optional(),\n shuffleOptions: z.any().optional(),\n select: z.any().optional(),\n layout: z.any().optional(),\n minLength: z.any().optional(),\n maxLength: z.any().optional(),\n min: z.any().optional(),\n max: z.any().optional(),\n interval: z.any().optional(),\n labelPts: z.any().optional(),\n })\n .superRefine((data, ctx) => {\n if (data.type !== \"openResponse\" && data.rows !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `rows can only be specified for openResponse type`,\n path: [\"rows\"],\n });\n }\n if (data.type !== \"multipleChoice\" && data.select !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `select can only be specified for multipleChoice type`,\n path: [\"select\"],\n });\n }\n if (data.type !== \"multipleChoice\" && data.layout !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `layout can only be specified for multipleChoice type`,\n path: [\"layout\"],\n });\n }\n if (data.type === \"noResponse\" && data.shuffleOptions !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `shuffleOptions cannot be specified for noResponse type`,\n path: [\"shuffleOptions\"],\n });\n }\n if (data.type !== \"openResponse\" && data.minLength !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `minLength can only be specified for openResponse type`,\n path: [\"minLength\"],\n });\n }\n if (data.type !== \"openResponse\" && data.maxLength !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `maxLength can only be specified for openResponse type`,\n path: [\"maxLength\"],\n });\n }\n if (\n data.minLength !== undefined &&\n data.maxLength !== undefined &&\n data.minLength > data.maxLength\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `minLength cannot be greater than maxLength`,\n path: [\"minLength\"],\n });\n }\n // Slider-specific validation\n if (data.type === \"slider\") {\n if (data.min === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `min is required for slider type`,\n path: [\"min\"],\n });\n }\n if (data.max === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `max is required for slider type`,\n path: [\"max\"],\n });\n }\n if (data.interval === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `interval is required for slider type`,\n path: [\"interval\"],\n });\n }\n if (\n data.min !== undefined &&\n data.max !== undefined &&\n data.min >= data.max\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `min must be less than max`,\n path: [\"min\"],\n });\n }\n if (\n data.min !== undefined &&\n data.max !== undefined &&\n data.interval !== undefined &&\n data.min + data.interval > data.max\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `min + interval must be less than or equal to max`,\n path: [\"interval\"],\n });\n }\n }\n if (data.type !== \"slider\" && data.min !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `min can only be specified for slider type`,\n path: [\"min\"],\n });\n }\n if (data.type !== \"slider\" && data.max !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `max can only be specified for slider type`,\n path: [\"max\"],\n });\n }\n if (data.type !== \"slider\" && data.interval !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `interval can only be specified for slider type`,\n path: [\"interval\"],\n });\n }\n if (data.type !== \"slider\" && data.labelPts !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `labelPts can only be specified for slider type`,\n path: [\"labelPts\"],\n });\n }\n });\n\nexport const metadataLogicalSchema = metadataRefineSchema;\n\nexport type MetadataType = z.infer<typeof metadataTypeSchema>;\nexport type MetadataRefineType = z.infer<typeof metadataRefineSchema>;\n\n// Function to validate that labelPts length matches the number of response items for slider type\nexport const validateSliderLabels = (\n metadata: MetadataType,\n responseItems: string[],\n): ZodIssue[] => {\n const issues: ZodIssue[] = [];\n\n if (metadata.type === \"slider\" && metadata.labelPts !== undefined) {\n if (metadata.labelPts.length !== responseItems.length) {\n issues.push({\n code: z.ZodIssueCode.custom,\n message: `labelPts length (${metadata.labelPts.length}) must match the number of labels (${responseItems.length})`,\n path: [\"labelPts\"],\n });\n }\n }\n\n return issues;\n};\n\n// Unified schema that validates and parses a complete prompt markdown file.\n// Input: raw markdown string with three sections delimited by ---\n// Output: { metadata, body, responseItems }\nexport const promptFileSchema = z\n .string()\n .min(1, \"Prompt file string is empty\")\n .transform((str, ctx) => {\n const trimmed = str.trim();\n if (trimmed.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Prompt file string is empty\",\n });\n return z.NEVER;\n }\n\n const sections = trimmed.split(/^-{3,}$/gm);\n\n // Expect: [\"\", metadataYaml, body, responseString]\n // The first element is empty because the file starts with ---\n if (sections.length < 4) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"Prompt file must have three sections separated by --- delimiters: metadata, body, and responses\",\n });\n return z.NEVER;\n }\n\n const metadataYaml = sections[1];\n const body = sections[2];\n const responseString = sections[3];\n\n // Parse YAML metadata\n let metadata: unknown;\n try {\n metadata = loadYaml(metadataYaml);\n } catch {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Failed to parse metadata YAML\",\n path: [\"metadata\"],\n });\n return z.NEVER;\n }\n\n // Validate metadata against type schema\n const typeResult = metadataTypeSchema.safeParse(metadata);\n if (!typeResult.success) {\n typeResult.error.issues.forEach((issue) =>\n ctx.addIssue({\n ...issue,\n path: [\"metadata\", ...issue.path],\n }),\n );\n return z.NEVER;\n }\n\n // Validate metadata against refine schema (cross-field rules)\n const refineResult = metadataRefineSchema.safeParse(metadata);\n if (!refineResult.success) {\n refineResult.error.issues.forEach((issue) =>\n ctx.addIssue({\n ...issue,\n path: [\"metadata\", ...issue.path],\n }),\n );\n }\n\n // Validate body exists\n if (!body || body.trim().length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Prompt body section is empty\",\n path: [\"body\"],\n });\n }\n\n // Parse and validate response items\n const parsedMetadata = typeResult.data;\n let responseItems: string[] = [];\n\n if (parsedMetadata.type !== \"noResponse\" && responseString) {\n const responseLines = responseString\n .split(/\\r?\\n|\\r|\\n/g)\n .filter((line) => line.trim().length > 0);\n\n for (const line of responseLines) {\n if (!(line.startsWith(\"- \") || line.startsWith(\">\"))) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Response line must start with \"- \" (for multiple choice) or \"> \" (for open response). Got: \"${line}\"`,\n path: [\"responses\"],\n });\n }\n }\n\n responseItems = responseLines\n .filter((line) => line.startsWith(\"- \") || line.startsWith(\">\"))\n .map((line) => line.substring(2).trim());\n }\n\n // Validate slider labelPts against response items\n const sliderIssues = validateSliderLabels(parsedMetadata, responseItems);\n sliderIssues.forEach((issue) =>\n ctx.addIssue({\n ...issue,\n path: [\"metadata\", ...issue.path],\n }),\n );\n\n return {\n metadata: parsedMetadata,\n body: body?.trim() ?? \"\",\n responseItems,\n };\n });\n\nexport type PromptFileType = z.infer<typeof promptFileSchema>;\n","export type Comparator =\n | \"exists\"\n | \"doesNotExist\"\n | \"equals\"\n | \"doesNotEqual\"\n | \"isAbove\"\n | \"isBelow\"\n | \"isAtLeast\"\n | \"isAtMost\"\n | \"hasLengthAtLeast\"\n | \"hasLengthAtMost\"\n | \"includes\"\n | \"doesNotInclude\"\n | \"matches\"\n | \"doesNotMatch\"\n | \"isOneOf\"\n | \"isNotOneOf\";\n\nfunction trimSlashes(str: string): string {\n return str\n .split(\"/\")\n .filter((v) => v !== \"\")\n .join(\"/\");\n}\n\nfunction isNumberOrParsableNumber(value: unknown): boolean {\n return (\n typeof value === \"number\" ||\n (typeof value === \"string\" &&\n value.trim() !== \"\" &&\n !Number.isNaN(Number(value)))\n );\n}\n\nexport function compare(\n lhs: unknown,\n comparator: Comparator,\n rhs?: unknown,\n): boolean | undefined {\n switch (comparator) {\n case \"exists\":\n return lhs !== undefined;\n case \"doesNotExist\":\n return lhs === undefined;\n }\n\n if (lhs === undefined) {\n // When lhs is undefined (e.g. player hasn't typed anything yet),\n // return undefined to signal the comparison can't be made yet.\n // Exception: doesNotEqual returns true because undefined is not equal to anything.\n if (comparator === \"doesNotEqual\") return true;\n return undefined;\n }\n\n if (isNumberOrParsableNumber(lhs) && isNumberOrParsableNumber(rhs)) {\n const numLhs = parseFloat(lhs as string);\n const numRhs = parseFloat(rhs as string);\n switch (comparator) {\n case \"equals\":\n return numLhs === numRhs;\n case \"doesNotEqual\":\n return numLhs !== numRhs;\n case \"isAbove\":\n return numLhs > numRhs;\n case \"isBelow\":\n return numLhs < numRhs;\n case \"isAtLeast\":\n return numLhs >= numRhs;\n case \"isAtMost\":\n return numLhs <= numRhs;\n }\n }\n\n if (typeof lhs === \"string\" && !Number.isNaN(rhs)) {\n switch (comparator) {\n case \"hasLengthAtLeast\":\n return lhs.length >= parseFloat(rhs as string);\n case \"hasLengthAtMost\":\n return lhs.length <= parseFloat(rhs as string);\n }\n }\n\n if (typeof lhs === \"string\" && typeof rhs === \"string\") {\n switch (comparator) {\n case \"equals\":\n return lhs === rhs;\n case \"doesNotEqual\":\n return lhs !== rhs;\n case \"includes\":\n return lhs.includes(rhs);\n case \"doesNotInclude\":\n return !lhs.includes(rhs);\n case \"matches\":\n return !!lhs.match(new RegExp(trimSlashes(rhs)));\n case \"doesNotMatch\":\n return !lhs.match(new RegExp(trimSlashes(rhs)));\n }\n }\n\n if (typeof lhs === \"boolean\" && typeof rhs === \"boolean\") {\n switch (comparator) {\n case \"equals\":\n return lhs === rhs;\n case \"doesNotEqual\":\n return lhs !== rhs;\n }\n }\n\n if (Array.isArray(rhs)) {\n switch (comparator) {\n case \"isOneOf\":\n return rhs.includes(lhs);\n case \"isNotOneOf\":\n return !rhs.includes(lhs);\n }\n }\n\n return undefined;\n}\n","import type { VideoEvent } from \"../components/elements/MediaPlayer.js\";\n\n/**\n * Derives watched time ranges from a VideoEvent log.\n *\n * Pairs each \"play\" event with the next \"pause\" or \"ended\" event to form\n * closed intervals, then merges any that overlap or touch. Open intervals\n * (a \"play\" with no closing event — e.g. mid-playback disconnect) are\n * excluded, as we can't confirm how far the participant actually got.\n *\n * Returns intervals sorted by start time in the form [startSeconds, endSeconds].\n */\nexport function computeWatchedRanges(events: VideoEvent[]): [number, number][] {\n // 1. Build closed intervals from play → pause/ended pairs\n const intervals: [number, number][] = [];\n let openStart: number | null = null;\n\n for (const event of events) {\n if (event.type === \"play\") {\n // Only set start if no interval is already open — prevents duplicate\n // play events (e.g. YouTube PLAYING→BUFFERING→PLAYING) from losing\n // the original start time.\n if (openStart === null) {\n openStart = event.videoTime;\n }\n } else if (\n (event.type === \"pause\" ||\n event.type === \"ended\" ||\n event.type === \"stopAt\") &&\n openStart !== null\n ) {\n intervals.push([openStart, event.videoTime]);\n openStart = null;\n }\n // seek, speed, and unmatched pause/ended are ignored for range tracking\n }\n // open play at end is intentionally excluded\n\n if (intervals.length === 0) return [];\n\n // 2. Sort by start time\n intervals.sort((a, b) => a[0] - b[0]);\n\n // 3. Merge overlapping / adjacent intervals\n const merged: [number, number][] = [intervals[0]];\n for (let i = 1; i < intervals.length; i++) {\n const last = merged[merged.length - 1];\n const [start, end] = intervals[i];\n if (start <= last[1]) {\n // overlapping or touching — extend the end\n last[1] = Math.max(last[1], end);\n } else {\n merged.push([start, end]);\n }\n }\n\n return merged;\n}\n","export function getNestedValueByPath(\n obj: unknown,\n path: string[] = [],\n): unknown {\n return path.reduce(\n (acc: unknown, key: string) =>\n acc !== null && acc !== undefined\n ? (acc as Record<string, unknown>)[key]\n : undefined,\n obj,\n );\n}\n\nexport interface ReferenceKeyAndPath {\n referenceKey: string;\n path: string[];\n}\n\nexport function getReferenceKeyAndPath(reference: string): ReferenceKeyAndPath {\n const segments = reference.split(\".\");\n const [type, ...rest] = segments;\n let name: string | undefined;\n let path: string[] = [];\n let referenceKey: string | undefined;\n\n if ([\"survey\", \"submitButton\", \"qualtrics\", \"timeline\"].includes(type)) {\n [name, ...path] = rest;\n referenceKey = `${type}_${name}`;\n } else if (type === \"prompt\") {\n [name] = rest;\n referenceKey = `${type}_${name}`;\n path = [\"value\"];\n } else if (type === \"trackedLink\") {\n [name, ...path] = rest;\n referenceKey = `trackedLink_${name}`;\n } else if ([\"urlParams\", \"connectionInfo\", \"browserInfo\"].includes(type)) {\n path = rest;\n referenceKey = type;\n } else if ([\"participantInfo\", \"discussion\"].includes(type)) {\n [name, ...path] = rest;\n referenceKey = name;\n } else {\n throw new Error(`Invalid reference type: ${type}`);\n }\n\n if (\n !referenceKey ||\n (!name &&\n [\n \"survey\",\n \"submitButton\",\n \"qualtrics\",\n \"timeline\",\n \"prompt\",\n \"trackedLink\",\n \"participantInfo\",\n \"discussion\",\n ].includes(type))\n ) {\n throw new Error(`Reference ${reference} is missing a name segment.`);\n }\n\n return { referenceKey, path };\n}\n","import { compare, type Comparator } from \"./compare.js\";\n\nexport interface Condition {\n reference: string;\n position?: string;\n comparator: string;\n value?: unknown;\n}\n\n/**\n * Evaluate a single condition against resolved reference values.\n * Returns true if the condition is met, false otherwise.\n */\nexport function evaluateCondition(\n condition: Condition,\n referenceValues: unknown[],\n): boolean {\n const { position, comparator, value } = condition;\n\n if (position === \"percentAgreement\") {\n const counts: Record<string, number> = {};\n const definedValues = referenceValues.filter((val) => val !== undefined);\n\n if (definedValues.length === 0) return false;\n\n definedValues.forEach((val) => {\n const cleanValue =\n typeof val === \"string\"\n ? val.toLowerCase().trim()\n : `${val as string | number | boolean}`;\n counts[cleanValue] = (counts[cleanValue] || 0) + 1;\n });\n const maxCount = Math.max(...Object.values(counts));\n return (\n compare(\n (maxCount / referenceValues.length) * 100,\n comparator as Comparator,\n value,\n ) === true\n );\n }\n\n if (position === \"any\") {\n return referenceValues.some(\n (val) => compare(val, comparator as Comparator, value) === true,\n );\n }\n\n // Default: \"all\" — every value must satisfy\n return referenceValues.every(\n (val) => compare(val, comparator as Comparator, value) === true,\n );\n}\n\n/**\n * Evaluate an array of conditions (AND logic).\n * All conditions must be met for the result to be true.\n */\nexport function evaluateConditions(\n conditions: Condition[],\n resolve: (reference: string, position?: string) => unknown[],\n): boolean {\n if (!conditions || conditions.length === 0) return true;\n\n return conditions.every((condition) => {\n const values = resolve(condition.reference, condition.position);\n return evaluateCondition(condition, values);\n });\n}\n"],"mappings":"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","names":[]}
|
|
@@ -360,6 +360,53 @@ function computeWatchedRanges(events) {
|
|
|
360
360
|
return merged;
|
|
361
361
|
}
|
|
362
362
|
|
|
363
|
+
// src/utils/reference.ts
|
|
364
|
+
function getNestedValueByPath(obj, path = []) {
|
|
365
|
+
return path.reduce(
|
|
366
|
+
(acc, key) => acc !== null && acc !== void 0 ? acc[key] : void 0,
|
|
367
|
+
obj
|
|
368
|
+
);
|
|
369
|
+
}
|
|
370
|
+
function getReferenceKeyAndPath(reference) {
|
|
371
|
+
const segments = reference.split(".");
|
|
372
|
+
const [type, ...rest] = segments;
|
|
373
|
+
let name;
|
|
374
|
+
let path = [];
|
|
375
|
+
let referenceKey;
|
|
376
|
+
if (["survey", "submitButton", "qualtrics", "timeline"].includes(type)) {
|
|
377
|
+
[name, ...path] = rest;
|
|
378
|
+
referenceKey = `${type}_${name}`;
|
|
379
|
+
} else if (type === "prompt") {
|
|
380
|
+
[name] = rest;
|
|
381
|
+
referenceKey = `${type}_${name}`;
|
|
382
|
+
path = ["value"];
|
|
383
|
+
} else if (type === "trackedLink") {
|
|
384
|
+
[name, ...path] = rest;
|
|
385
|
+
referenceKey = `trackedLink_${name}`;
|
|
386
|
+
} else if (["urlParams", "connectionInfo", "browserInfo"].includes(type)) {
|
|
387
|
+
path = rest;
|
|
388
|
+
referenceKey = type;
|
|
389
|
+
} else if (["participantInfo", "discussion"].includes(type)) {
|
|
390
|
+
[name, ...path] = rest;
|
|
391
|
+
referenceKey = name;
|
|
392
|
+
} else {
|
|
393
|
+
throw new Error(`Invalid reference type: ${type}`);
|
|
394
|
+
}
|
|
395
|
+
if (!referenceKey || !name && [
|
|
396
|
+
"survey",
|
|
397
|
+
"submitButton",
|
|
398
|
+
"qualtrics",
|
|
399
|
+
"timeline",
|
|
400
|
+
"prompt",
|
|
401
|
+
"trackedLink",
|
|
402
|
+
"participantInfo",
|
|
403
|
+
"discussion"
|
|
404
|
+
].includes(type)) {
|
|
405
|
+
throw new Error(`Reference ${reference} is missing a name segment.`);
|
|
406
|
+
}
|
|
407
|
+
return { referenceKey, path };
|
|
408
|
+
}
|
|
409
|
+
|
|
363
410
|
// src/utils/evaluateConditions.ts
|
|
364
411
|
function evaluateCondition(condition, referenceValues) {
|
|
365
412
|
const { position, comparator, value } = condition;
|
|
@@ -405,5 +452,7 @@ function evaluateConditions(conditions, resolve) {
|
|
|
405
452
|
|
|
406
453
|
|
|
407
454
|
|
|
408
|
-
|
|
409
|
-
|
|
455
|
+
|
|
456
|
+
|
|
457
|
+
exports.metadataTypeSchema = metadataTypeSchema; exports.metadataRefineSchema = metadataRefineSchema; exports.metadataLogicalSchema = metadataLogicalSchema; exports.validateSliderLabels = validateSliderLabels; exports.promptFileSchema = promptFileSchema; exports.compare = compare; exports.computeWatchedRanges = computeWatchedRanges; exports.getNestedValueByPath = getNestedValueByPath; exports.getReferenceKeyAndPath = getReferenceKeyAndPath; exports.evaluateCondition = evaluateCondition; exports.evaluateConditions = evaluateConditions;
|
|
458
|
+
//# sourceMappingURL=chunk-YUWSH74M.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/stagebook/stagebook/packages/stagebook/dist/chunk-YUWSH74M.cjs","../src/schemas/promptFile.ts","../src/utils/compare.ts","../src/utils/watchedRanges.ts","../src/utils/reference.ts","../src/utils/evaluateConditions.ts"],"names":[],"mappings":"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","file":"/home/runner/work/stagebook/stagebook/packages/stagebook/dist/chunk-YUWSH74M.cjs","sourcesContent":[null,"import { z, ZodIssue } from \"zod\";\nimport { load as loadYaml } from \"js-yaml\";\n\n// This schema is used to ensure that the metadata conforms to the expected structure and types.\n// Cannot be combined with the refine schema, if conditions within z.object fail, superRefine conditions will not be checked.\n// We want all of the condtions to be checked simultaneously, so we use a separate refine schema.\nexport const metadataTypeSchema = z.object({\n name: z.string().optional(),\n type: z.enum([\n \"openResponse\",\n \"multipleChoice\",\n \"noResponse\",\n \"listSorter\",\n \"slider\",\n ]),\n notes: z.string().optional(),\n rows: z.number().int().min(1).optional(),\n shuffleOptions: z.boolean().optional(),\n select: z.enum([\"single\", \"multiple\", \"undefined\"]).optional(),\n layout: z.enum([\"vertical\", \"horizontal\"]).optional(),\n minLength: z.number().int().min(0).optional(),\n maxLength: z.number().int().min(1).optional(),\n min: z.number().optional(),\n max: z.number().optional(),\n interval: z.number().optional(),\n labelPts: z.array(z.number()).optional(),\n});\n\n// Refined schema that adds additional validation rules based on the type of prompt\n// This schema checks that certain fields are only present for specific types of prompts.\n// Conditions in z.object will always pass as long as the extension detects the file,\n// so we are guarenteed to always check against superRefine conditions.\nexport const metadataRefineSchema = z\n .object({\n name: z.any(),\n type: z.any(),\n notes: z.any().optional(),\n rows: z.any().optional(),\n shuffleOptions: z.any().optional(),\n select: z.any().optional(),\n layout: z.any().optional(),\n minLength: z.any().optional(),\n maxLength: z.any().optional(),\n min: z.any().optional(),\n max: z.any().optional(),\n interval: z.any().optional(),\n labelPts: z.any().optional(),\n })\n .superRefine((data, ctx) => {\n if (data.type !== \"openResponse\" && data.rows !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `rows can only be specified for openResponse type`,\n path: [\"rows\"],\n });\n }\n if (data.type !== \"multipleChoice\" && data.select !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `select can only be specified for multipleChoice type`,\n path: [\"select\"],\n });\n }\n if (data.type !== \"multipleChoice\" && data.layout !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `layout can only be specified for multipleChoice type`,\n path: [\"layout\"],\n });\n }\n if (data.type === \"noResponse\" && data.shuffleOptions !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `shuffleOptions cannot be specified for noResponse type`,\n path: [\"shuffleOptions\"],\n });\n }\n if (data.type !== \"openResponse\" && data.minLength !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `minLength can only be specified for openResponse type`,\n path: [\"minLength\"],\n });\n }\n if (data.type !== \"openResponse\" && data.maxLength !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `maxLength can only be specified for openResponse type`,\n path: [\"maxLength\"],\n });\n }\n if (\n data.minLength !== undefined &&\n data.maxLength !== undefined &&\n data.minLength > data.maxLength\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `minLength cannot be greater than maxLength`,\n path: [\"minLength\"],\n });\n }\n // Slider-specific validation\n if (data.type === \"slider\") {\n if (data.min === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `min is required for slider type`,\n path: [\"min\"],\n });\n }\n if (data.max === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `max is required for slider type`,\n path: [\"max\"],\n });\n }\n if (data.interval === undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `interval is required for slider type`,\n path: [\"interval\"],\n });\n }\n if (\n data.min !== undefined &&\n data.max !== undefined &&\n data.min >= data.max\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `min must be less than max`,\n path: [\"min\"],\n });\n }\n if (\n data.min !== undefined &&\n data.max !== undefined &&\n data.interval !== undefined &&\n data.min + data.interval > data.max\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `min + interval must be less than or equal to max`,\n path: [\"interval\"],\n });\n }\n }\n if (data.type !== \"slider\" && data.min !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `min can only be specified for slider type`,\n path: [\"min\"],\n });\n }\n if (data.type !== \"slider\" && data.max !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `max can only be specified for slider type`,\n path: [\"max\"],\n });\n }\n if (data.type !== \"slider\" && data.interval !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `interval can only be specified for slider type`,\n path: [\"interval\"],\n });\n }\n if (data.type !== \"slider\" && data.labelPts !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `labelPts can only be specified for slider type`,\n path: [\"labelPts\"],\n });\n }\n });\n\nexport const metadataLogicalSchema = metadataRefineSchema;\n\nexport type MetadataType = z.infer<typeof metadataTypeSchema>;\nexport type MetadataRefineType = z.infer<typeof metadataRefineSchema>;\n\n// Function to validate that labelPts length matches the number of response items for slider type\nexport const validateSliderLabels = (\n metadata: MetadataType,\n responseItems: string[],\n): ZodIssue[] => {\n const issues: ZodIssue[] = [];\n\n if (metadata.type === \"slider\" && metadata.labelPts !== undefined) {\n if (metadata.labelPts.length !== responseItems.length) {\n issues.push({\n code: z.ZodIssueCode.custom,\n message: `labelPts length (${metadata.labelPts.length}) must match the number of labels (${responseItems.length})`,\n path: [\"labelPts\"],\n });\n }\n }\n\n return issues;\n};\n\n// Unified schema that validates and parses a complete prompt markdown file.\n// Input: raw markdown string with three sections delimited by ---\n// Output: { metadata, body, responseItems }\nexport const promptFileSchema = z\n .string()\n .min(1, \"Prompt file string is empty\")\n .transform((str, ctx) => {\n const trimmed = str.trim();\n if (trimmed.length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Prompt file string is empty\",\n });\n return z.NEVER;\n }\n\n const sections = trimmed.split(/^-{3,}$/gm);\n\n // Expect: [\"\", metadataYaml, body, responseString]\n // The first element is empty because the file starts with ---\n if (sections.length < 4) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message:\n \"Prompt file must have three sections separated by --- delimiters: metadata, body, and responses\",\n });\n return z.NEVER;\n }\n\n const metadataYaml = sections[1];\n const body = sections[2];\n const responseString = sections[3];\n\n // Parse YAML metadata\n let metadata: unknown;\n try {\n metadata = loadYaml(metadataYaml);\n } catch {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Failed to parse metadata YAML\",\n path: [\"metadata\"],\n });\n return z.NEVER;\n }\n\n // Validate metadata against type schema\n const typeResult = metadataTypeSchema.safeParse(metadata);\n if (!typeResult.success) {\n typeResult.error.issues.forEach((issue) =>\n ctx.addIssue({\n ...issue,\n path: [\"metadata\", ...issue.path],\n }),\n );\n return z.NEVER;\n }\n\n // Validate metadata against refine schema (cross-field rules)\n const refineResult = metadataRefineSchema.safeParse(metadata);\n if (!refineResult.success) {\n refineResult.error.issues.forEach((issue) =>\n ctx.addIssue({\n ...issue,\n path: [\"metadata\", ...issue.path],\n }),\n );\n }\n\n // Validate body exists\n if (!body || body.trim().length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Prompt body section is empty\",\n path: [\"body\"],\n });\n }\n\n // Parse and validate response items\n const parsedMetadata = typeResult.data;\n let responseItems: string[] = [];\n\n if (parsedMetadata.type !== \"noResponse\" && responseString) {\n const responseLines = responseString\n .split(/\\r?\\n|\\r|\\n/g)\n .filter((line) => line.trim().length > 0);\n\n for (const line of responseLines) {\n if (!(line.startsWith(\"- \") || line.startsWith(\">\"))) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Response line must start with \"- \" (for multiple choice) or \"> \" (for open response). Got: \"${line}\"`,\n path: [\"responses\"],\n });\n }\n }\n\n responseItems = responseLines\n .filter((line) => line.startsWith(\"- \") || line.startsWith(\">\"))\n .map((line) => line.substring(2).trim());\n }\n\n // Validate slider labelPts against response items\n const sliderIssues = validateSliderLabels(parsedMetadata, responseItems);\n sliderIssues.forEach((issue) =>\n ctx.addIssue({\n ...issue,\n path: [\"metadata\", ...issue.path],\n }),\n );\n\n return {\n metadata: parsedMetadata,\n body: body?.trim() ?? \"\",\n responseItems,\n };\n });\n\nexport type PromptFileType = z.infer<typeof promptFileSchema>;\n","export type Comparator =\n | \"exists\"\n | \"doesNotExist\"\n | \"equals\"\n | \"doesNotEqual\"\n | \"isAbove\"\n | \"isBelow\"\n | \"isAtLeast\"\n | \"isAtMost\"\n | \"hasLengthAtLeast\"\n | \"hasLengthAtMost\"\n | \"includes\"\n | \"doesNotInclude\"\n | \"matches\"\n | \"doesNotMatch\"\n | \"isOneOf\"\n | \"isNotOneOf\";\n\nfunction trimSlashes(str: string): string {\n return str\n .split(\"/\")\n .filter((v) => v !== \"\")\n .join(\"/\");\n}\n\nfunction isNumberOrParsableNumber(value: unknown): boolean {\n return (\n typeof value === \"number\" ||\n (typeof value === \"string\" &&\n value.trim() !== \"\" &&\n !Number.isNaN(Number(value)))\n );\n}\n\nexport function compare(\n lhs: unknown,\n comparator: Comparator,\n rhs?: unknown,\n): boolean | undefined {\n switch (comparator) {\n case \"exists\":\n return lhs !== undefined;\n case \"doesNotExist\":\n return lhs === undefined;\n }\n\n if (lhs === undefined) {\n // When lhs is undefined (e.g. player hasn't typed anything yet),\n // return undefined to signal the comparison can't be made yet.\n // Exception: doesNotEqual returns true because undefined is not equal to anything.\n if (comparator === \"doesNotEqual\") return true;\n return undefined;\n }\n\n if (isNumberOrParsableNumber(lhs) && isNumberOrParsableNumber(rhs)) {\n const numLhs = parseFloat(lhs as string);\n const numRhs = parseFloat(rhs as string);\n switch (comparator) {\n case \"equals\":\n return numLhs === numRhs;\n case \"doesNotEqual\":\n return numLhs !== numRhs;\n case \"isAbove\":\n return numLhs > numRhs;\n case \"isBelow\":\n return numLhs < numRhs;\n case \"isAtLeast\":\n return numLhs >= numRhs;\n case \"isAtMost\":\n return numLhs <= numRhs;\n }\n }\n\n if (typeof lhs === \"string\" && !Number.isNaN(rhs)) {\n switch (comparator) {\n case \"hasLengthAtLeast\":\n return lhs.length >= parseFloat(rhs as string);\n case \"hasLengthAtMost\":\n return lhs.length <= parseFloat(rhs as string);\n }\n }\n\n if (typeof lhs === \"string\" && typeof rhs === \"string\") {\n switch (comparator) {\n case \"equals\":\n return lhs === rhs;\n case \"doesNotEqual\":\n return lhs !== rhs;\n case \"includes\":\n return lhs.includes(rhs);\n case \"doesNotInclude\":\n return !lhs.includes(rhs);\n case \"matches\":\n return !!lhs.match(new RegExp(trimSlashes(rhs)));\n case \"doesNotMatch\":\n return !lhs.match(new RegExp(trimSlashes(rhs)));\n }\n }\n\n if (typeof lhs === \"boolean\" && typeof rhs === \"boolean\") {\n switch (comparator) {\n case \"equals\":\n return lhs === rhs;\n case \"doesNotEqual\":\n return lhs !== rhs;\n }\n }\n\n if (Array.isArray(rhs)) {\n switch (comparator) {\n case \"isOneOf\":\n return rhs.includes(lhs);\n case \"isNotOneOf\":\n return !rhs.includes(lhs);\n }\n }\n\n return undefined;\n}\n","import type { VideoEvent } from \"../components/elements/MediaPlayer.js\";\n\n/**\n * Derives watched time ranges from a VideoEvent log.\n *\n * Pairs each \"play\" event with the next \"pause\" or \"ended\" event to form\n * closed intervals, then merges any that overlap or touch. Open intervals\n * (a \"play\" with no closing event — e.g. mid-playback disconnect) are\n * excluded, as we can't confirm how far the participant actually got.\n *\n * Returns intervals sorted by start time in the form [startSeconds, endSeconds].\n */\nexport function computeWatchedRanges(events: VideoEvent[]): [number, number][] {\n // 1. Build closed intervals from play → pause/ended pairs\n const intervals: [number, number][] = [];\n let openStart: number | null = null;\n\n for (const event of events) {\n if (event.type === \"play\") {\n // Only set start if no interval is already open — prevents duplicate\n // play events (e.g. YouTube PLAYING→BUFFERING→PLAYING) from losing\n // the original start time.\n if (openStart === null) {\n openStart = event.videoTime;\n }\n } else if (\n (event.type === \"pause\" ||\n event.type === \"ended\" ||\n event.type === \"stopAt\") &&\n openStart !== null\n ) {\n intervals.push([openStart, event.videoTime]);\n openStart = null;\n }\n // seek, speed, and unmatched pause/ended are ignored for range tracking\n }\n // open play at end is intentionally excluded\n\n if (intervals.length === 0) return [];\n\n // 2. Sort by start time\n intervals.sort((a, b) => a[0] - b[0]);\n\n // 3. Merge overlapping / adjacent intervals\n const merged: [number, number][] = [intervals[0]];\n for (let i = 1; i < intervals.length; i++) {\n const last = merged[merged.length - 1];\n const [start, end] = intervals[i];\n if (start <= last[1]) {\n // overlapping or touching — extend the end\n last[1] = Math.max(last[1], end);\n } else {\n merged.push([start, end]);\n }\n }\n\n return merged;\n}\n","export function getNestedValueByPath(\n obj: unknown,\n path: string[] = [],\n): unknown {\n return path.reduce(\n (acc: unknown, key: string) =>\n acc !== null && acc !== undefined\n ? (acc as Record<string, unknown>)[key]\n : undefined,\n obj,\n );\n}\n\nexport interface ReferenceKeyAndPath {\n referenceKey: string;\n path: string[];\n}\n\nexport function getReferenceKeyAndPath(reference: string): ReferenceKeyAndPath {\n const segments = reference.split(\".\");\n const [type, ...rest] = segments;\n let name: string | undefined;\n let path: string[] = [];\n let referenceKey: string | undefined;\n\n if ([\"survey\", \"submitButton\", \"qualtrics\", \"timeline\"].includes(type)) {\n [name, ...path] = rest;\n referenceKey = `${type}_${name}`;\n } else if (type === \"prompt\") {\n [name] = rest;\n referenceKey = `${type}_${name}`;\n path = [\"value\"];\n } else if (type === \"trackedLink\") {\n [name, ...path] = rest;\n referenceKey = `trackedLink_${name}`;\n } else if ([\"urlParams\", \"connectionInfo\", \"browserInfo\"].includes(type)) {\n path = rest;\n referenceKey = type;\n } else if ([\"participantInfo\", \"discussion\"].includes(type)) {\n [name, ...path] = rest;\n referenceKey = name;\n } else {\n throw new Error(`Invalid reference type: ${type}`);\n }\n\n if (\n !referenceKey ||\n (!name &&\n [\n \"survey\",\n \"submitButton\",\n \"qualtrics\",\n \"timeline\",\n \"prompt\",\n \"trackedLink\",\n \"participantInfo\",\n \"discussion\",\n ].includes(type))\n ) {\n throw new Error(`Reference ${reference} is missing a name segment.`);\n }\n\n return { referenceKey, path };\n}\n","import { compare, type Comparator } from \"./compare.js\";\n\nexport interface Condition {\n reference: string;\n position?: string;\n comparator: string;\n value?: unknown;\n}\n\n/**\n * Evaluate a single condition against resolved reference values.\n * Returns true if the condition is met, false otherwise.\n */\nexport function evaluateCondition(\n condition: Condition,\n referenceValues: unknown[],\n): boolean {\n const { position, comparator, value } = condition;\n\n if (position === \"percentAgreement\") {\n const counts: Record<string, number> = {};\n const definedValues = referenceValues.filter((val) => val !== undefined);\n\n if (definedValues.length === 0) return false;\n\n definedValues.forEach((val) => {\n const cleanValue =\n typeof val === \"string\"\n ? val.toLowerCase().trim()\n : `${val as string | number | boolean}`;\n counts[cleanValue] = (counts[cleanValue] || 0) + 1;\n });\n const maxCount = Math.max(...Object.values(counts));\n return (\n compare(\n (maxCount / referenceValues.length) * 100,\n comparator as Comparator,\n value,\n ) === true\n );\n }\n\n if (position === \"any\") {\n return referenceValues.some(\n (val) => compare(val, comparator as Comparator, value) === true,\n );\n }\n\n // Default: \"all\" — every value must satisfy\n return referenceValues.every(\n (val) => compare(val, comparator as Comparator, value) === true,\n );\n}\n\n/**\n * Evaluate an array of conditions (AND logic).\n * All conditions must be met for the result to be true.\n */\nexport function evaluateConditions(\n conditions: Condition[],\n resolve: (reference: string, position?: string) => unknown[],\n): boolean {\n if (!conditions || conditions.length === 0) return true;\n\n return conditions.every((condition) => {\n const values = resolve(condition.reference, condition.position);\n return evaluateCondition(condition, values);\n });\n}\n"]}
|
|
@@ -2,17 +2,40 @@
|
|
|
2
2
|
|
|
3
3
|
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
var _chunkYUWSH74Mcjs = require('../chunk-YUWSH74M.cjs');
|
|
6
8
|
|
|
7
9
|
// src/components/StagebookProvider.tsx
|
|
8
10
|
var _react = require('react'); var _react2 = _interopRequireDefault(_react);
|
|
9
11
|
var _jsxruntime = require('react/jsx-runtime');
|
|
10
|
-
var StagebookReactContext = _react.createContext.call(void 0,
|
|
12
|
+
var StagebookReactContext = _react.createContext.call(void 0,
|
|
13
|
+
null
|
|
14
|
+
);
|
|
11
15
|
function StagebookProvider({
|
|
12
16
|
value,
|
|
13
17
|
children
|
|
14
18
|
}) {
|
|
15
|
-
|
|
19
|
+
const resolve = _react2.default.useCallback(
|
|
20
|
+
(reference, position) => {
|
|
21
|
+
let referenceKey;
|
|
22
|
+
let path;
|
|
23
|
+
try {
|
|
24
|
+
({ referenceKey, path } = _chunkYUWSH74Mcjs.getReferenceKeyAndPath.call(void 0, reference));
|
|
25
|
+
} catch (e2) {
|
|
26
|
+
console.error(`Invalid reference: "${reference}"`);
|
|
27
|
+
return [];
|
|
28
|
+
}
|
|
29
|
+
const rawValues = value.get(referenceKey, position);
|
|
30
|
+
return rawValues.map((v) => _chunkYUWSH74Mcjs.getNestedValueByPath.call(void 0, v, path)).filter((v) => v !== void 0);
|
|
31
|
+
},
|
|
32
|
+
[value]
|
|
33
|
+
);
|
|
34
|
+
const internal = _react2.default.useMemo(
|
|
35
|
+
() => ({ ...value, resolve }),
|
|
36
|
+
[value, resolve]
|
|
37
|
+
);
|
|
38
|
+
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, StagebookReactContext.Provider, { value: internal, children });
|
|
16
39
|
}
|
|
17
40
|
function useStagebookContext() {
|
|
18
41
|
const ctx = _react.useContext.call(void 0, StagebookReactContext);
|
|
@@ -38,9 +61,15 @@ function useElapsedTime() {
|
|
|
38
61
|
function useTextContent(path) {
|
|
39
62
|
const { getTextContent } = useStagebookContext();
|
|
40
63
|
const [data, setData] = _react.useState.call(void 0, void 0);
|
|
41
|
-
const [isLoading, setIsLoading] = _react.useState.call(void 0,
|
|
64
|
+
const [isLoading, setIsLoading] = _react.useState.call(void 0, false);
|
|
42
65
|
const [error, setError] = _react.useState.call(void 0, void 0);
|
|
43
66
|
_react.useEffect.call(void 0, () => {
|
|
67
|
+
if (!path) {
|
|
68
|
+
setData(void 0);
|
|
69
|
+
setError(void 0);
|
|
70
|
+
setIsLoading(false);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
44
73
|
let cancelled = false;
|
|
45
74
|
setIsLoading(true);
|
|
46
75
|
setError(void 0);
|
|
@@ -453,7 +482,7 @@ function isYouTubeURL(url) {
|
|
|
453
482
|
let parsed;
|
|
454
483
|
try {
|
|
455
484
|
parsed = new URL(url);
|
|
456
|
-
} catch (
|
|
485
|
+
} catch (e3) {
|
|
457
486
|
return null;
|
|
458
487
|
}
|
|
459
488
|
const { hostname, pathname, searchParams } = parsed;
|
|
@@ -1296,7 +1325,7 @@ function isSafeURL(url) {
|
|
|
1296
1325
|
try {
|
|
1297
1326
|
const parsed = new URL(url, window.location.href);
|
|
1298
1327
|
return parsed.protocol === "http:" || parsed.protocol === "https:";
|
|
1299
|
-
} catch (
|
|
1328
|
+
} catch (e4) {
|
|
1300
1329
|
return false;
|
|
1301
1330
|
}
|
|
1302
1331
|
}
|
|
@@ -1316,16 +1345,21 @@ function MediaPlayer({
|
|
|
1316
1345
|
stopAt,
|
|
1317
1346
|
allowScrubOutsideBounds = false,
|
|
1318
1347
|
stepDuration = 1,
|
|
1348
|
+
playback,
|
|
1319
1349
|
controls
|
|
1320
1350
|
}) {
|
|
1321
1351
|
const youtubeVideoId = isYouTubeURL(url);
|
|
1322
1352
|
const saveKey = `mediaPlayer_${name}`;
|
|
1353
|
+
const hasAnyControls = controls !== void 0 && (controls.playPause || controls.seek || controls.step || controls.speed);
|
|
1354
|
+
const effectivePlayback = _nullishCoalesce(playback, () => ( (hasAnyControls || syncToStageTime ? "manual" : "once")));
|
|
1323
1355
|
if (!youtubeVideoId && !isSafeURL(url)) {
|
|
1324
1356
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "div", { "data-testid": "mediaPlayer", role: "alert", children: "Invalid media URL" });
|
|
1325
1357
|
}
|
|
1326
1358
|
const eventsRef = _react.useRef.call(void 0, []);
|
|
1327
1359
|
const videoRef = _react.useRef.call(void 0, null);
|
|
1360
|
+
const autoplayAttemptedRef = _react.useRef.call(void 0, false);
|
|
1328
1361
|
const [isPaused, setIsPaused] = _react.useState.call(void 0, true);
|
|
1362
|
+
const [showPlayOnce, setShowPlayOnce] = _react.useState.call(void 0, false);
|
|
1329
1363
|
const [isHovered, setIsHovered] = _react.useState.call(void 0, false);
|
|
1330
1364
|
const [currentTime, setCurrentTime] = _react.useState.call(void 0, 0);
|
|
1331
1365
|
const [duration, setDuration] = _react.useState.call(void 0, 0);
|
|
@@ -1336,6 +1370,8 @@ function MediaPlayer({
|
|
|
1336
1370
|
const [loadError, setLoadError] = _react.useState.call(void 0, null);
|
|
1337
1371
|
_react.useEffect.call(void 0, () => {
|
|
1338
1372
|
setLoadError(null);
|
|
1373
|
+
autoplayAttemptedRef.current = false;
|
|
1374
|
+
setShowPlayOnce(false);
|
|
1339
1375
|
}, [url]);
|
|
1340
1376
|
const [ytHandle, setYtHandle] = _react.useState.call(void 0, null);
|
|
1341
1377
|
const scrubWasPlayingRef = _react.useRef.call(void 0, false);
|
|
@@ -1512,6 +1548,17 @@ function MediaPlayer({
|
|
|
1512
1548
|
videoRef.current.currentTime = startAt;
|
|
1513
1549
|
}
|
|
1514
1550
|
}, []);
|
|
1551
|
+
_react.useEffect.call(void 0, () => {
|
|
1552
|
+
if (effectivePlayback !== "once") return;
|
|
1553
|
+
if (autoplayAttemptedRef.current) return;
|
|
1554
|
+
const v = videoRef.current;
|
|
1555
|
+
if (!v) return;
|
|
1556
|
+
if (duration === 0) return;
|
|
1557
|
+
autoplayAttemptedRef.current = true;
|
|
1558
|
+
void v.play().catch(() => {
|
|
1559
|
+
setShowPlayOnce(true);
|
|
1560
|
+
});
|
|
1561
|
+
}, [effectivePlayback, duration]);
|
|
1515
1562
|
const recordEvent = _react.useCallback.call(void 0,
|
|
1516
1563
|
(type, videoTime, extra) => {
|
|
1517
1564
|
const event = {
|
|
@@ -1528,7 +1575,7 @@ function MediaPlayer({
|
|
|
1528
1575
|
...stopAt !== void 0 && { stopAt },
|
|
1529
1576
|
events: eventsRef.current,
|
|
1530
1577
|
lastVideoTime: videoTime,
|
|
1531
|
-
watchedRanges:
|
|
1578
|
+
watchedRanges: _chunkYUWSH74Mcjs.computeWatchedRanges.call(void 0, eventsRef.current)
|
|
1532
1579
|
};
|
|
1533
1580
|
save(saveKey, record);
|
|
1534
1581
|
},
|
|
@@ -1671,6 +1718,7 @@ function MediaPlayer({
|
|
|
1671
1718
|
}, [playbackRate, recordEvent]);
|
|
1672
1719
|
const handleKeyDown = _react.useCallback.call(void 0,
|
|
1673
1720
|
(e) => {
|
|
1721
|
+
if (effectivePlayback === "once") return;
|
|
1674
1722
|
if (ytHandle) {
|
|
1675
1723
|
switch (e.key) {
|
|
1676
1724
|
case " ":
|
|
@@ -1773,7 +1821,13 @@ function MediaPlayer({
|
|
|
1773
1821
|
break;
|
|
1774
1822
|
}
|
|
1775
1823
|
},
|
|
1776
|
-
[
|
|
1824
|
+
[
|
|
1825
|
+
effectivePlayback,
|
|
1826
|
+
seek,
|
|
1827
|
+
stepDuration,
|
|
1828
|
+
playbackRate,
|
|
1829
|
+
enterFastScrubForward
|
|
1830
|
+
]
|
|
1777
1831
|
);
|
|
1778
1832
|
const handleKeyUp = _react.useCallback.call(void 0,
|
|
1779
1833
|
(e) => {
|
|
@@ -2161,10 +2215,86 @@ function MediaPlayer({
|
|
|
2161
2215
|
},
|
|
2162
2216
|
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, HTML5Controls, { ...html5ControlsProps })
|
|
2163
2217
|
}
|
|
2218
|
+
),
|
|
2219
|
+
showPlayOnce && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
2220
|
+
"button",
|
|
2221
|
+
{
|
|
2222
|
+
type: "button",
|
|
2223
|
+
"data-testid": "mediaPlayer-playOnce",
|
|
2224
|
+
"aria-label": "Play video",
|
|
2225
|
+
onClick: () => {
|
|
2226
|
+
setShowPlayOnce(false);
|
|
2227
|
+
const v = videoRef.current;
|
|
2228
|
+
if (!v) {
|
|
2229
|
+
setShowPlayOnce(true);
|
|
2230
|
+
return;
|
|
2231
|
+
}
|
|
2232
|
+
void v.play().catch(() => {
|
|
2233
|
+
setShowPlayOnce(true);
|
|
2234
|
+
});
|
|
2235
|
+
},
|
|
2236
|
+
style: {
|
|
2237
|
+
position: "absolute",
|
|
2238
|
+
top: "50%",
|
|
2239
|
+
left: "50%",
|
|
2240
|
+
transform: "translate(-50%, -50%)",
|
|
2241
|
+
background: "rgba(0,0,0,0.6)",
|
|
2242
|
+
border: "none",
|
|
2243
|
+
borderRadius: "50%",
|
|
2244
|
+
width: 64,
|
|
2245
|
+
height: 64,
|
|
2246
|
+
cursor: "pointer",
|
|
2247
|
+
display: "flex",
|
|
2248
|
+
alignItems: "center",
|
|
2249
|
+
justifyContent: "center",
|
|
2250
|
+
color: "#fff"
|
|
2251
|
+
},
|
|
2252
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
2253
|
+
"svg",
|
|
2254
|
+
{
|
|
2255
|
+
width: 32,
|
|
2256
|
+
height: 32,
|
|
2257
|
+
viewBox: "0 0 24 24",
|
|
2258
|
+
fill: "currentColor",
|
|
2259
|
+
"aria-hidden": "true",
|
|
2260
|
+
children: /* @__PURE__ */ _jsxruntime.jsx.call(void 0, "polygon", { points: "6,3 20,12 6,21" })
|
|
2261
|
+
}
|
|
2262
|
+
)
|
|
2263
|
+
}
|
|
2164
2264
|
)
|
|
2165
2265
|
]
|
|
2166
2266
|
}
|
|
2167
2267
|
),
|
|
2268
|
+
!playVideo && showPlayOnce && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
2269
|
+
"button",
|
|
2270
|
+
{
|
|
2271
|
+
type: "button",
|
|
2272
|
+
"data-testid": "mediaPlayer-playOnce",
|
|
2273
|
+
"aria-label": "Play audio",
|
|
2274
|
+
onClick: () => {
|
|
2275
|
+
setShowPlayOnce(false);
|
|
2276
|
+
const v = videoRef.current;
|
|
2277
|
+
if (!v) {
|
|
2278
|
+
setShowPlayOnce(true);
|
|
2279
|
+
return;
|
|
2280
|
+
}
|
|
2281
|
+
void v.play().catch(() => {
|
|
2282
|
+
setShowPlayOnce(true);
|
|
2283
|
+
});
|
|
2284
|
+
},
|
|
2285
|
+
style: {
|
|
2286
|
+
background: "rgba(28,28,30,0.96)",
|
|
2287
|
+
border: "1px solid rgba(255,255,255,0.2)",
|
|
2288
|
+
borderRadius: "0.5rem",
|
|
2289
|
+
padding: "0.75rem 1.5rem",
|
|
2290
|
+
cursor: "pointer",
|
|
2291
|
+
color: "#fff",
|
|
2292
|
+
fontSize: "0.875rem",
|
|
2293
|
+
fontWeight: 500
|
|
2294
|
+
},
|
|
2295
|
+
children: "Play"
|
|
2296
|
+
}
|
|
2297
|
+
),
|
|
2168
2298
|
!playVideo && controlsVisible && !loadError && /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|
|
2169
2299
|
"div",
|
|
2170
2300
|
{
|
|
@@ -2674,13 +2804,13 @@ function SelectionOverlay({
|
|
|
2674
2804
|
const capturePointer = _react.useCallback.call(void 0, (e) => {
|
|
2675
2805
|
try {
|
|
2676
2806
|
e.currentTarget.setPointerCapture(e.pointerId);
|
|
2677
|
-
} catch (
|
|
2807
|
+
} catch (e5) {
|
|
2678
2808
|
}
|
|
2679
2809
|
}, []);
|
|
2680
2810
|
const releasePointer = _react.useCallback.call(void 0, (e) => {
|
|
2681
2811
|
try {
|
|
2682
2812
|
e.currentTarget.releasePointerCapture(e.pointerId);
|
|
2683
|
-
} catch (
|
|
2813
|
+
} catch (e6) {
|
|
2684
2814
|
}
|
|
2685
2815
|
}, []);
|
|
2686
2816
|
const handlePointerDown = _react.useCallback.call(void 0,
|
|
@@ -2803,7 +2933,7 @@ function SelectionOverlay({
|
|
|
2803
2933
|
if (overlay) {
|
|
2804
2934
|
try {
|
|
2805
2935
|
overlay.setPointerCapture(e.pointerId);
|
|
2806
|
-
} catch (
|
|
2936
|
+
} catch (e7) {
|
|
2807
2937
|
}
|
|
2808
2938
|
}
|
|
2809
2939
|
onSelect(index);
|
|
@@ -2828,7 +2958,7 @@ function SelectionOverlay({
|
|
|
2828
2958
|
if (overlay) {
|
|
2829
2959
|
try {
|
|
2830
2960
|
overlay.setPointerCapture(e.pointerId);
|
|
2831
|
-
} catch (
|
|
2961
|
+
} catch (e8) {
|
|
2832
2962
|
}
|
|
2833
2963
|
}
|
|
2834
2964
|
onSelect(index);
|
|
@@ -3283,7 +3413,7 @@ function Minimap({
|
|
|
3283
3413
|
dragRef.current = { pointerId: e.pointerId, offset };
|
|
3284
3414
|
try {
|
|
3285
3415
|
e.currentTarget.setPointerCapture(e.pointerId);
|
|
3286
|
-
} catch (
|
|
3416
|
+
} catch (e9) {
|
|
3287
3417
|
}
|
|
3288
3418
|
},
|
|
3289
3419
|
[
|
|
@@ -3314,7 +3444,7 @@ function Minimap({
|
|
|
3314
3444
|
dragRef.current = null;
|
|
3315
3445
|
try {
|
|
3316
3446
|
e.currentTarget.releasePointerCapture(e.pointerId);
|
|
3317
|
-
} catch (
|
|
3447
|
+
} catch (e10) {
|
|
3318
3448
|
}
|
|
3319
3449
|
}
|
|
3320
3450
|
}, []);
|
|
@@ -5180,7 +5310,7 @@ function Qualtrics({
|
|
|
5180
5310
|
try {
|
|
5181
5311
|
const originHost = new URL(event.origin).hostname;
|
|
5182
5312
|
if (!originHost.endsWith("qualtrics.com")) return;
|
|
5183
|
-
} catch (
|
|
5313
|
+
} catch (e11) {
|
|
5184
5314
|
return;
|
|
5185
5315
|
}
|
|
5186
5316
|
const data = event.data;
|
|
@@ -5387,14 +5517,17 @@ function Element({ element, onSubmit, stageDuration }) {
|
|
|
5387
5517
|
case "prompt": {
|
|
5388
5518
|
if (promptError) {
|
|
5389
5519
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0, "p", { style: { color: "#dc2626", fontSize: "0.875rem" }, children: [
|
|
5390
|
-
"Error loading prompt
|
|
5520
|
+
"Error loading prompt",
|
|
5521
|
+
element.file ? ` "${element.file}"` : "",
|
|
5522
|
+
":",
|
|
5523
|
+
" ",
|
|
5391
5524
|
promptError.message
|
|
5392
5525
|
] });
|
|
5393
5526
|
}
|
|
5394
5527
|
if (promptLoading || !promptMarkdown) {
|
|
5395
5528
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, Loading, {});
|
|
5396
5529
|
}
|
|
5397
|
-
const parsed =
|
|
5530
|
+
const parsed = _chunkYUWSH74Mcjs.promptFileSchema.safeParse(promptMarkdown);
|
|
5398
5531
|
if (!parsed.success) {
|
|
5399
5532
|
return /* @__PURE__ */ _jsxruntime.jsxs.call(void 0,
|
|
5400
5533
|
"p",
|
|
@@ -5404,7 +5537,10 @@ function Element({ element, onSubmit, stageDuration }) {
|
|
|
5404
5537
|
fontSize: "0.875rem"
|
|
5405
5538
|
},
|
|
5406
5539
|
children: [
|
|
5407
|
-
"Error parsing prompt
|
|
5540
|
+
"Error parsing prompt",
|
|
5541
|
+
element.file ? ` "${element.file}"` : "",
|
|
5542
|
+
":",
|
|
5543
|
+
" ",
|
|
5408
5544
|
_optionalChain([parsed, 'access', _102 => _102.error, 'access', _103 => _103.issues, 'access', _104 => _104[0], 'optionalAccess', _105 => _105.message])
|
|
5409
5545
|
]
|
|
5410
5546
|
}
|
|
@@ -5477,6 +5613,7 @@ function Element({ element, onSubmit, stageDuration }) {
|
|
|
5477
5613
|
stopAt: element.stopAt,
|
|
5478
5614
|
allowScrubOutsideBounds: element.allowScrubOutsideBounds,
|
|
5479
5615
|
stepDuration: element.stepDuration,
|
|
5616
|
+
playback: element.playback,
|
|
5480
5617
|
controls: element.controls
|
|
5481
5618
|
}
|
|
5482
5619
|
);
|
|
@@ -5616,7 +5753,7 @@ function RecursiveConditionalRender({
|
|
|
5616
5753
|
}) {
|
|
5617
5754
|
const condition = conditions[0];
|
|
5618
5755
|
const referenceValues = resolve(condition.reference, condition.position);
|
|
5619
|
-
const conditionMet =
|
|
5756
|
+
const conditionMet = _chunkYUWSH74Mcjs.evaluateCondition.call(void 0, condition, referenceValues);
|
|
5620
5757
|
if (!conditionMet) return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, { children: fallback });
|
|
5621
5758
|
if (conditions.length === 1) return /* @__PURE__ */ _jsxruntime.jsx.call(void 0, _jsxruntime.Fragment, { children });
|
|
5622
5759
|
return /* @__PURE__ */ _jsxruntime.jsx.call(void 0,
|