@hpcc-js/observablehq-compiler 3.7.8 → 3.7.9

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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/index.node.ts", "../../src/kit/compiler.ts", "../../src/kit/util.ts", "../../src/parse.ts", "../../../../node_modules/@observablehq/parser/src/references.js", "../../../../node_modules/@observablehq/parser/src/walk.js", "../../../../node_modules/@observablehq/parser/src/features.js", "../../src/cst.ts", "../../src/writer.ts", "../../src/util.ts", "../../src/compiler.ts"],
4
- "sourcesContent": ["import { JSDOM } from \"jsdom\";\r\n\r\nconst { window } = new JSDOM();\r\nglobalThis.document = window.document;\r\nglobalThis.DOMParser = window.DOMParser;\r\n\r\nexport * from \"./index.ts\";\r\n", "\r\nimport { type Notebook, type Cell, transpile } from \"@observablehq/notebook-kit\";\r\nimport { type Definition } from \"@observablehq/notebook-kit/runtime\";\r\nimport { constructFunction } from \"./util.ts\";\r\n\r\nexport { Notebook, Cell };\r\n\r\nexport interface CompileCellOptions {\r\n inline?: boolean;\r\n resolveLocalImports?: boolean;\r\n includePinned?: boolean;\r\n}\r\n\r\nexport function compileCell(cell: Cell, { inline = true, resolveLocalImports = false, includePinned = true }: CompileCellOptions = {}): Definition[] {\r\n const retVal: Definition[] = [];\r\n const sourceIDOffset = 1000000;\r\n try {\r\n const compiled = transpile(cell, { resolveLocalImports });\r\n retVal.push({\r\n id: cell.id,\r\n ...compiled,\r\n body: inline ? constructFunction(compiled.body, `cell_${cell.id}`) : compiled.body,\r\n });\r\n if (includePinned && cell.pinned) {\r\n const compiled = transpile({\r\n ...cell,\r\n mode: \"md\",\r\n value: `\\\r\n\\`\\`\\`${cell.mode}\r\n${cell.value}\r\n\\`\\`\\``\r\n });\r\n retVal.push({\r\n id: sourceIDOffset + cell.id,\r\n ...compiled,\r\n body: inline ? constructFunction(compiled.body, `cell_${sourceIDOffset + cell.id}`) : compiled.body,\r\n });\r\n }\r\n } catch (error) {\r\n console.error(`Error compiling cell ${cell.id}:`, error);\r\n }\r\n return retVal;\r\n}\r\n\r\nexport function compileNotebook(notebook: Notebook, { inline = true, resolveLocalImports = false, includePinned = true }: CompileCellOptions = {}): Definition[] {\r\n const retVal: Definition[] = [];\r\n for (const cell of notebook.cells) {\r\n const cellDefs = compileCell(cell, { inline, resolveLocalImports, includePinned });\r\n retVal.push(...cellDefs);\r\n }\r\n return retVal;\r\n}\r\n\r\nexport function resetCellIDs(notebook: Notebook, start: number = 0, increment: number = 1): Notebook {\r\n for (const cell of notebook.cells) {\r\n cell.id = start;\r\n start += increment;\r\n }\r\n return notebook;\r\n}\r\n", "import { type Notebook, type Cell, parseJavaScript, serialize, deserialize, toNotebook, toCell } from \"@observablehq/notebook-kit\";\r\nimport { type Definition } from \"@observablehq/notebook-kit/runtime\";\r\n\r\nexport type { Notebook, Cell, Definition };\r\nexport { toNotebook, toCell };\r\n\r\n// Shared function constructor utilities to avoid duplication between util modules.\r\n\r\nexport type RegularFunction = (...args: any[]) => any;\r\ninterface RegularFunctionConstructor {\r\n new(...args: string[]): RegularFunction;\r\n (...args: string[]): RegularFunction;\r\n readonly prototype: RegularFunction;\r\n}\r\n\r\nexport type AsyncFunction = (...args: any[]) => Promise<any>;\r\ninterface AsyncFunctionConstructor {\r\n new(...args: string[]): AsyncFunction;\r\n (...args: string[]): AsyncFunction;\r\n readonly prototype: AsyncFunction;\r\n}\r\n\r\nexport type GeneratorFunction = (...args: any[]) => Generator<any, any, any>;\r\ninterface GeneratorFunctionConstructor {\r\n new(...args: string[]): GeneratorFunction;\r\n (...args: string[]): GeneratorFunction;\r\n readonly prototype: GeneratorFunction;\r\n}\r\n\r\nexport type AsyncGeneratorFunction = (...args: any[]) => AsyncGenerator<any, any, any>;\r\ninterface AsyncGeneratorFunctionConstructor {\r\n new(...args: string[]): AsyncGeneratorFunction;\r\n (...args: string[]): AsyncGeneratorFunction;\r\n readonly prototype: AsyncGeneratorFunction;\r\n}\r\n\r\nexport type AnyFunction = RegularFunction | AsyncFunction | GeneratorFunction | AsyncGeneratorFunction;\r\n\r\nexport const FunctionConstructors: {\r\n regular: RegularFunctionConstructor;\r\n async: AsyncFunctionConstructor;\r\n generator: GeneratorFunctionConstructor;\r\n asyncGenerator: AsyncGeneratorFunctionConstructor;\r\n} = {\r\n regular: Object.getPrototypeOf(function () { }).constructor as RegularFunctionConstructor,\r\n async: Object.getPrototypeOf(async function () { }).constructor as AsyncFunctionConstructor,\r\n generator: Object.getPrototypeOf(function* () { }).constructor as GeneratorFunctionConstructor,\r\n asyncGenerator: Object.getPrototypeOf(async function* () { }).constructor as AsyncGeneratorFunctionConstructor,\r\n};\r\n\r\nfunction funcType(async: boolean = false, generator: boolean = false) {\r\n if (!async && !generator) return FunctionConstructors.regular;\r\n if (async && !generator) return FunctionConstructors.async;\r\n if (!async && generator) return FunctionConstructors.generator;\r\n return FunctionConstructors.asyncGenerator;\r\n}\r\n\r\ninterface Ref {\r\n start: number,\r\n end: number,\r\n newText: string\r\n}\r\n\r\nexport interface Refs {\r\n inputs: string[];\r\n args: string[];\r\n patches: Ref[];\r\n}\r\n\r\nexport function createFunction(refs: Refs, async = false, generator = false, blockStatement = false, body?: string) {\r\n if (body === undefined) {\r\n return undefined;\r\n }\r\n\r\n refs.patches.sort((l, r) => r.start - l.start);\r\n refs.patches.forEach(r => {\r\n body = body!.substring(0, r.start) + r.newText + body!.substring(r.end);\r\n });\r\n return new (funcType(async, generator))(...refs.args, blockStatement ?\r\n body.substring(1, body.length - 1).trim() :\r\n `return (\\n${body}\\n);`);\r\n}\r\n\r\nfunction join(baseURL: string, relativeURL: string) {\r\n return relativeURL\r\n ? baseURL.replace(/\\/+$/, \"\") + \"/\" + relativeURL.replace(/^\\/+/, \"\")\r\n : baseURL;\r\n}\r\n\r\nexport const isRelativePath = (path: string) => path[0] === \".\";\r\nexport const fixRelativeUrl = (path: string, basePath: string) => {\r\n if (isRelativePath(path)) {\r\n return join(basePath, path);\r\n }\r\n return path;\r\n};\r\n\r\n// Hide \"import\" from bundlers as they have a habit of replacing \"import\" with \"require\"\r\nconst obfuscatedImportFunction = new FunctionConstructors.async(\"url\", \"return import(url)\");\r\nexport async function obfuscatedImport(url: string) {\r\n return obfuscatedImportFunction(url);\r\n}\r\n\r\nfunction _constructFunction(body: any, bodyStr: string, name?: string) {\r\n if (body.type !== \"FunctionExpression\" && body.type !== \"FunctionDeclaration\" && body.type !== \"ArrowFunctionExpression\") {\r\n throw new Error(`Unsupported function type: ${body.type}`);\r\n }\r\n const func = body.async && body.generator ?\r\n FunctionConstructors.asyncGenerator :\r\n body.async ?\r\n FunctionConstructors.async :\r\n body.generator ?\r\n FunctionConstructors.generator :\r\n FunctionConstructors.regular;\r\n\r\n const params = body.params?.map((param) => bodyStr.slice(param.start, param.end)).join(\", \") ?? \"\";\r\n const isBlock = body.body.type === \"BlockStatement\";\r\n const { start, end } = body.body;\r\n const inner = isBlock\r\n ? bodyStr.slice(start + 1, end - 1)\r\n : `return ${bodyStr.slice(start, end)}`;\r\n // If a name is provided, build a true named function expression for reliable naming.\r\n if (name) {\r\n // Sanitize to a valid identifier; fallback to underscored name when necessary.\r\n const sanitize = (n: string): string => {\r\n let s = n.replace(/[^A-Za-z0-9_$]/g, \"_\");\r\n if (!/^[A-Za-z_$]/.test(s)) s = \"_\" + s;\r\n return s;\r\n };\r\n const id = sanitize(name);\r\n const asyncKw = body.async ? \"async \" : \"\";\r\n const genMark = body.generator ? \"*\" : \"\";\r\n const src = `return ${asyncKw}function${genMark} ${id}(${params}) {\\n${inner}\\n}`;\r\n // Use a plain Function wrapper to evaluate the named function expression.\r\n const builtNamed = (new Function(src)()) as AnyFunction;\r\n // Expose the intended display name even if sanitization changed the identifier.\r\n try { (builtNamed as any).displayName = name; } catch { /* noop */ }\r\n return builtNamed;\r\n }\r\n\r\n const built = func(params, inner) as AnyFunction;\r\n return built;\r\n}\r\n\r\nexport function constructFunction(bodyStr: string, name?: string) {\r\n const { body } = parseJavaScript(bodyStr);\r\n if (body.type === \"Program\") {\r\n if (body.body.length !== 1) {\r\n throw new Error(`Expected a single function, but found ${body.body.length} statements`);\r\n }\r\n return _constructFunction(body.body[0], bodyStr, name);\r\n }\r\n return _constructFunction(body, bodyStr, name);\r\n}\r\n\r\nexport const html2notebook = (html: string): Notebook => deserialize(html);\r\nexport const notebook2html = (notebook: Notebook): string => serialize(notebook);\r\n", "// Compare with ../../../node_modules/@observablehq/parser/src/parse.js\r\nimport { getLineInfo, tokTypes, Statement, ModuleDeclaration, Expression as ExpressionBase, Node } from \"acorn\";\r\nimport { ancestor, RecursiveVisitors, AncestorVisitors } from \"acorn-walk\";\r\nimport { CellParser, parseCell as ohqParseCell, walk as ohqWalk } from \"@observablehq/parser\";\r\nimport defaultGlobals from \"../../../node_modules/@observablehq/parser/src/globals.js\";\r\nimport findReferences from \"../../../node_modules/@observablehq/parser/src/references.js\";\r\nimport findFeatures from \"../../../node_modules/@observablehq/parser/src/features.js\";\r\n\r\nexport interface MutableExpression extends Node {\r\n type: \"MutableExpression\"\r\n}\r\n\r\nexport interface ViewExpression extends Node {\r\n type: \"ViewExpression\"\r\n}\r\n\r\nexport type Expression = ExpressionBase | MutableExpression | ViewExpression;\r\n\r\n// Find references.\r\n// Check for illegal references to arguments.\r\n// Check for illegal assignments to global references.\r\nfunction parseReferences(cell, input, globals = defaultGlobals) {\r\n if (!cell.body) {\r\n cell.references = [];\r\n } else if (cell.body.type === \"ImportDeclaration\") {\r\n // This is correct?!?\r\n cell.references = cell.body.specifiers\r\n ? cell.body.specifiers.map(i => i.imported)\r\n : [];\r\n } else {\r\n try {\r\n cell.references = findReferences(cell, globals);\r\n } catch (error: any) {\r\n if (error.node) {\r\n const loc = getLineInfo(input, error.node.start);\r\n error.message += ` (${loc.line}:${loc.column})`;\r\n error.pos = error.node.start;\r\n error.loc = loc;\r\n delete error.node;\r\n }\r\n throw error;\r\n }\r\n }\r\n return cell;\r\n}\r\n\r\n// Find features: file attachments, secrets, database clients.\r\n// Check for illegal references to arguments.\r\n// Check for illegal assignments to global references.\r\nfunction parseFeatures(cell, input) {\r\n if (cell.body && cell.body.type !== \"ImportDeclaration\") {\r\n try {\r\n cell.fileAttachments = findFeatures(cell, \"FileAttachment\");\r\n cell.databaseClients = findFeatures(cell, \"DatabaseClient\");\r\n cell.secrets = findFeatures(cell, \"Secret\");\r\n } catch (error: any) {\r\n if (error.node) {\r\n const loc = getLineInfo(input, error.node.start);\r\n error.message += ` (${loc.line}:${loc.column})`;\r\n error.pos = error.node.start;\r\n error.loc = loc;\r\n delete error.node;\r\n }\r\n throw error;\r\n }\r\n } else {\r\n cell.fileAttachments = new Map();\r\n cell.databaseClients = new Map();\r\n cell.secrets = new Map();\r\n }\r\n return cell;\r\n}\r\n\r\nclass ModuleParser extends CellParser {\r\n\r\n parseTopLevel(node: { cells?: Cell[] }) {\r\n if (!node.cells) node.cells = [];\r\n // @ts-ignore\r\n while (this.type !== tokTypes.eof) {\r\n // @ts-ignore\r\n const cell: Cell = this.parseCell(this.startNode());\r\n // @ts-ignore\r\n cell.input = this.input;\r\n node.cells.push(cell);\r\n }\r\n // @ts-ignore\r\n this.next();\r\n // @ts-ignore\r\n return this.finishNode(node, \"Program\");\r\n }\r\n}\r\n\r\n// @ts-ignore\r\nexport function parseModule(input, { globals }: { globals: any } = {}) {\r\n // @ts-ignore\r\n const program = ModuleParser.parse(input, { ecmaVersion: 2020 });\r\n for (const cell of program.cells) {\r\n parseReferences(cell, input, globals);\r\n parseFeatures(cell, input);\r\n }\r\n return program;\r\n}\r\n\r\nexport interface Cell extends Node {\r\n type: \"Cell\";\r\n id: Expression;\r\n text: string;\r\n body?: Statement | ModuleDeclaration | Expression;\r\n references: unknown[];\r\n async: boolean;\r\n generator: boolean;\r\n strict: boolean;\r\n}\r\n\r\nexport function splitModule(input: string): Cell[] {\r\n return (ModuleParser as any)\r\n .parse(input, { ecmaVersion: \"latest\" })\r\n .cells.map((cell: any) => ({\r\n type: \"Cell\",\r\n text: input.substring(cell.start, cell.end),\r\n start: cell.start,\r\n end: cell.end\r\n }));\r\n}\r\n\r\nexport {\r\n type Node,\r\n ancestor,\r\n type AncestorVisitors\r\n};\r\n\r\nexport function parseCell(input: string): Cell {\r\n return ohqParseCell(input);\r\n}\r\n\r\nexport const walk: RecursiveVisitors<any> = ohqWalk;\r\n", "// Based on https://github.com/ForbesLindesay/acorn-globals\n// Copyright (c) 2014 Forbes Lindesay\n// https://github.com/ForbesLindesay/acorn-globals/blob/master/LICENSE\n\nimport {ancestor} from \"acorn-walk\";\nimport walk from \"./walk.js\";\n\nfunction isScope(node) {\n return node.type === \"FunctionExpression\"\n || node.type === \"FunctionDeclaration\"\n || node.type === \"ArrowFunctionExpression\"\n || node.type === \"Program\";\n}\n\nfunction isBlockScope(node) {\n return node.type === \"BlockStatement\"\n || node.type === \"ForInStatement\"\n || node.type === \"ForOfStatement\"\n || node.type === \"ForStatement\"\n || isScope(node);\n}\n\nfunction declaresArguments(node) {\n return node.type === \"FunctionExpression\"\n || node.type === \"FunctionDeclaration\";\n}\n\nexport default function findReferences(cell, globals) {\n const ast = {type: \"Program\", body: [cell.body]};\n const locals = new Map;\n const globalSet = new Set(globals);\n const references = [];\n\n function hasLocal(node, name) {\n const l = locals.get(node);\n return l ? l.has(name) : false;\n }\n\n function declareLocal(node, id) {\n const l = locals.get(node);\n if (l) l.add(id.name);\n else locals.set(node, new Set([id.name]));\n }\n\n function declareClass(node) {\n if (node.id) declareLocal(node, node.id);\n }\n\n function declareFunction(node) {\n node.params.forEach(param => declarePattern(param, node));\n if (node.id) declareLocal(node, node.id);\n }\n\n function declareCatchClause(node) {\n if (node.param) declarePattern(node.param, node);\n }\n\n function declarePattern(node, parent) {\n switch (node.type) {\n case \"Identifier\":\n declareLocal(parent, node);\n break;\n case \"ObjectPattern\":\n node.properties.forEach(node => declarePattern(node, parent));\n break;\n case \"ArrayPattern\":\n node.elements.forEach(node => node && declarePattern(node, parent));\n break;\n case \"Property\":\n declarePattern(node.value, parent);\n break;\n case \"RestElement\":\n declarePattern(node.argument, parent);\n break;\n case \"AssignmentPattern\":\n declarePattern(node.left, parent);\n break;\n default:\n throw new Error(\"Unrecognized pattern type: \" + node.type);\n }\n }\n\n function declareModuleSpecifier(node) {\n declareLocal(ast, node.local);\n }\n\n ancestor(\n ast,\n {\n VariableDeclaration: (node, parents) => {\n let parent = null;\n for (let i = parents.length - 1; i >= 0 && parent === null; --i) {\n if (node.kind === \"var\" ? isScope(parents[i]) : isBlockScope(parents[i])) {\n parent = parents[i];\n }\n }\n node.declarations.forEach(declaration => declarePattern(declaration.id, parent));\n },\n FunctionDeclaration: (node, parents) => {\n let parent = null;\n for (let i = parents.length - 2; i >= 0 && parent === null; --i) {\n if (isScope(parents[i])) {\n parent = parents[i];\n }\n }\n declareLocal(parent, node.id);\n declareFunction(node);\n },\n Function: declareFunction,\n ClassDeclaration: (node, parents) => {\n let parent = null;\n for (let i = parents.length - 2; i >= 0 && parent === null; i--) {\n if (isScope(parents[i])) {\n parent = parents[i];\n }\n }\n declareLocal(parent, node.id);\n },\n Class: declareClass,\n CatchClause: declareCatchClause,\n ImportDefaultSpecifier: declareModuleSpecifier,\n ImportSpecifier: declareModuleSpecifier,\n ImportNamespaceSpecifier: declareModuleSpecifier\n },\n walk\n );\n\n function identifier(node, parents) {\n let name = node.name;\n if (name === \"undefined\") return;\n for (let i = parents.length - 2; i >= 0; --i) {\n if (name === \"arguments\") {\n if (declaresArguments(parents[i])) {\n return;\n }\n }\n if (hasLocal(parents[i], name)) {\n return;\n }\n if (parents[i].type === \"ViewExpression\") {\n node = parents[i];\n name = `viewof ${node.id.name}`;\n }\n if (parents[i].type === \"MutableExpression\") {\n node = parents[i];\n name = `mutable ${node.id.name}`;\n }\n }\n if (!globalSet.has(name)) {\n if (name === \"arguments\") {\n throw Object.assign(new SyntaxError(`arguments is not allowed`), {node});\n }\n references.push(node);\n }\n }\n\n ancestor(\n ast,\n {\n VariablePattern: identifier,\n Identifier: identifier\n },\n walk\n );\n\n function checkConst(node, parents) {\n if (!node) return;\n switch (node.type) {\n case \"Identifier\":\n case \"VariablePattern\": {\n for (const parent of parents) {\n if (hasLocal(parent, node.name)) {\n return;\n }\n }\n if (parents[parents.length - 2].type === \"MutableExpression\") {\n return;\n }\n throw Object.assign(new SyntaxError(`Assignment to constant variable ${node.name}`), {node});\n }\n case \"ArrayPattern\": {\n for (const element of node.elements) {\n checkConst(element, parents);\n }\n return;\n }\n case \"ObjectPattern\": {\n for (const property of node.properties) {\n checkConst(property, parents);\n }\n return;\n }\n case \"Property\": {\n checkConst(node.value, parents);\n return;\n }\n case \"RestElement\": {\n checkConst(node.argument, parents);\n return;\n }\n }\n }\n\n function checkConstArgument(node, parents) {\n checkConst(node.argument, parents);\n }\n\n function checkConstLeft(node, parents) {\n checkConst(node.left, parents);\n }\n\n ancestor(\n ast,\n {\n AssignmentExpression: checkConstLeft,\n AssignmentPattern: checkConstLeft,\n UpdateExpression: checkConstArgument,\n ForOfStatement: checkConstLeft,\n ForInStatement: checkConstLeft\n },\n walk\n );\n\n return references;\n}\n", "import {make} from \"acorn-walk\";\n\nexport default make({\n Import() {},\n ViewExpression(node, st, c) {\n c(node.id, st, \"Identifier\");\n },\n MutableExpression(node, st, c) {\n c(node.id, st, \"Identifier\");\n }\n});\n", "import {simple} from \"acorn-walk\";\nimport walk from \"./walk.js\";\n\nexport default function findFeatures(cell, featureName) {\n const ast = {type: \"Program\", body: [cell.body]};\n const features = new Map();\n const {references} = cell;\n\n simple(\n ast,\n {\n CallExpression: node => {\n const {callee, arguments: args} = node;\n\n // Ignore function calls that are not references to the feature.\n if (\n callee.type !== \"Identifier\" ||\n callee.name !== featureName ||\n references.indexOf(callee) < 0\n ) return;\n\n // Forbid dynamic calls.\n if (\n args.length !== 1 ||\n !((args[0].type === \"Literal\" && /^['\"]/.test(args[0].raw)) ||\n (args[0].type === \"TemplateLiteral\" && args[0].expressions.length === 0))\n ) {\n throw Object.assign(new SyntaxError(`${featureName} requires a single literal string argument`), {node});\n }\n\n const [arg] = args;\n const name = arg.type === \"Literal\" ? arg.value : arg.quasis[0].value.cooked;\n const location = {start: arg.start, end: arg.end};\n if (features.has(name)) features.get(name).push(location);\n else features.set(name, [location]);\n }\n },\n walk\n );\n\n return features;\n}\n", "import { ancestor, parseCell as ohqParseCell, Cell, Node, walk, AncestorVisitors } from \"./observable-shim.ts\";\r\nimport { fixRelativeUrl, createFunction, Refs } from \"./kit/index.ts\";\r\n\r\nfunction calcRefs(cellAst: Cell, cellStr: string): Refs {\r\n if (cellAst.references === undefined) return { inputs: [], args: [], patches: [] };\r\n\r\n const dedup: { [id: string]: boolean } = {};\r\n cellAst.references.forEach((r: any) => dedup[cellStr.substring(r.start, r.end)] = true);\r\n const retVal: Refs = {\r\n inputs: Object.keys(dedup),\r\n args: Object.keys(dedup).map(r => r.split(\" \").join(\"_\")),\r\n patches: []\r\n };\r\n const pushPatch = (node: Node, newText: string) => retVal.patches.push({ start: node.start - (cellAst.body?.start ?? 0), end: node.end - (cellAst.body?.start ?? 0), newText });\r\n if (cellAst.body) {\r\n ancestor(cellAst.body, {\r\n Identifier(node) {\r\n const value = cellStr.substring(node.start, node.end);\r\n if (dedup[value]) {\r\n }\r\n },\r\n MutableExpression(node: Node) {\r\n const value = cellStr.substring(node.start, node.end);\r\n const newText = value.split(\" \").join(\"_\") + \".value\";\r\n pushPatch(node, newText);\r\n },\r\n ViewExpression(node: Node) {\r\n const value = cellStr.substring(node.start, node.end);\r\n const newText = value.split(\" \").join(\"_\");\r\n pushPatch(node, newText);\r\n },\r\n ThisExpression(node: Node, ancestors: Node[]) {\r\n const value = cellStr.substring(node.start, node.end);\r\n if (value === \"this\" && !ancestors.find(n => n.type === \"FunctionExpression\")) {\r\n pushPatch(node, \"((this === globalThis || this === globalThis.window)? undefined : this?.valueOf())\");\r\n }\r\n }\r\n } as AncestorVisitors<any>, walk);\r\n }\r\n return retVal;\r\n}\r\n\r\nexport interface ParsedCell {\r\n type: \"import\" | \"viewof\" | \"mutable\" | \"variable\" | \"identifier\"\r\n}\r\n\r\nexport interface ParsedImportCell extends ParsedCell {\r\n type: \"import\"\r\n src: string;\r\n specifiers: { view: boolean, name: string, alias?: string }[];\r\n injections: { name: string, alias: string }[];\r\n}\r\n\r\nfunction parseImportDeclaration(cellAst: any): ParsedImportCell {\r\n return {\r\n type: \"import\",\r\n src: cellAst.body.source.value,\r\n specifiers: cellAst.body.specifiers?.map((spec: any) => {\r\n return {\r\n view: spec.view,\r\n name: spec.imported.name,\r\n alias: (spec.local?.name && spec.imported.name !== spec.local.name) ? spec.local.name : spec.imported.name\r\n };\r\n }) ?? [],\r\n injections: cellAst.body.injections?.map((inj: any) => {\r\n return {\r\n name: inj.imported.name,\r\n alias: inj.local?.name ?? inj.imported.name\r\n };\r\n }) ?? [],\r\n };\r\n}\r\n\r\nexport interface ParsedVariable extends ParsedCell {\r\n type: \"variable\"\r\n id?: string,\r\n inputs: string[],\r\n func: any,\r\n}\r\n\r\nexport interface ParsedViewCell extends ParsedCell {\r\n type: \"viewof\",\r\n variable: ParsedVariable;\r\n variableValue: ParsedVariable;\r\n}\r\n\r\nfunction parseViewExpression(cellStr: string, cellAst: any, refs: Refs, bodyStr?: string): ParsedViewCell {\r\n const id = cellAst.id && cellStr.substring(cellAst.id.start, cellAst.id.end);\r\n return {\r\n type: \"viewof\",\r\n variable: {\r\n type: \"variable\",\r\n id,\r\n inputs: refs.inputs,\r\n func: createFunction(refs, cellAst.async, cellAst.generator, cellAst.body.type === \"BlockStatement\", bodyStr)\r\n },\r\n variableValue: {\r\n type: \"variable\",\r\n id: cellAst?.id?.id?.name,\r\n inputs: [\"Generators\", id],\r\n func: (G: any, _: any) => G.input(_)\r\n }\r\n };\r\n}\r\n\r\ninterface ParsedMutableCell extends ParsedCell {\r\n type: \"mutable\",\r\n initial: ParsedVariable;\r\n variable: ParsedVariable;\r\n variableValue: ParsedVariable;\r\n}\r\n\r\nfunction parseMutableExpression(cellStr: string, cellAst: any, refs: Refs, bodyStr?: string): ParsedMutableCell {\r\n const id = cellAst.id && cellStr.substring(cellAst.id.start, cellAst.id.end);\r\n const initialValueId = cellAst?.id?.id?.name;\r\n const initialId = `initial ${initialValueId}`;\r\n return {\r\n type: \"mutable\",\r\n initial: {\r\n type: \"variable\",\r\n id: initialId,\r\n inputs: refs.inputs,\r\n func: createFunction(refs, cellAst.async, cellAst.generator, cellAst.body.type === \"BlockStatement\", bodyStr)\r\n },\r\n variable: {\r\n type: \"variable\",\r\n id,\r\n inputs: [\"Mutable\", initialId],\r\n func: (M: any, _: any) => new M(_)\r\n },\r\n variableValue: {\r\n type: \"variable\",\r\n id: initialValueId,\r\n inputs: [id],\r\n func: (_: any) => _.generator\r\n }\r\n };\r\n}\r\n\r\ninterface ParsedVariableCell extends ParsedCell {\r\n type: \"variable\",\r\n id: string,\r\n inputs: string[],\r\n func: any,\r\n}\r\n\r\nfunction parseVariableExpression(cellStr: string, cellAst: any, refs: Refs, bodyStr?: string): ParsedVariableCell {\r\n return {\r\n type: \"variable\",\r\n id: cellAst.id && cellStr.substring(cellAst.id?.start, cellAst.id?.end),\r\n inputs: refs.inputs,\r\n func: createFunction(refs, cellAst.async, cellAst.generator, cellAst.body.type === \"BlockStatement\", bodyStr)\r\n };\r\n}\r\n\r\nexport function parseCell(cellStr: string, baseUrl: string): ParsedImportCell | ParsedViewCell | ParsedMutableCell | ParsedVariableCell {\r\n const cellAst = ohqParseCell(cellStr);\r\n let bodyStr = cellAst.body && cellStr.substring(cellAst.body.start, cellAst.body.end);\r\n switch ((cellAst.body)?.type) {\r\n case \"ImportDeclaration\":\r\n return parseImportDeclaration(cellAst);\r\n case \"ImportExpression\":\r\n switch (cellAst.body.source.type) {\r\n case \"Literal\":\r\n bodyStr = `import(\"${fixRelativeUrl(\"\" + cellAst.body.source.value, baseUrl)}\")`;\r\n break;\r\n default:\r\n console.error(\"Unexpected import value\");\r\n }\r\n }\r\n const refs = calcRefs(cellAst, cellStr);\r\n switch (cellAst.id?.type) {\r\n case \"ViewExpression\":\r\n return parseViewExpression(cellStr, cellAst, refs, bodyStr);\r\n case \"MutableExpression\":\r\n return parseMutableExpression(cellStr, cellAst, refs, bodyStr);\r\n default:\r\n return parseVariableExpression(cellStr, cellAst, refs, bodyStr);\r\n }\r\n}\r\n\r\n", "import { ohq } from \"./observable-shim.ts\";\r\nimport { ParsedImportCell, ParsedVariable } from \"./cst.ts\";\r\n\r\nexport class Writer {\r\n\r\n protected _files: ohq.File[] = [];\r\n protected _imports: string[] = [];\r\n protected _functions: string[] = [];\r\n protected _defines: string[] = [];\r\n protected _defineUid = 0;\r\n protected _functionUid = 0;\r\n\r\n constructor() {\r\n }\r\n\r\n toString() {\r\n return `\\\r\n${this._imports.join(\"\\n\")}\r\n\r\n${this._functions.join(\"\\n\").split(\"\\n) {\").join(\"){\")}\r\n\r\nexport default function define(runtime, observer) {\r\n const main = runtime.module();\r\n\r\n function toString() { return this.url; }\r\n const fileAttachments = new Map([\r\n ${this._files.map(f => `[\"${f.name}\", { url: new URL(\"${f.url}\"), mimeType: ${JSON.stringify(f.mime_type)}, toString }]`).join(\",\\n \")}\r\n ]);\r\n main.builtin(\"FileAttachment\", runtime.fileAttachments(name => fileAttachments.get(name)));\r\n\r\n ${this._defines.join(\"\\n \")}\r\n\r\n return main;\r\n}\\n`;\r\n }\r\n\r\n files(files: ohq.File[]) {\r\n this._files = [...this._files, ...files];\r\n }\r\n\r\n import(url: string) {\r\n this._imports.push(`import define${++this._defineUid} from \"${url}\"; `);\r\n }\r\n\r\n importDefine(imp: Partial<ParsedImportCell>) {\r\n const impInjections = imp.injections ?? [];\r\n const injections = impInjections.map(inj => {\r\n return inj.name === inj.alias ?\r\n `\"${inj.name}\"` :\r\n `{name: \"${inj.name}\", alias: \"${inj.alias}\"}`;\r\n });\r\n const derive = impInjections.length ? `.derive([${injections.join(\", \")}], main)` : \"\";\r\n this._defines.push(`const child${this._defineUid} = runtime.module(define${this._defineUid})${derive};`);\r\n const impSpecifiers = imp.specifiers ?? [];\r\n impSpecifiers.forEach(s => {\r\n this._defines.push(`main.import(\"${s.name}\"${s.alias && s.alias !== s.name ? `, \"${s.alias}\"` : \"\"}, child${this._defineUid}); `);\r\n });\r\n }\r\n\r\n function(variable: Partial<ParsedVariable>) {\r\n let id = variable.id ?? `${++this._functionUid}`;\r\n const idParts = id.split(\" \");\r\n id = `_${idParts[idParts.length - 1]}`;\r\n this._functions.push(`${variable.func?.toString()?.replace(\"anonymous\", `${id}`)}`);\r\n return id;\r\n }\r\n\r\n define(variable: Partial<ParsedVariable>, observable = true, inlineFunc = false, funcId?: string) {\r\n funcId = funcId ?? variable.id;\r\n const observe = observable ? `.variable(observer(${variable.id ? JSON.stringify(variable.id) : \"\"}))` : \"\";\r\n const id = variable.id ? `${JSON.stringify(variable.id)}, ` : \"\";\r\n const variableInputs = variable.inputs ?? [];\r\n const inputs = variableInputs.length ? `[${variableInputs.map(i => JSON.stringify(i)).join(\", \")}], ` : \"\";\r\n const func = inlineFunc ?\r\n variable.func?.toString() :\r\n funcId;\r\n this._defines.push(`main${observe}.define(${id}${inputs}${func});`);\r\n }\r\n\r\n error(msg: string) {\r\n }\r\n}\r\n\r\n", "import { type Notebook, type Cell, toNotebook, toCell } from \"./kit/index.ts\";\r\n\r\nimport type { ohq } from \"./observable-shim.ts\";\r\nimport { parseCell, splitModule } from \"./observable-shim.ts\";\r\n\r\ninterface ParsedOJS {\r\n ojs: string;\r\n offset: number;\r\n inlineMD: boolean;\r\n cell: any;\r\n error: any;\r\n}\r\n\r\nexport function encodeBacktick(str: string) {\r\n return str\r\n .split(\"`\").join(\"\\\\`\")\r\n ;\r\n}\r\n\r\nfunction createParsedOJS(ojs: string, offset: number, inlineMD: boolean): ParsedOJS {\r\n let cell;\r\n let error;\r\n try {\r\n cell = parseCell(ojs);\r\n } catch (e) {\r\n error = e;\r\n }\r\n return {\r\n ojs,\r\n offset,\r\n inlineMD,\r\n cell,\r\n error\r\n };\r\n}\r\n\r\nfunction splitOmd(_: string): ParsedOJS[] {\r\n const retVal: ParsedOJS[] = [];\r\n // Load Markdown ---\r\n const re = /(```(?:\\s|\\S)[\\s\\S]*?```)/g;\r\n let prevOffset = 0;\r\n let match = re.exec(_);\r\n while (match !== null) {\r\n if (match.index > prevOffset) {\r\n retVal.push(createParsedOJS(_.substring(prevOffset, match.index), prevOffset, true));\r\n }\r\n\r\n const outer = match[0];\r\n if (outer.indexOf(\"``` \") === 0 || outer.indexOf(\"```\\n\") === 0 || outer.indexOf(\"```\\r\\n\") === 0) {\r\n const prefixLen = 3;\r\n const inner = outer.substring(prefixLen, outer.length - prefixLen);\r\n retVal.push(createParsedOJS(inner, match.index + prefixLen, false));\r\n } else {\r\n retVal.push(createParsedOJS(outer, match.index, true));\r\n }\r\n\r\n prevOffset = match.index + match[0].length;\r\n match = re.exec(_);\r\n }\r\n if (_.length > prevOffset) {\r\n retVal.push(createParsedOJS(_.substring(prevOffset, _.length), prevOffset, true));\r\n }\r\n return retVal;\r\n}\r\n\r\nexport function notebook2ojs(_: string): ParsedOJS[] {\r\n const parsed: ohq.Notebook = JSON.parse(_);\r\n return parsed.nodes.map(node => createParsedOJS(node.value, 0, node.mode === \"md\"));\r\n}\r\n\r\nexport function ojs2notebook(ojs: string): ohq.Notebook {\r\n const cells = splitModule(ojs);\r\n return {\r\n files: [],\r\n nodes: cells.map((cell, idx) => {\r\n return {\r\n id: idx,\r\n mode: \"js\",\r\n value: cell.text,\r\n start: cell.start,\r\n end: cell.end\r\n };\r\n })\r\n } as ohq.Notebook;\r\n}\r\n\r\nexport function ojs2notebookKit(ojs: string): Notebook {\r\n const cells: Cell[] = splitModule(ojs).map((cell, idx) => {\r\n return toCell({\r\n id: idx,\r\n mode: \"ojs\",\r\n value: cell.text\r\n });\r\n });\r\n return toNotebook({ cells });\r\n}\r\n\r\nexport function omd2notebook(omd: string): ohq.Notebook {\r\n const cells = splitOmd(omd);\r\n return {\r\n files: [],\r\n nodes: cells.map((cell, idx) => {\r\n return {\r\n id: idx,\r\n mode: cell.inlineMD ? \"md\" : \"js\",\r\n value: cell.ojs,\r\n start: cell.offset,\r\n end: cell.offset + cell.ojs.length\r\n };\r\n })\r\n } as ohq.Notebook;\r\n}\r\n\r\nexport function omd2notebookKit(omd: string): Notebook {\r\n const cells: Cell[] = [];\r\n splitOmd(omd).forEach((cell) => {\r\n if (!cell.inlineMD) {\r\n splitModule(cell.ojs).forEach((subCell) => {\r\n cells.push(toCell({\r\n id: cells.length + 1,\r\n mode: \"ojs\",\r\n value: subCell.text\r\n }));\r\n });\r\n } else {\r\n cells.push(toCell({\r\n id: cells.length + 1,\r\n mode: \"md\",\r\n value: cell.ojs\r\n }));\r\n }\r\n });\r\n return toNotebook({ cells });\r\n}\r\n\r\nexport function fetchEx(url: string, proxyPrefix = \"https://api.codetabs.com/v1/proxy/?quest=\", proxyPostfix = \"\") {\r\n const matches = url.match(/^(?:https?:\\/\\/)?(?:[^@\\n]+@)?(?:www\\.)?([^:\\/\\n?]+)/img);\r\n if (!matches || matches.length === 0) {\r\n throw new Error(`Invalid URL: ${url}`);\r\n }\r\n return fetch(url, { headers: { origin: matches[0], referer: url } }).then(response => {\r\n if (response.ok) return response;\r\n throw new Error(\"CORS?\");\r\n }).catch(e => {\r\n url = `${proxyPrefix}${url}${proxyPostfix}`;\r\n return fetch(url, { headers: { origin: matches[0], referer: url } });\r\n });\r\n}\r\n\r\nexport function download(impUrl: string, proxyPrefix?: string, proxyPostfix?: string): Promise<ohq.Notebook> {\r\n const isShared = impUrl.indexOf(\"https://observablehq.com/d\") === 0;\r\n return fetchEx(impUrl.replace(`https://observablehq.com/${isShared ? \"d/\" : \"\"}`, \"https://api.observablehq.com/document/\"), proxyPrefix, proxyPostfix)\r\n .then(r => r.json())\r\n ;\r\n}\r\n", "\r\nimport { type Notebook, type Definition, compileNotebook, fixRelativeUrl, isRelativePath, obfuscatedImport } from \"./kit/index.ts\";\r\nimport { ohq, splitModule } from \"./observable-shim.ts\";\r\nimport { parseCell, ParsedImportCell } from \"./cst.ts\";\r\nimport { Writer } from \"./writer.ts\";\r\nimport { encodeBacktick, fetchEx, ojs2notebook, omd2notebook } from \"./util.ts\";\r\n\r\n// Inspector Factory ---\r\nexport type InspectorFactoryEx = (name: string | undefined, id: string | number) => Inspector;\r\n\r\nexport interface Inspector {\r\n _node?: HTMLDivElement;\r\n pending(): void;\r\n fulfilled(value: any): void;\r\n rejected(error: Error): void;\r\n}\r\n\r\n// Module ---\r\n\r\ninterface ImportDefine {\r\n (runtime: ohq.Runtime, inspector?: InspectorFactoryEx): ohq.Module;\r\n delete: () => void;\r\n write: (w: Writer) => void;\r\n}\r\n\r\nasync function importFile(relativePath: string, baseUrl: string) {\r\n const path = fixRelativeUrl(relativePath, baseUrl);\r\n const content = await fetchEx(path).then(r => r.text());\r\n let notebook: ohq.Notebook;\r\n if (relativePath.endsWith(\".ojsnb\")) {\r\n notebook = JSON.parse(content);\r\n } else if (relativePath.endsWith(\".ojs\")) {\r\n notebook = ojs2notebook(content);\r\n } else if (relativePath.endsWith(\".omd\")) {\r\n notebook = omd2notebook(content);\r\n } else {\r\n console.warn(`Unknown file type: ${relativePath}, assuming .ojsnb`);\r\n notebook = JSON.parse(content);\r\n }\r\n const retVal: ImportDefine = compile(notebook, { baseUrl }) as any;\r\n retVal.delete = () => { };\r\n retVal.write = (w: Writer) => {\r\n w.import(path);\r\n };\r\n return retVal;\r\n}\r\n\r\n// Import precompiled notebook from observable ---\r\nasync function importCompiledNotebook(partial: string) {\r\n const url = `https://api.observablehq.com/${partial[0] === \"@\" ? partial : `d/${partial}`}.js?v=3`;\r\n let impMod = {\r\n default: function (runtime: ohq.Runtime, inspector?: InspectorFactoryEx): ohq.Module | undefined {\r\n return undefined;\r\n } as any\r\n };\r\n try {\r\n impMod = await obfuscatedImport(url);\r\n } catch (e) {\r\n }\r\n const retVal: ImportDefine = impMod.default;\r\n retVal.delete = () => { };\r\n retVal.write = (w: Writer) => {\r\n w.import(url);\r\n };\r\n return retVal;\r\n}\r\n\r\n// Recursive notebook parsing and compiling\r\nasync function importNotebook(partial: string) {\r\n const url = `https://api.observablehq.com/document/${partial}`;\r\n const notebook = fetchEx(url)\r\n .then(r => {\r\n return r.json();\r\n }).catch(e => {\r\n console.error(url);\r\n console.error(e);\r\n });\r\n const retVal: ImportDefine = compile(await notebook) as any;\r\n retVal.delete = () => { };\r\n retVal.write = (w: Writer) => {\r\n w.import(url);\r\n };\r\n return retVal;\r\n}\r\n\r\nasync function createModule(node: ohq.Node, parsed: ParsedImportCell, text: string, { baseUrl, importMode }: CompileOptions) {\r\n const otherModule = isRelativePath(parsed.src) ?\r\n await importFile(parsed.src, baseUrl ?? \"\") :\r\n importMode === \"recursive\" ?\r\n await importNotebook(parsed.src) :\r\n await importCompiledNotebook(parsed.src);\r\n\r\n const importVariables: ImportVariableFunc[] = [];\r\n const variables: VariableFunc[] = [];\r\n parsed.specifiers.forEach(spec => {\r\n const viewof = spec.view ? \"viewof \" : \"\";\r\n importVariables.push(createImportVariable(viewof + spec.name, viewof + spec.alias));\r\n if (spec.view) {\r\n importVariables.push(createImportVariable(spec.name, spec.alias));\r\n }\r\n });\r\n\r\n const retVal = (runtime: ohq.Runtime, main: ohq.Module, inspector?: InspectorFactoryEx) => {\r\n\r\n let mod = runtime.module(otherModule);\r\n if (parsed.injections.length) {\r\n mod = mod.derive(parsed.injections, main);\r\n }\r\n variables.forEach(v => v(main, inspector));\r\n importVariables.forEach(v => v(main, mod));\r\n return mod;\r\n };\r\n retVal.importVariables = importVariables;\r\n retVal.variables = variables;\r\n retVal.delete = () => {\r\n importVariables.forEach(v => v.delete());\r\n variables.forEach(v => v.delete());\r\n otherModule.delete();\r\n };\r\n retVal.write = (w: Writer) => {\r\n otherModule.write(w);\r\n w.importDefine(parsed);\r\n };\r\n return retVal;\r\n}\r\ntype ModuleFunc = Awaited<ReturnType<typeof createModule>>;\r\n\r\n// Variable ---\r\nfunction createVariable(node: ohq.Node, inspect: boolean, name?: string, inputs?: string[], definition?: any, inline = false) {\r\n\r\n let i: ohq.Inspector | undefined;\r\n let v: ohq.Variable | undefined;\r\n\r\n const retVal = (module: ohq.Module, inspector?: InspectorFactoryEx) => {\r\n if (inspect && inspector) {\r\n i = inspector(name, node.id);\r\n }\r\n v = module.variable(i);\r\n if (arguments.length > 1) {\r\n try {\r\n v.define(name, inputs, definition);\r\n } catch (e: any) {\r\n console.error(e?.message);\r\n }\r\n }\r\n if (node.pinned) {\r\n v = inspector ? module.variable(inspector(name, node.id)) : module.variable();\r\n try {\r\n v.define(undefined, [\"md\"], (md: any) => {\r\n return md`\\`\\`\\`js\r\n${node.value}\r\n\\`\\`\\``;\r\n });\r\n } catch (e: any) {\r\n console.error(e?.message);\r\n }\r\n }\r\n return v;\r\n };\r\n retVal.delete = () => {\r\n try {\r\n i?._node?.remove();\r\n } catch (e) {\r\n }\r\n i = undefined;\r\n try {\r\n v?.delete();\r\n } catch (e) {\r\n }\r\n v = undefined;\r\n };\r\n retVal.write = (w: Writer) => {\r\n if (inline) {\r\n w.define({ id: name, inputs, func: definition }, inspect, true);\r\n } else {\r\n const id = w.function({ id: name, func: definition });\r\n w.define({ id: name, inputs, func: definition }, inspect, false, id);\r\n }\r\n };\r\n return retVal;\r\n}\r\ntype VariableFunc = ReturnType<typeof createVariable>;\r\n\r\nfunction createImportVariable(name: string, alias?: string) {\r\n\r\n let v: ohq.Variable;\r\n\r\n const retVal = (main: ohq.Module, otherModule: ohq.Module) => {\r\n v = main.variable();\r\n if (alias === undefined) {\r\n v.import(name, otherModule);\r\n } else {\r\n v.import(name, alias, otherModule);\r\n }\r\n };\r\n\r\n retVal.delete = () => {\r\n v?.delete();\r\n };\r\n return retVal;\r\n}\r\ntype ImportVariableFunc = ReturnType<typeof createImportVariable>;\r\n\r\n// Cell ---\r\nasync function createCell(node: ohq.Node, options: CompileOptions) {\r\n const modules: ModuleFunc[] = [];\r\n const variables: VariableFunc[] = [];\r\n try {\r\n const text = node.mode && node.mode !== \"js\" ? `${node.mode}\\`${encodeBacktick(node.value)}\\`` : node.value;\r\n const parsedModule = splitModule(text);\r\n for (const cell of parsedModule) {\r\n const parsed = parseCell(cell.text, options.baseUrl ?? \"\");\r\n switch (parsed.type) {\r\n case \"import\":\r\n modules.push(await createModule(node, parsed, cell.text, options));\r\n break;\r\n case \"viewof\":\r\n variables.push(createVariable(node, true, parsed.variable.id, parsed.variable.inputs, parsed.variable.func));\r\n variables.push(createVariable(node, false, parsed.variableValue.id, parsed.variableValue.inputs, parsed.variableValue.func, true));\r\n break;\r\n case \"mutable\":\r\n variables.push(createVariable(node, false, parsed.initial.id, parsed.initial.inputs, parsed.initial.func));\r\n variables.push(createVariable(node, false, parsed.variable.id, parsed.variable.inputs, parsed.variable.func));\r\n variables.push(createVariable(node, true, parsed.variableValue.id, parsed.variableValue.inputs, parsed.variableValue.func, true));\r\n break;\r\n case \"variable\":\r\n variables.push(createVariable(node, true, parsed.id, parsed.inputs, parsed.func));\r\n break;\r\n }\r\n }\r\n } catch (e: any) {\r\n variables.push(createVariable(node, true, undefined, [], e.message ?? \"Unkown error\"));\r\n }\r\n\r\n const retVal = (runtime: ohq.Runtime, main: ohq.Module, inspector?: InspectorFactoryEx) => {\r\n modules.forEach(imp => imp(runtime, main, inspector));\r\n variables.forEach(v => v(main, inspector));\r\n };\r\n retVal.id = node.id;\r\n retVal.modules = modules;\r\n retVal.variables = variables;\r\n retVal.delete = () => {\r\n variables.forEach(v => v.delete());\r\n modules.forEach(mod => mod.delete());\r\n };\r\n retVal.write = (w: Writer) => {\r\n modules.forEach(imp => imp.write(w));\r\n variables.forEach(v => v.write(w));\r\n };\r\n return retVal;\r\n}\r\nexport type CellFunc = Awaited<ReturnType<typeof createCell>>;\r\n\r\n// File ---\r\nfunction createFile(file: ohq.File, options: CompileOptions): [string, any] {\r\n function toString() {\r\n // TODO Double check url should not be URL?\r\n return (globalThis as any).url ?? \"\";\r\n }\r\n return [file.name, { url: new URL(fixRelativeUrl(file.url, options.baseUrl ?? \"\")), mimeType: file.mime_type, toString }];\r\n}\r\ntype FileFunc = ReturnType<typeof createFile>;\r\n\r\n// Interpret ---\r\nexport interface CompileOptions {\r\n baseUrl?: string;\r\n importMode?: \"recursive\" | \"precompiled\";\r\n}\r\nexport function notebook(_files: ohq.File[] = [], _cells: CellFunc[] = [], { baseUrl = \".\", importMode = \"precompiled\" }: CompileOptions = {}) {\r\n const files: FileFunc[] = _files.map(f => createFile(f, { baseUrl, importMode }));\r\n const fileAttachments = new Map<string, any>(files);\r\n const cells = new Map<string | number, CellFunc>(_cells.map(c => [c.id, c]));\r\n\r\n const retVal = (runtime: ohq.Runtime, inspector?: InspectorFactoryEx): ohq.Module => {\r\n const main = runtime.module();\r\n main.builtin(\"FileAttachment\", runtime.fileAttachments(name => {\r\n return fileAttachments.get(name) ?? { url: new URL(fixRelativeUrl(name, baseUrl)), mimeType: null };\r\n }));\r\n main.builtin(\"fetchEx\", fetchEx);\r\n\r\n cells.forEach(cell => {\r\n cell(runtime, main, inspector);\r\n });\r\n return main;\r\n };\r\n retVal.fileAttachments = fileAttachments;\r\n retVal.cells = cells;\r\n retVal.set = async (n: ohq.Node): Promise<CellFunc> => {\r\n const cell = await createCell(n, { baseUrl, importMode });\r\n retVal.delete(cell.id);\r\n cells.set(cell.id, cell);\r\n return cell;\r\n };\r\n retVal.get = (id: string | number): CellFunc | undefined => {\r\n return cells.get(id);\r\n };\r\n retVal.delete = (id: string | number): boolean => {\r\n const cell = cells.get(id);\r\n if (cell) {\r\n cell.delete();\r\n return cells.delete(id);\r\n }\r\n return false;\r\n };\r\n retVal.clear = () => {\r\n cells.forEach(cell => cell.delete());\r\n cells.clear();\r\n };\r\n retVal.write = (w: Writer) => {\r\n w.files(_files);\r\n cells.forEach(cell => cell.write(w));\r\n };\r\n retVal.toString = (w = new Writer()) => {\r\n retVal.write(w);\r\n return w.toString().trim();\r\n };\r\n return retVal;\r\n}\r\ntype NotebookFunc = ReturnType<typeof notebook>;\r\n\r\nexport function isNotebookKit(value: any): value is Notebook {\r\n return !!value && Array.isArray(value.cells);\r\n}\r\n\r\nexport function isOhqNotebook(value: any): value is ohq.Notebook {\r\n return !!value && Array.isArray(value.nodes);\r\n}\r\nexport async function compile(notebookOrOjs: Notebook): Promise<Definition[]>;\r\nexport async function compile(notebookOrOjs: ohq.Notebook, options?: CompileOptions): Promise<NotebookFunc>;\r\nexport async function compile(notebookOrOjs: string, options?: CompileOptions): Promise<NotebookFunc>;\r\nexport async function compile(notebookOrOjs: Notebook | ohq.Notebook | string, { baseUrl = \".\", importMode = \"precompiled\" }: CompileOptions = {}) {\r\n if (isNotebookKit(notebookOrOjs)) {\r\n return compileNotebook(notebookOrOjs);\r\n } else if (typeof notebookOrOjs === \"string\") {\r\n notebookOrOjs = ojs2notebook(notebookOrOjs);\r\n }\r\n const _cells: CellFunc[] = await Promise.all(notebookOrOjs.nodes.map(n => createCell(n, { baseUrl, importMode })));\r\n return notebook(notebookOrOjs.files, _cells, { baseUrl, importMode });\r\n}\r\nexport type CompileFunc = Awaited<ReturnType<typeof compile>>;\r\n"],
4
+ "sourcesContent": ["import { JSDOM } from \"jsdom\";\n\nconst { window } = new JSDOM();\nglobalThis.document = window.document;\nglobalThis.DOMParser = window.DOMParser;\n\nexport * from \"./index.ts\";\n", "\nimport { type Notebook, type Cell, transpile } from \"@observablehq/notebook-kit\";\nimport { type Definition } from \"@observablehq/notebook-kit/runtime\";\nimport { constructFunction } from \"./util.ts\";\n\nexport { Notebook, Cell };\n\nexport interface CompileCellOptions {\n inline?: boolean;\n resolveLocalImports?: boolean;\n includePinned?: boolean;\n}\n\nexport function compileCell(cell: Cell, { inline = true, resolveLocalImports = false, includePinned = true }: CompileCellOptions = {}): Definition[] {\n const retVal: Definition[] = [];\n const sourceIDOffset = 1000000;\n try {\n const compiled = transpile(cell, { resolveLocalImports });\n retVal.push({\n id: cell.id,\n ...compiled,\n body: inline ? constructFunction(compiled.body, `cell_${cell.id}`) : compiled.body,\n });\n if (includePinned && cell.pinned) {\n const compiled = transpile({\n ...cell,\n mode: \"md\",\n value: `\\\n\\`\\`\\`${cell.mode}\n${cell.value}\n\\`\\`\\``\n });\n retVal.push({\n id: sourceIDOffset + cell.id,\n ...compiled,\n body: inline ? constructFunction(compiled.body, `cell_${sourceIDOffset + cell.id}`) : compiled.body,\n });\n }\n } catch (error) {\n console.error(`Error compiling cell ${cell.id}:`, error);\n }\n return retVal;\n}\n\nexport function compileNotebook(notebook: Notebook, { inline = true, resolveLocalImports = false, includePinned = true }: CompileCellOptions = {}): Definition[] {\n const retVal: Definition[] = [];\n for (const cell of notebook.cells) {\n const cellDefs = compileCell(cell, { inline, resolveLocalImports, includePinned });\n retVal.push(...cellDefs);\n }\n return retVal;\n}\n\nexport function resetCellIDs(notebook: Notebook, start: number = 0, increment: number = 1): Notebook {\n for (const cell of notebook.cells) {\n cell.id = start;\n start += increment;\n }\n return notebook;\n}\n", "import { type Notebook, type Cell, parseJavaScript, serialize, deserialize, toNotebook, toCell } from \"@observablehq/notebook-kit\";\nimport { type Definition } from \"@observablehq/notebook-kit/runtime\";\n\nexport type { Notebook, Cell, Definition };\nexport { toNotebook, toCell };\n\n// Shared function constructor utilities to avoid duplication between util modules.\n\nexport type RegularFunction = (...args: any[]) => any;\ninterface RegularFunctionConstructor {\n new(...args: string[]): RegularFunction;\n (...args: string[]): RegularFunction;\n readonly prototype: RegularFunction;\n}\n\nexport type AsyncFunction = (...args: any[]) => Promise<any>;\ninterface AsyncFunctionConstructor {\n new(...args: string[]): AsyncFunction;\n (...args: string[]): AsyncFunction;\n readonly prototype: AsyncFunction;\n}\n\nexport type GeneratorFunction = (...args: any[]) => Generator<any, any, any>;\ninterface GeneratorFunctionConstructor {\n new(...args: string[]): GeneratorFunction;\n (...args: string[]): GeneratorFunction;\n readonly prototype: GeneratorFunction;\n}\n\nexport type AsyncGeneratorFunction = (...args: any[]) => AsyncGenerator<any, any, any>;\ninterface AsyncGeneratorFunctionConstructor {\n new(...args: string[]): AsyncGeneratorFunction;\n (...args: string[]): AsyncGeneratorFunction;\n readonly prototype: AsyncGeneratorFunction;\n}\n\nexport type AnyFunction = RegularFunction | AsyncFunction | GeneratorFunction | AsyncGeneratorFunction;\n\nexport const FunctionConstructors: {\n regular: RegularFunctionConstructor;\n async: AsyncFunctionConstructor;\n generator: GeneratorFunctionConstructor;\n asyncGenerator: AsyncGeneratorFunctionConstructor;\n} = {\n regular: Object.getPrototypeOf(function () { }).constructor as RegularFunctionConstructor,\n async: Object.getPrototypeOf(async function () { }).constructor as AsyncFunctionConstructor,\n generator: Object.getPrototypeOf(function* () { }).constructor as GeneratorFunctionConstructor,\n asyncGenerator: Object.getPrototypeOf(async function* () { }).constructor as AsyncGeneratorFunctionConstructor,\n};\n\nfunction funcType(async: boolean = false, generator: boolean = false) {\n if (!async && !generator) return FunctionConstructors.regular;\n if (async && !generator) return FunctionConstructors.async;\n if (!async && generator) return FunctionConstructors.generator;\n return FunctionConstructors.asyncGenerator;\n}\n\ninterface Ref {\n start: number,\n end: number,\n newText: string\n}\n\nexport interface Refs {\n inputs: string[];\n args: string[];\n patches: Ref[];\n}\n\nexport function createFunction(refs: Refs, async = false, generator = false, blockStatement = false, body?: string) {\n if (body === undefined) {\n return undefined;\n }\n\n refs.patches.sort((l, r) => r.start - l.start);\n refs.patches.forEach(r => {\n body = body!.substring(0, r.start) + r.newText + body!.substring(r.end);\n });\n return new (funcType(async, generator))(...refs.args, blockStatement ?\n body.substring(1, body.length - 1).trim() :\n `return (\\n${body}\\n);`);\n}\n\nfunction join(baseURL: string, relativeURL: string) {\n return relativeURL\n ? baseURL.replace(/\\/+$/, \"\") + \"/\" + relativeURL.replace(/^\\/+/, \"\")\n : baseURL;\n}\n\nexport const isRelativePath = (path: string) => path[0] === \".\";\nexport const fixRelativeUrl = (path: string, basePath: string) => {\n if (isRelativePath(path)) {\n return join(basePath, path);\n }\n return path;\n};\n\n// Hide \"import\" from bundlers as they have a habit of replacing \"import\" with \"require\"\nconst obfuscatedImportFunction = new FunctionConstructors.async(\"url\", \"return import(url)\");\nexport async function obfuscatedImport(url: string) {\n return obfuscatedImportFunction(url);\n}\n\nfunction _constructFunction(body: any, bodyStr: string, name?: string) {\n if (body.type !== \"FunctionExpression\" && body.type !== \"FunctionDeclaration\" && body.type !== \"ArrowFunctionExpression\") {\n throw new Error(`Unsupported function type: ${body.type}`);\n }\n const func = body.async && body.generator ?\n FunctionConstructors.asyncGenerator :\n body.async ?\n FunctionConstructors.async :\n body.generator ?\n FunctionConstructors.generator :\n FunctionConstructors.regular;\n\n const params = body.params?.map((param) => bodyStr.slice(param.start, param.end)).join(\", \") ?? \"\";\n const isBlock = body.body.type === \"BlockStatement\";\n const { start, end } = body.body;\n const inner = isBlock\n ? bodyStr.slice(start + 1, end - 1)\n : `return ${bodyStr.slice(start, end)}`;\n // If a name is provided, build a true named function expression for reliable naming.\n if (name) {\n // Sanitize to a valid identifier; fallback to underscored name when necessary.\n const sanitize = (n: string): string => {\n let s = n.replace(/[^A-Za-z0-9_$]/g, \"_\");\n if (!/^[A-Za-z_$]/.test(s)) s = \"_\" + s;\n return s;\n };\n const id = sanitize(name);\n const asyncKw = body.async ? \"async \" : \"\";\n const genMark = body.generator ? \"*\" : \"\";\n const src = `return ${asyncKw}function${genMark} ${id}(${params}) {\\n${inner}\\n}`;\n // Use a plain Function wrapper to evaluate the named function expression.\n const builtNamed = (new Function(src)()) as AnyFunction;\n // Expose the intended display name even if sanitization changed the identifier.\n try { (builtNamed as any).displayName = name; } catch { /* noop */ }\n return builtNamed;\n }\n\n const built = func(params, inner) as AnyFunction;\n return built;\n}\n\nexport function constructFunction(bodyStr: string, name?: string) {\n const { body } = parseJavaScript(bodyStr);\n if (body.type === \"Program\") {\n if (body.body.length !== 1) {\n throw new Error(`Expected a single function, but found ${body.body.length} statements`);\n }\n return _constructFunction(body.body[0], bodyStr, name);\n }\n return _constructFunction(body, bodyStr, name);\n}\n\nexport const html2notebook = (html: string): Notebook => deserialize(html);\nexport const notebook2html = (notebook: Notebook): string => serialize(notebook);\n", "// Compare with ../../../node_modules/@observablehq/parser/src/parse.js\nimport { getLineInfo, tokTypes, Statement, ModuleDeclaration, Expression as ExpressionBase, Node } from \"acorn\";\nimport { ancestor, RecursiveVisitors, AncestorVisitors } from \"acorn-walk\";\nimport { CellParser, parseCell as ohqParseCell, walk as ohqWalk } from \"@observablehq/parser\";\nimport defaultGlobals from \"../../../node_modules/@observablehq/parser/src/globals.js\";\nimport findReferences from \"../../../node_modules/@observablehq/parser/src/references.js\";\nimport findFeatures from \"../../../node_modules/@observablehq/parser/src/features.js\";\n\nexport interface MutableExpression extends Node {\n type: \"MutableExpression\"\n}\n\nexport interface ViewExpression extends Node {\n type: \"ViewExpression\"\n}\n\nexport type Expression = ExpressionBase | MutableExpression | ViewExpression;\n\n// Find references.\n// Check for illegal references to arguments.\n// Check for illegal assignments to global references.\nfunction parseReferences(cell, input, globals = defaultGlobals) {\n if (!cell.body) {\n cell.references = [];\n } else if (cell.body.type === \"ImportDeclaration\") {\n // This is correct?!?\n cell.references = cell.body.specifiers\n ? cell.body.specifiers.map(i => i.imported)\n : [];\n } else {\n try {\n cell.references = findReferences(cell, globals);\n } catch (error: any) {\n if (error.node) {\n const loc = getLineInfo(input, error.node.start);\n error.message += ` (${loc.line}:${loc.column})`;\n error.pos = error.node.start;\n error.loc = loc;\n delete error.node;\n }\n throw error;\n }\n }\n return cell;\n}\n\n// Find features: file attachments, secrets, database clients.\n// Check for illegal references to arguments.\n// Check for illegal assignments to global references.\nfunction parseFeatures(cell, input) {\n if (cell.body && cell.body.type !== \"ImportDeclaration\") {\n try {\n cell.fileAttachments = findFeatures(cell, \"FileAttachment\");\n cell.databaseClients = findFeatures(cell, \"DatabaseClient\");\n cell.secrets = findFeatures(cell, \"Secret\");\n } catch (error: any) {\n if (error.node) {\n const loc = getLineInfo(input, error.node.start);\n error.message += ` (${loc.line}:${loc.column})`;\n error.pos = error.node.start;\n error.loc = loc;\n delete error.node;\n }\n throw error;\n }\n } else {\n cell.fileAttachments = new Map();\n cell.databaseClients = new Map();\n cell.secrets = new Map();\n }\n return cell;\n}\n\nclass ModuleParser extends CellParser {\n\n parseTopLevel(node: { cells?: Cell[] }) {\n if (!node.cells) node.cells = [];\n // @ts-ignore\n while (this.type !== tokTypes.eof) {\n // @ts-ignore\n const cell: Cell = this.parseCell(this.startNode());\n // @ts-ignore\n cell.input = this.input;\n node.cells.push(cell);\n }\n // @ts-ignore\n this.next();\n // @ts-ignore\n return this.finishNode(node, \"Program\");\n }\n}\n\n// @ts-ignore\nexport function parseModule(input, { globals }: { globals: any } = {}) {\n // @ts-ignore\n const program = ModuleParser.parse(input, { ecmaVersion: 2020 });\n for (const cell of program.cells) {\n parseReferences(cell, input, globals);\n parseFeatures(cell, input);\n }\n return program;\n}\n\nexport interface Cell extends Node {\n type: \"Cell\";\n id: Expression;\n text: string;\n body?: Statement | ModuleDeclaration | Expression;\n references: unknown[];\n async: boolean;\n generator: boolean;\n strict: boolean;\n}\n\nexport function splitModule(input: string): Cell[] {\n return (ModuleParser as any)\n .parse(input, { ecmaVersion: \"latest\" })\n .cells.map((cell: any) => ({\n type: \"Cell\",\n text: input.substring(cell.start, cell.end),\n start: cell.start,\n end: cell.end\n }));\n}\n\nexport {\n type Node,\n ancestor,\n type AncestorVisitors\n};\n\nexport function parseCell(input: string): Cell {\n return ohqParseCell(input);\n}\n\nexport const walk: RecursiveVisitors<any> = ohqWalk;\n", "// Based on https://github.com/ForbesLindesay/acorn-globals\n// Copyright (c) 2014 Forbes Lindesay\n// https://github.com/ForbesLindesay/acorn-globals/blob/master/LICENSE\n\nimport {ancestor} from \"acorn-walk\";\nimport walk from \"./walk.js\";\n\nfunction isScope(node) {\n return node.type === \"FunctionExpression\"\n || node.type === \"FunctionDeclaration\"\n || node.type === \"ArrowFunctionExpression\"\n || node.type === \"Program\";\n}\n\nfunction isBlockScope(node) {\n return node.type === \"BlockStatement\"\n || node.type === \"ForInStatement\"\n || node.type === \"ForOfStatement\"\n || node.type === \"ForStatement\"\n || isScope(node);\n}\n\nfunction declaresArguments(node) {\n return node.type === \"FunctionExpression\"\n || node.type === \"FunctionDeclaration\";\n}\n\nexport default function findReferences(cell, globals) {\n const ast = {type: \"Program\", body: [cell.body]};\n const locals = new Map;\n const globalSet = new Set(globals);\n const references = [];\n\n function hasLocal(node, name) {\n const l = locals.get(node);\n return l ? l.has(name) : false;\n }\n\n function declareLocal(node, id) {\n const l = locals.get(node);\n if (l) l.add(id.name);\n else locals.set(node, new Set([id.name]));\n }\n\n function declareClass(node) {\n if (node.id) declareLocal(node, node.id);\n }\n\n function declareFunction(node) {\n node.params.forEach(param => declarePattern(param, node));\n if (node.id) declareLocal(node, node.id);\n }\n\n function declareCatchClause(node) {\n if (node.param) declarePattern(node.param, node);\n }\n\n function declarePattern(node, parent) {\n switch (node.type) {\n case \"Identifier\":\n declareLocal(parent, node);\n break;\n case \"ObjectPattern\":\n node.properties.forEach(node => declarePattern(node, parent));\n break;\n case \"ArrayPattern\":\n node.elements.forEach(node => node && declarePattern(node, parent));\n break;\n case \"Property\":\n declarePattern(node.value, parent);\n break;\n case \"RestElement\":\n declarePattern(node.argument, parent);\n break;\n case \"AssignmentPattern\":\n declarePattern(node.left, parent);\n break;\n default:\n throw new Error(\"Unrecognized pattern type: \" + node.type);\n }\n }\n\n function declareModuleSpecifier(node) {\n declareLocal(ast, node.local);\n }\n\n ancestor(\n ast,\n {\n VariableDeclaration: (node, parents) => {\n let parent = null;\n for (let i = parents.length - 1; i >= 0 && parent === null; --i) {\n if (node.kind === \"var\" ? isScope(parents[i]) : isBlockScope(parents[i])) {\n parent = parents[i];\n }\n }\n node.declarations.forEach(declaration => declarePattern(declaration.id, parent));\n },\n FunctionDeclaration: (node, parents) => {\n let parent = null;\n for (let i = parents.length - 2; i >= 0 && parent === null; --i) {\n if (isScope(parents[i])) {\n parent = parents[i];\n }\n }\n declareLocal(parent, node.id);\n declareFunction(node);\n },\n Function: declareFunction,\n ClassDeclaration: (node, parents) => {\n let parent = null;\n for (let i = parents.length - 2; i >= 0 && parent === null; i--) {\n if (isScope(parents[i])) {\n parent = parents[i];\n }\n }\n declareLocal(parent, node.id);\n },\n Class: declareClass,\n CatchClause: declareCatchClause,\n ImportDefaultSpecifier: declareModuleSpecifier,\n ImportSpecifier: declareModuleSpecifier,\n ImportNamespaceSpecifier: declareModuleSpecifier\n },\n walk\n );\n\n function identifier(node, parents) {\n let name = node.name;\n if (name === \"undefined\") return;\n for (let i = parents.length - 2; i >= 0; --i) {\n if (name === \"arguments\") {\n if (declaresArguments(parents[i])) {\n return;\n }\n }\n if (hasLocal(parents[i], name)) {\n return;\n }\n if (parents[i].type === \"ViewExpression\") {\n node = parents[i];\n name = `viewof ${node.id.name}`;\n }\n if (parents[i].type === \"MutableExpression\") {\n node = parents[i];\n name = `mutable ${node.id.name}`;\n }\n }\n if (!globalSet.has(name)) {\n if (name === \"arguments\") {\n throw Object.assign(new SyntaxError(`arguments is not allowed`), {node});\n }\n references.push(node);\n }\n }\n\n ancestor(\n ast,\n {\n VariablePattern: identifier,\n Identifier: identifier\n },\n walk\n );\n\n function checkConst(node, parents) {\n if (!node) return;\n switch (node.type) {\n case \"Identifier\":\n case \"VariablePattern\": {\n for (const parent of parents) {\n if (hasLocal(parent, node.name)) {\n return;\n }\n }\n if (parents[parents.length - 2].type === \"MutableExpression\") {\n return;\n }\n throw Object.assign(new SyntaxError(`Assignment to constant variable ${node.name}`), {node});\n }\n case \"ArrayPattern\": {\n for (const element of node.elements) {\n checkConst(element, parents);\n }\n return;\n }\n case \"ObjectPattern\": {\n for (const property of node.properties) {\n checkConst(property, parents);\n }\n return;\n }\n case \"Property\": {\n checkConst(node.value, parents);\n return;\n }\n case \"RestElement\": {\n checkConst(node.argument, parents);\n return;\n }\n }\n }\n\n function checkConstArgument(node, parents) {\n checkConst(node.argument, parents);\n }\n\n function checkConstLeft(node, parents) {\n checkConst(node.left, parents);\n }\n\n ancestor(\n ast,\n {\n AssignmentExpression: checkConstLeft,\n AssignmentPattern: checkConstLeft,\n UpdateExpression: checkConstArgument,\n ForOfStatement: checkConstLeft,\n ForInStatement: checkConstLeft\n },\n walk\n );\n\n return references;\n}\n", "import {make} from \"acorn-walk\";\n\nexport default make({\n Import() {},\n ViewExpression(node, st, c) {\n c(node.id, st, \"Identifier\");\n },\n MutableExpression(node, st, c) {\n c(node.id, st, \"Identifier\");\n }\n});\n", "import {simple} from \"acorn-walk\";\nimport walk from \"./walk.js\";\n\nexport default function findFeatures(cell, featureName) {\n const ast = {type: \"Program\", body: [cell.body]};\n const features = new Map();\n const {references} = cell;\n\n simple(\n ast,\n {\n CallExpression: node => {\n const {callee, arguments: args} = node;\n\n // Ignore function calls that are not references to the feature.\n if (\n callee.type !== \"Identifier\" ||\n callee.name !== featureName ||\n references.indexOf(callee) < 0\n ) return;\n\n // Forbid dynamic calls.\n if (\n args.length !== 1 ||\n !((args[0].type === \"Literal\" && /^['\"]/.test(args[0].raw)) ||\n (args[0].type === \"TemplateLiteral\" && args[0].expressions.length === 0))\n ) {\n throw Object.assign(new SyntaxError(`${featureName} requires a single literal string argument`), {node});\n }\n\n const [arg] = args;\n const name = arg.type === \"Literal\" ? arg.value : arg.quasis[0].value.cooked;\n const location = {start: arg.start, end: arg.end};\n if (features.has(name)) features.get(name).push(location);\n else features.set(name, [location]);\n }\n },\n walk\n );\n\n return features;\n}\n", "import { ancestor, parseCell as ohqParseCell, Cell, Node, walk, AncestorVisitors } from \"./observable-shim.ts\";\nimport { fixRelativeUrl, createFunction, Refs } from \"./kit/index.ts\";\n\nfunction calcRefs(cellAst: Cell, cellStr: string): Refs {\n if (cellAst.references === undefined) return { inputs: [], args: [], patches: [] };\n\n const dedup: { [id: string]: boolean } = {};\n cellAst.references.forEach((r: any) => dedup[cellStr.substring(r.start, r.end)] = true);\n const retVal: Refs = {\n inputs: Object.keys(dedup),\n args: Object.keys(dedup).map(r => r.split(\" \").join(\"_\")),\n patches: []\n };\n const pushPatch = (node: Node, newText: string) => retVal.patches.push({ start: node.start - (cellAst.body?.start ?? 0), end: node.end - (cellAst.body?.start ?? 0), newText });\n if (cellAst.body) {\n ancestor(cellAst.body, {\n Identifier(node) {\n const value = cellStr.substring(node.start, node.end);\n if (dedup[value]) {\n }\n },\n MutableExpression(node: Node) {\n const value = cellStr.substring(node.start, node.end);\n const newText = value.split(\" \").join(\"_\") + \".value\";\n pushPatch(node, newText);\n },\n ViewExpression(node: Node) {\n const value = cellStr.substring(node.start, node.end);\n const newText = value.split(\" \").join(\"_\");\n pushPatch(node, newText);\n },\n ThisExpression(node: Node, ancestors: Node[]) {\n const value = cellStr.substring(node.start, node.end);\n if (value === \"this\" && !ancestors.find(n => n.type === \"FunctionExpression\")) {\n pushPatch(node, \"((this === globalThis || this === globalThis.window)? undefined : this?.valueOf())\");\n }\n }\n } as AncestorVisitors<any>, walk);\n }\n return retVal;\n}\n\nexport interface ParsedCell {\n type: \"import\" | \"viewof\" | \"mutable\" | \"variable\" | \"identifier\"\n}\n\nexport interface ParsedImportCell extends ParsedCell {\n type: \"import\"\n src: string;\n specifiers: { view: boolean, name: string, alias?: string }[];\n injections: { name: string, alias: string }[];\n}\n\nfunction parseImportDeclaration(cellAst: any): ParsedImportCell {\n return {\n type: \"import\",\n src: cellAst.body.source.value,\n specifiers: cellAst.body.specifiers?.map((spec: any) => {\n return {\n view: spec.view,\n name: spec.imported.name,\n alias: (spec.local?.name && spec.imported.name !== spec.local.name) ? spec.local.name : spec.imported.name\n };\n }) ?? [],\n injections: cellAst.body.injections?.map((inj: any) => {\n return {\n name: inj.imported.name,\n alias: inj.local?.name ?? inj.imported.name\n };\n }) ?? [],\n };\n}\n\nexport interface ParsedVariable extends ParsedCell {\n type: \"variable\"\n id?: string,\n inputs: string[],\n func: any,\n}\n\nexport interface ParsedViewCell extends ParsedCell {\n type: \"viewof\",\n variable: ParsedVariable;\n variableValue: ParsedVariable;\n}\n\nfunction parseViewExpression(cellStr: string, cellAst: any, refs: Refs, bodyStr?: string): ParsedViewCell {\n const id = cellAst.id && cellStr.substring(cellAst.id.start, cellAst.id.end);\n return {\n type: \"viewof\",\n variable: {\n type: \"variable\",\n id,\n inputs: refs.inputs,\n func: createFunction(refs, cellAst.async, cellAst.generator, cellAst.body.type === \"BlockStatement\", bodyStr)\n },\n variableValue: {\n type: \"variable\",\n id: cellAst?.id?.id?.name,\n inputs: [\"Generators\", id],\n func: (G: any, _: any) => G.input(_)\n }\n };\n}\n\ninterface ParsedMutableCell extends ParsedCell {\n type: \"mutable\",\n initial: ParsedVariable;\n variable: ParsedVariable;\n variableValue: ParsedVariable;\n}\n\nfunction parseMutableExpression(cellStr: string, cellAst: any, refs: Refs, bodyStr?: string): ParsedMutableCell {\n const id = cellAst.id && cellStr.substring(cellAst.id.start, cellAst.id.end);\n const initialValueId = cellAst?.id?.id?.name;\n const initialId = `initial ${initialValueId}`;\n return {\n type: \"mutable\",\n initial: {\n type: \"variable\",\n id: initialId,\n inputs: refs.inputs,\n func: createFunction(refs, cellAst.async, cellAst.generator, cellAst.body.type === \"BlockStatement\", bodyStr)\n },\n variable: {\n type: \"variable\",\n id,\n inputs: [\"Mutable\", initialId],\n func: (M: any, _: any) => new M(_)\n },\n variableValue: {\n type: \"variable\",\n id: initialValueId,\n inputs: [id],\n func: (_: any) => _.generator\n }\n };\n}\n\ninterface ParsedVariableCell extends ParsedCell {\n type: \"variable\",\n id: string,\n inputs: string[],\n func: any,\n}\n\nfunction parseVariableExpression(cellStr: string, cellAst: any, refs: Refs, bodyStr?: string): ParsedVariableCell {\n return {\n type: \"variable\",\n id: cellAst.id && cellStr.substring(cellAst.id?.start, cellAst.id?.end),\n inputs: refs.inputs,\n func: createFunction(refs, cellAst.async, cellAst.generator, cellAst.body.type === \"BlockStatement\", bodyStr)\n };\n}\n\nexport function parseCell(cellStr: string, baseUrl: string): ParsedImportCell | ParsedViewCell | ParsedMutableCell | ParsedVariableCell {\n const cellAst = ohqParseCell(cellStr);\n let bodyStr = cellAst.body && cellStr.substring(cellAst.body.start, cellAst.body.end);\n switch ((cellAst.body)?.type) {\n case \"ImportDeclaration\":\n return parseImportDeclaration(cellAst);\n case \"ImportExpression\":\n switch (cellAst.body.source.type) {\n case \"Literal\":\n bodyStr = `import(\"${fixRelativeUrl(\"\" + cellAst.body.source.value, baseUrl)}\")`;\n break;\n default:\n console.error(\"Unexpected import value\");\n }\n }\n const refs = calcRefs(cellAst, cellStr);\n switch (cellAst.id?.type) {\n case \"ViewExpression\":\n return parseViewExpression(cellStr, cellAst, refs, bodyStr);\n case \"MutableExpression\":\n return parseMutableExpression(cellStr, cellAst, refs, bodyStr);\n default:\n return parseVariableExpression(cellStr, cellAst, refs, bodyStr);\n }\n}\n\n", "import { ohq } from \"./observable-shim.ts\";\nimport { ParsedImportCell, ParsedVariable } from \"./cst.ts\";\n\nexport class Writer {\n\n protected _files: ohq.File[] = [];\n protected _imports: string[] = [];\n protected _functions: string[] = [];\n protected _defines: string[] = [];\n protected _defineUid = 0;\n protected _functionUid = 0;\n\n constructor() {\n }\n\n toString() {\n return `\\\n${this._imports.join(\"\\n\")}\n\n${this._functions.join(\"\\n\").split(\"\\n) {\").join(\"){\")}\n\nexport default function define(runtime, observer) {\n const main = runtime.module();\n\n function toString() { return this.url; }\n const fileAttachments = new Map([\n ${this._files.map(f => `[\"${f.name}\", { url: new URL(\"${f.url}\"), mimeType: ${JSON.stringify(f.mime_type)}, toString }]`).join(\",\\n \")}\n ]);\n main.builtin(\"FileAttachment\", runtime.fileAttachments(name => fileAttachments.get(name)));\n\n ${this._defines.join(\"\\n \")}\n\n return main;\n}\\n`;\n }\n\n files(files: ohq.File[]) {\n this._files = [...this._files, ...files];\n }\n\n import(url: string) {\n this._imports.push(`import define${++this._defineUid} from \"${url}\"; `);\n }\n\n importDefine(imp: Partial<ParsedImportCell>) {\n const impInjections = imp.injections ?? [];\n const injections = impInjections.map(inj => {\n return inj.name === inj.alias ?\n `\"${inj.name}\"` :\n `{name: \"${inj.name}\", alias: \"${inj.alias}\"}`;\n });\n const derive = impInjections.length ? `.derive([${injections.join(\", \")}], main)` : \"\";\n this._defines.push(`const child${this._defineUid} = runtime.module(define${this._defineUid})${derive};`);\n const impSpecifiers = imp.specifiers ?? [];\n impSpecifiers.forEach(s => {\n this._defines.push(`main.import(\"${s.name}\"${s.alias && s.alias !== s.name ? `, \"${s.alias}\"` : \"\"}, child${this._defineUid}); `);\n });\n }\n\n function(variable: Partial<ParsedVariable>) {\n let id = variable.id ?? `${++this._functionUid}`;\n const idParts = id.split(\" \");\n id = `_${idParts[idParts.length - 1]}`;\n this._functions.push(`${variable.func?.toString()?.replace(\"anonymous\", `${id}`)}`);\n return id;\n }\n\n define(variable: Partial<ParsedVariable>, observable = true, inlineFunc = false, funcId?: string) {\n funcId = funcId ?? variable.id;\n const observe = observable ? `.variable(observer(${variable.id ? JSON.stringify(variable.id) : \"\"}))` : \"\";\n const id = variable.id ? `${JSON.stringify(variable.id)}, ` : \"\";\n const variableInputs = variable.inputs ?? [];\n const inputs = variableInputs.length ? `[${variableInputs.map(i => JSON.stringify(i)).join(\", \")}], ` : \"\";\n const func = inlineFunc ?\n variable.func?.toString() :\n funcId;\n this._defines.push(`main${observe}.define(${id}${inputs}${func});`);\n }\n\n error(msg: string) {\n }\n}\n\n", "import { type Notebook, type Cell, toNotebook, toCell } from \"./kit/index.ts\";\n\nimport type { ohq } from \"./observable-shim.ts\";\nimport { parseCell, splitModule } from \"./observable-shim.ts\";\n\ninterface ParsedOJS {\n ojs: string;\n offset: number;\n inlineMD: boolean;\n cell: any;\n error: any;\n}\n\nexport function encodeBacktick(str: string) {\n return str\n .split(\"`\").join(\"\\\\`\")\n ;\n}\n\nfunction createParsedOJS(ojs: string, offset: number, inlineMD: boolean): ParsedOJS {\n let cell;\n let error;\n try {\n cell = parseCell(ojs);\n } catch (e) {\n error = e;\n }\n return {\n ojs,\n offset,\n inlineMD,\n cell,\n error\n };\n}\n\nfunction splitOmd(_: string): ParsedOJS[] {\n const retVal: ParsedOJS[] = [];\n // Load Markdown ---\n const re = /(```(?:\\s|\\S)[\\s\\S]*?```)/g;\n let prevOffset = 0;\n let match = re.exec(_);\n while (match !== null) {\n if (match.index > prevOffset) {\n retVal.push(createParsedOJS(_.substring(prevOffset, match.index), prevOffset, true));\n }\n\n const outer = match[0];\n if (outer.indexOf(\"``` \") === 0 || outer.indexOf(\"```\\n\") === 0 || outer.indexOf(\"```\\r\\n\") === 0) {\n const prefixLen = 3;\n const inner = outer.substring(prefixLen, outer.length - prefixLen);\n retVal.push(createParsedOJS(inner, match.index + prefixLen, false));\n } else {\n retVal.push(createParsedOJS(outer, match.index, true));\n }\n\n prevOffset = match.index + match[0].length;\n match = re.exec(_);\n }\n if (_.length > prevOffset) {\n retVal.push(createParsedOJS(_.substring(prevOffset, _.length), prevOffset, true));\n }\n return retVal;\n}\n\nexport function notebook2ojs(_: string): ParsedOJS[] {\n const parsed: ohq.Notebook = JSON.parse(_);\n return parsed.nodes.map(node => createParsedOJS(node.value, 0, node.mode === \"md\"));\n}\n\nexport function ojs2notebook(ojs: string): ohq.Notebook {\n const cells = splitModule(ojs);\n return {\n files: [],\n nodes: cells.map((cell, idx) => {\n return {\n id: idx,\n mode: \"js\",\n value: cell.text,\n start: cell.start,\n end: cell.end\n };\n })\n } as ohq.Notebook;\n}\n\nexport function ojs2notebookKit(ojs: string): Notebook {\n const cells: Cell[] = splitModule(ojs).map((cell, idx) => {\n return toCell({\n id: idx,\n mode: \"ojs\",\n value: cell.text\n });\n });\n return toNotebook({ cells });\n}\n\nexport function omd2notebook(omd: string): ohq.Notebook {\n const cells = splitOmd(omd);\n return {\n files: [],\n nodes: cells.map((cell, idx) => {\n return {\n id: idx,\n mode: cell.inlineMD ? \"md\" : \"js\",\n value: cell.ojs,\n start: cell.offset,\n end: cell.offset + cell.ojs.length\n };\n })\n } as ohq.Notebook;\n}\n\nexport function omd2notebookKit(omd: string): Notebook {\n const cells: Cell[] = [];\n splitOmd(omd).forEach((cell) => {\n if (!cell.inlineMD) {\n splitModule(cell.ojs).forEach((subCell) => {\n cells.push(toCell({\n id: cells.length + 1,\n mode: \"ojs\",\n value: subCell.text\n }));\n });\n } else {\n cells.push(toCell({\n id: cells.length + 1,\n mode: \"md\",\n value: cell.ojs\n }));\n }\n });\n return toNotebook({ cells });\n}\n\nexport function fetchEx(url: string, proxyPrefix = \"https://api.codetabs.com/v1/proxy/?quest=\", proxyPostfix = \"\") {\n const matches = url.match(/^(?:https?:\\/\\/)?(?:[^@\\n]+@)?(?:www\\.)?([^:\\/\\n?]+)/img);\n if (!matches || matches.length === 0) {\n throw new Error(`Invalid URL: ${url}`);\n }\n return fetch(url, { headers: { origin: matches[0], referer: url } }).then(response => {\n if (response.ok) return response;\n throw new Error(\"CORS?\");\n }).catch(e => {\n url = `${proxyPrefix}${url}${proxyPostfix}`;\n return fetch(url, { headers: { origin: matches[0], referer: url } });\n });\n}\n\nexport function download(impUrl: string, proxyPrefix?: string, proxyPostfix?: string): Promise<ohq.Notebook> {\n const isShared = impUrl.indexOf(\"https://observablehq.com/d\") === 0;\n return fetchEx(impUrl.replace(`https://observablehq.com/${isShared ? \"d/\" : \"\"}`, \"https://api.observablehq.com/document/\"), proxyPrefix, proxyPostfix)\n .then(r => r.json())\n ;\n}\n", "\nimport { type Notebook, type Definition, compileNotebook, fixRelativeUrl, isRelativePath, obfuscatedImport } from \"./kit/index.ts\";\nimport { ohq, splitModule } from \"./observable-shim.ts\";\nimport { parseCell, ParsedImportCell } from \"./cst.ts\";\nimport { Writer } from \"./writer.ts\";\nimport { encodeBacktick, fetchEx, ojs2notebook, omd2notebook } from \"./util.ts\";\n\n// Inspector Factory ---\nexport type InspectorFactoryEx = (name: string | undefined, id: string | number) => Inspector;\n\nexport interface Inspector {\n _node?: HTMLDivElement;\n pending(): void;\n fulfilled(value: any): void;\n rejected(error: Error): void;\n}\n\n// Module ---\n\ninterface ImportDefine {\n (runtime: ohq.Runtime, inspector?: InspectorFactoryEx): ohq.Module;\n delete: () => void;\n write: (w: Writer) => void;\n}\n\nasync function importFile(relativePath: string, baseUrl: string) {\n const path = fixRelativeUrl(relativePath, baseUrl);\n const content = await fetchEx(path).then(r => r.text());\n let notebook: ohq.Notebook;\n if (relativePath.endsWith(\".ojsnb\")) {\n notebook = JSON.parse(content);\n } else if (relativePath.endsWith(\".ojs\")) {\n notebook = ojs2notebook(content);\n } else if (relativePath.endsWith(\".omd\")) {\n notebook = omd2notebook(content);\n } else {\n console.warn(`Unknown file type: ${relativePath}, assuming .ojsnb`);\n notebook = JSON.parse(content);\n }\n const retVal: ImportDefine = compile(notebook, { baseUrl }) as any;\n retVal.delete = () => { };\n retVal.write = (w: Writer) => {\n w.import(path);\n };\n return retVal;\n}\n\n// Import precompiled notebook from observable ---\nasync function importCompiledNotebook(partial: string) {\n const url = `https://api.observablehq.com/${partial[0] === \"@\" ? partial : `d/${partial}`}.js?v=3`;\n let impMod = {\n default: function (runtime: ohq.Runtime, inspector?: InspectorFactoryEx): ohq.Module | undefined {\n return undefined;\n } as any\n };\n try {\n impMod = await obfuscatedImport(url);\n } catch (e) {\n }\n const retVal: ImportDefine = impMod.default;\n retVal.delete = () => { };\n retVal.write = (w: Writer) => {\n w.import(url);\n };\n return retVal;\n}\n\n// Recursive notebook parsing and compiling\nasync function importNotebook(partial: string) {\n const url = `https://api.observablehq.com/document/${partial}`;\n const notebook = fetchEx(url)\n .then(r => {\n return r.json();\n }).catch(e => {\n console.error(url);\n console.error(e);\n });\n const retVal: ImportDefine = compile(await notebook) as any;\n retVal.delete = () => { };\n retVal.write = (w: Writer) => {\n w.import(url);\n };\n return retVal;\n}\n\nasync function createModule(node: ohq.Node, parsed: ParsedImportCell, text: string, { baseUrl, importMode }: CompileOptions) {\n const otherModule = isRelativePath(parsed.src) ?\n await importFile(parsed.src, baseUrl ?? \"\") :\n importMode === \"recursive\" ?\n await importNotebook(parsed.src) :\n await importCompiledNotebook(parsed.src);\n\n const importVariables: ImportVariableFunc[] = [];\n const variables: VariableFunc[] = [];\n parsed.specifiers.forEach(spec => {\n const viewof = spec.view ? \"viewof \" : \"\";\n importVariables.push(createImportVariable(viewof + spec.name, viewof + spec.alias));\n if (spec.view) {\n importVariables.push(createImportVariable(spec.name, spec.alias));\n }\n });\n\n const retVal = (runtime: ohq.Runtime, main: ohq.Module, inspector?: InspectorFactoryEx) => {\n\n let mod = runtime.module(otherModule);\n if (parsed.injections.length) {\n mod = mod.derive(parsed.injections, main);\n }\n variables.forEach(v => v(main, inspector));\n importVariables.forEach(v => v(main, mod));\n return mod;\n };\n retVal.importVariables = importVariables;\n retVal.variables = variables;\n retVal.delete = () => {\n importVariables.forEach(v => v.delete());\n variables.forEach(v => v.delete());\n otherModule.delete();\n };\n retVal.write = (w: Writer) => {\n otherModule.write(w);\n w.importDefine(parsed);\n };\n return retVal;\n}\ntype ModuleFunc = Awaited<ReturnType<typeof createModule>>;\n\n// Variable ---\nfunction createVariable(node: ohq.Node, inspect: boolean, name?: string, inputs?: string[], definition?: any, inline = false) {\n\n let i: ohq.Inspector | undefined;\n let v: ohq.Variable | undefined;\n\n const retVal = (module: ohq.Module, inspector?: InspectorFactoryEx) => {\n if (inspect && inspector) {\n i = inspector(name, node.id);\n }\n v = module.variable(i);\n if (arguments.length > 1) {\n try {\n v.define(name, inputs, definition);\n } catch (e: any) {\n console.error(e?.message);\n }\n }\n if (node.pinned) {\n v = inspector ? module.variable(inspector(name, node.id)) : module.variable();\n try {\n v.define(undefined, [\"md\"], (md: any) => {\n return md`\\`\\`\\`js\n${node.value}\n\\`\\`\\``;\n });\n } catch (e: any) {\n console.error(e?.message);\n }\n }\n return v;\n };\n retVal.delete = () => {\n try {\n i?._node?.remove();\n } catch (e) {\n }\n i = undefined;\n try {\n v?.delete();\n } catch (e) {\n }\n v = undefined;\n };\n retVal.write = (w: Writer) => {\n if (inline) {\n w.define({ id: name, inputs, func: definition }, inspect, true);\n } else {\n const id = w.function({ id: name, func: definition });\n w.define({ id: name, inputs, func: definition }, inspect, false, id);\n }\n };\n return retVal;\n}\ntype VariableFunc = ReturnType<typeof createVariable>;\n\nfunction createImportVariable(name: string, alias?: string) {\n\n let v: ohq.Variable;\n\n const retVal = (main: ohq.Module, otherModule: ohq.Module) => {\n v = main.variable();\n if (alias === undefined) {\n v.import(name, otherModule);\n } else {\n v.import(name, alias, otherModule);\n }\n };\n\n retVal.delete = () => {\n v?.delete();\n };\n return retVal;\n}\ntype ImportVariableFunc = ReturnType<typeof createImportVariable>;\n\n// Cell ---\nasync function createCell(node: ohq.Node, options: CompileOptions) {\n const modules: ModuleFunc[] = [];\n const variables: VariableFunc[] = [];\n try {\n const text = node.mode && node.mode !== \"js\" ? `${node.mode}\\`${encodeBacktick(node.value)}\\`` : node.value;\n const parsedModule = splitModule(text);\n for (const cell of parsedModule) {\n const parsed = parseCell(cell.text, options.baseUrl ?? \"\");\n switch (parsed.type) {\n case \"import\":\n modules.push(await createModule(node, parsed, cell.text, options));\n break;\n case \"viewof\":\n variables.push(createVariable(node, true, parsed.variable.id, parsed.variable.inputs, parsed.variable.func));\n variables.push(createVariable(node, false, parsed.variableValue.id, parsed.variableValue.inputs, parsed.variableValue.func, true));\n break;\n case \"mutable\":\n variables.push(createVariable(node, false, parsed.initial.id, parsed.initial.inputs, parsed.initial.func));\n variables.push(createVariable(node, false, parsed.variable.id, parsed.variable.inputs, parsed.variable.func));\n variables.push(createVariable(node, true, parsed.variableValue.id, parsed.variableValue.inputs, parsed.variableValue.func, true));\n break;\n case \"variable\":\n variables.push(createVariable(node, true, parsed.id, parsed.inputs, parsed.func));\n break;\n }\n }\n } catch (e: any) {\n variables.push(createVariable(node, true, undefined, [], e.message ?? \"Unkown error\"));\n }\n\n const retVal = (runtime: ohq.Runtime, main: ohq.Module, inspector?: InspectorFactoryEx) => {\n modules.forEach(imp => imp(runtime, main, inspector));\n variables.forEach(v => v(main, inspector));\n };\n retVal.id = node.id;\n retVal.modules = modules;\n retVal.variables = variables;\n retVal.delete = () => {\n variables.forEach(v => v.delete());\n modules.forEach(mod => mod.delete());\n };\n retVal.write = (w: Writer) => {\n modules.forEach(imp => imp.write(w));\n variables.forEach(v => v.write(w));\n };\n return retVal;\n}\nexport type CellFunc = Awaited<ReturnType<typeof createCell>>;\n\n// File ---\nfunction createFile(file: ohq.File, options: CompileOptions): [string, any] {\n function toString() {\n // TODO Double check url should not be URL?\n return (globalThis as any).url ?? \"\";\n }\n return [file.name, { url: new URL(fixRelativeUrl(file.url, options.baseUrl ?? \"\")), mimeType: file.mime_type, toString }];\n}\ntype FileFunc = ReturnType<typeof createFile>;\n\n// Interpret ---\nexport interface CompileOptions {\n baseUrl?: string;\n importMode?: \"recursive\" | \"precompiled\";\n}\nexport function notebook(_files: ohq.File[] = [], _cells: CellFunc[] = [], { baseUrl = \".\", importMode = \"precompiled\" }: CompileOptions = {}) {\n const files: FileFunc[] = _files.map(f => createFile(f, { baseUrl, importMode }));\n const fileAttachments = new Map<string, any>(files);\n const cells = new Map<string | number, CellFunc>(_cells.map(c => [c.id, c]));\n\n const retVal = (runtime: ohq.Runtime, inspector?: InspectorFactoryEx): ohq.Module => {\n const main = runtime.module();\n main.builtin(\"FileAttachment\", runtime.fileAttachments(name => {\n return fileAttachments.get(name) ?? { url: new URL(fixRelativeUrl(name, baseUrl)), mimeType: null };\n }));\n main.builtin(\"fetchEx\", fetchEx);\n\n cells.forEach(cell => {\n cell(runtime, main, inspector);\n });\n return main;\n };\n retVal.fileAttachments = fileAttachments;\n retVal.cells = cells;\n retVal.set = async (n: ohq.Node): Promise<CellFunc> => {\n const cell = await createCell(n, { baseUrl, importMode });\n retVal.delete(cell.id);\n cells.set(cell.id, cell);\n return cell;\n };\n retVal.get = (id: string | number): CellFunc | undefined => {\n return cells.get(id);\n };\n retVal.delete = (id: string | number): boolean => {\n const cell = cells.get(id);\n if (cell) {\n cell.delete();\n return cells.delete(id);\n }\n return false;\n };\n retVal.clear = () => {\n cells.forEach(cell => cell.delete());\n cells.clear();\n };\n retVal.write = (w: Writer) => {\n w.files(_files);\n cells.forEach(cell => cell.write(w));\n };\n retVal.toString = (w = new Writer()) => {\n retVal.write(w);\n return w.toString().trim();\n };\n return retVal;\n}\ntype NotebookFunc = ReturnType<typeof notebook>;\n\nexport function isNotebookKit(value: any): value is Notebook {\n return !!value && Array.isArray(value.cells);\n}\n\nexport function isOhqNotebook(value: any): value is ohq.Notebook {\n return !!value && Array.isArray(value.nodes);\n}\nexport async function compile(notebookOrOjs: Notebook): Promise<Definition[]>;\nexport async function compile(notebookOrOjs: ohq.Notebook, options?: CompileOptions): Promise<NotebookFunc>;\nexport async function compile(notebookOrOjs: string, options?: CompileOptions): Promise<NotebookFunc>;\nexport async function compile(notebookOrOjs: Notebook | ohq.Notebook | string, { baseUrl = \".\", importMode = \"precompiled\" }: CompileOptions = {}) {\n if (isNotebookKit(notebookOrOjs)) {\n return compileNotebook(notebookOrOjs);\n } else if (typeof notebookOrOjs === \"string\") {\n notebookOrOjs = ojs2notebook(notebookOrOjs);\n }\n const _cells: CellFunc[] = await Promise.all(notebookOrOjs.nodes.map(n => createCell(n, { baseUrl, importMode })));\n return notebook(notebookOrOjs.files, _cells, { baseUrl, importMode });\n}\nexport type CompileFunc = Awaited<ReturnType<typeof compile>>;\n"],
5
5
  "mappings": "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",
6
6
  "names": ["index_node_exports", "__export", "FunctionConstructors", "Writer", "compile", "compileCell", "compileNotebook", "constructFunction", "createFunction", "download", "fixRelativeUrl", "html2notebook", "isNotebookKit", "isOhqNotebook", "isRelativePath", "notebook", "notebook2html", "obfuscatedImport", "ojs2notebook", "ojs2notebookKit", "omd2notebook", "omd2notebookKit", "resetCellIDs", "__toCommonJS", "import_jsdom", "import_notebook_kit", "import_notebook_kit", "FunctionConstructors", "funcType", "async", "generator", "createFunction", "refs", "blockStatement", "body", "l", "r", "join", "baseURL", "relativeURL", "isRelativePath", "path", "fixRelativeUrl", "basePath", "obfuscatedImportFunction", "obfuscatedImport", "url", "_constructFunction", "bodyStr", "name", "func", "params", "param", "isBlock", "start", "end", "inner", "id", "n", "s", "asyncKw", "genMark", "src", "builtNamed", "constructFunction", "html2notebook", "html", "notebook2html", "notebook", "compileCell", "cell", "inline", "resolveLocalImports", "includePinned", "retVal", "compiled", "constructFunction", "error", "compileNotebook", "notebook", "cellDefs", "resetCellIDs", "start", "increment", "import_acorn", "import_acorn_walk", "import_parser", "import_acorn_walk", "import_acorn_walk", "walk_default", "node", "st", "c", "import_acorn_walk", "ModuleParser", "node", "cell", "splitModule", "input", "ModuleParser", "cell", "parseCell", "input", "ohqParseCell", "walk", "ohqWalk", "calcRefs", "cellAst", "cellStr", "dedup", "r", "retVal", "pushPatch", "node", "newText", "value", "ancestors", "n", "walk", "parseImportDeclaration", "spec", "inj", "parseViewExpression", "refs", "bodyStr", "id", "createFunction", "G", "_", "parseMutableExpression", "initialValueId", "initialId", "M", "parseVariableExpression", "parseCell", "baseUrl", "fixRelativeUrl", "Writer", "f", "files", "url", "imp", "impInjections", "injections", "inj", "derive", "variable", "id", "idParts", "observable", "inlineFunc", "funcId", "observe", "variableInputs", "inputs", "i", "func", "msg", "encodeBacktick", "str", "createParsedOJS", "ojs", "offset", "inlineMD", "cell", "error", "parseCell", "e", "splitOmd", "_", "retVal", "re", "prevOffset", "match", "outer", "inner", "ojs2notebook", "ojs", "cells", "splitModule", "cell", "idx", "ojs2notebookKit", "omd2notebook", "omd", "splitOmd", "omd2notebookKit", "subCell", "fetchEx", "url", "proxyPrefix", "proxyPostfix", "matches", "response", "e", "download", "impUrl", "isShared", "r", "importFile", "relativePath", "baseUrl", "path", "fixRelativeUrl", "content", "fetchEx", "r", "notebook", "ojs2notebook", "omd2notebook", "retVal", "compile", "w", "importCompiledNotebook", "partial", "url", "impMod", "runtime", "inspector", "obfuscatedImport", "importNotebook", "e", "createModule", "node", "parsed", "text", "importMode", "otherModule", "isRelativePath", "importVariables", "variables", "spec", "viewof", "createImportVariable", "main", "mod", "v", "createVariable", "inspect", "name", "inputs", "definition", "inline", "i", "module", "md", "id", "alias", "createCell", "options", "modules", "encodeBacktick", "parsedModule", "splitModule", "cell", "parseCell", "imp", "createFile", "file", "toString", "_files", "_cells", "files", "f", "fileAttachments", "cells", "c", "n", "Writer", "isNotebookKit", "value", "isOhqNotebook", "notebookOrOjs", "compileNotebook", "window"]
7
7
  }