@heshammesalam/heshjs 0.2.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +17 -12
- package/cli.js +31 -0
- package/dist/architecture/diagnostics.d.ts +12 -0
- package/dist/architecture/diagnostics.js +8 -0
- package/dist/architecture/diagnostics.js.map +1 -0
- package/dist/architecture/html.d.ts +18 -0
- package/dist/architecture/html.js +150 -0
- package/dist/architecture/html.js.map +1 -0
- package/dist/architecture/index.d.ts +42 -0
- package/dist/architecture/index.js +428 -0
- package/dist/architecture/index.js.map +1 -0
- package/dist/compiler/index.js +2 -0
- package/dist/compiler/index.js.map +1 -1
- package/dist/destinations/index.d.ts +63 -0
- package/dist/destinations/index.js +186 -0
- package/dist/destinations/index.js.map +1 -0
- package/dist/dom/index.d.ts +2 -0
- package/dist/dom/index.js +5 -1
- package/dist/dom/index.js.map +1 -1
- package/dist/domains/index.d.ts +24 -0
- package/dist/domains/index.js +110 -0
- package/dist/domains/index.js.map +1 -0
- package/dist/heshjs/index.d.ts +2 -0
- package/dist/heshjs/index.js +1 -0
- package/dist/heshjs/index.js.map +1 -1
- package/dist/hmvc/index.d.ts +2 -0
- package/dist/hmvc/index.js +11 -0
- package/dist/hmvc/index.js.map +1 -1
- package/dist/parser/index.d.ts +15 -1
- package/dist/parser/index.js +73 -3
- package/dist/parser/index.js.map +1 -1
- package/dist/presentation/index.d.ts +12 -0
- package/dist/presentation/index.js +39 -0
- package/dist/presentation/index.js.map +1 -0
- package/dist/units/index.d.ts +13 -0
- package/dist/units/index.js +16 -0
- package/dist/units/index.js.map +1 -0
- package/dist/vite/index.d.ts +4 -1
- package/dist/vite/index.js +36 -2
- package/dist/vite/index.js.map +1 -1
- package/docs/contracts.md +67 -0
- package/docs/domain-graph.md +205 -0
- package/docs/grammar.md +4 -0
- package/docs/units.md +71 -0
- package/package.json +10 -4
- package/scaffold/assets/hesh-icon.png +0 -0
- package/scaffold/create.js +78 -0
- package/scaffold/template.js +188 -0
- package/src/architecture/diagnostics.ts +11 -0
- package/src/architecture/html.ts +101 -0
- package/src/architecture/index.ts +291 -0
- package/src/compiler/index.ts +1 -0
- package/src/destinations/index.ts +147 -0
- package/src/dom/index.ts +6 -1
- package/src/domains/index.ts +97 -0
- package/src/heshjs/index.ts +2 -0
- package/src/hmvc/index.ts +7 -0
- package/src/parser/index.ts +55 -4
- package/src/presentation/index.ts +33 -0
- package/src/units/index.ts +23 -0
- package/src/vite/index.ts +24 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/compiler/index.ts"],"names":[],"mappings":"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","sourcesContent":["import ts from 'typescript';\nimport { parse, tokenize, HeshError, type Expression, type Element, type Module } from '../parser/index.js';\n\nexport interface CompileOptions { filename?: string; development?: boolean; runtime?: string; reactivity?: string }\nexport interface Binding { view: string; start: number; end: number; dependencies: string[]; kind: string }\nexport interface ViewIR { name: string; exported: boolean; default: boolean; instructions: string[] }\nexport interface ModuleIR { prelude: string[]; views: ViewIR[]; bindings: Binding[] }\nexport interface Result { code: string; css: string; metadata: Binding[]; ast: Module; ir: ModuleIR }\nconst printer = ts.createPrinter();\nconst f = ts.factory;\n\nexport function compile(source: string, options: CompileOptions = {}): Result {\n const ast = parse(source, options.filename);\n const metadata: Binding[] = [];\n const fail = (message: string, offset: number): never => { throw new HeshError(message, source, offset, ast.filename); };\n const names = new Set<string>();\n let defaults = 0;\n const imported = new Set<string>();\n const addImport = (name: string, offset: number): void => {\n if (name.startsWith('__h')) fail('Identifiers beginning __h are reserved', offset);\n if (imported.has(name)) fail(`Duplicate import binding ${name}`, offset);\n imported.add(name);\n };\n for (const item of ast.imports) {\n const diagnostics = ts.transpileModule(item.source, { fileName: 'imports.js', reportDiagnostics: true, compilerOptions: { allowJs: true, module: ts.ModuleKind.ESNext } }).diagnostics;\n if (diagnostics?.length) fail(ts.flattenDiagnosticMessageText(diagnostics[0]!.messageText, '\\n'), item.start);\n const parsed = ts.createSourceFile('imports.js', item.source, ts.ScriptTarget.Latest, true, ts.ScriptKind.JS);\n const statement = parsed.statements[0];\n if (!statement || !ts.isImportDeclaration(statement)) fail('Expected ESM import', item.start);\n const clause = (statement as ts.ImportDeclaration).importClause;\n if (clause?.name) addImport(clause.name.text, item.start);\n const bindings = clause?.namedBindings;\n if (bindings && ts.isNamedImports(bindings)) bindings.elements.forEach(e => addImport(e.name.text, item.start));\n else if (bindings) addImport(bindings.name.text, item.start);\n }\n for (const view of ast.views) {\n if (!/^[A-Z]/.test(view.name)) fail('View names must begin with an uppercase letter', view.start);\n if (names.has(view.name) || imported.has(view.name)) fail(`Duplicate component ${view.name}`, view.start);\n names.add(view.name);\n if (view.default && ++defaults > 1) fail('Only one default view is allowed', view.start);\n }\n const prelude = [\n `import { signal as __hSignal } from ${JSON.stringify(options.reactivity ?? '@heshammesalam/heshjs/reactivity')};`,\n `import * as __hDOM from ${JSON.stringify(options.runtime ?? '@heshammesalam/heshjs/dom')};`,\n ...ast.imports.map(i => i.source),\n 'const __hUpdate = (s, delta, post) => { const value = s.get(); const old = typeof value === \"bigint\" ? value : +value; const next = typeof old === \"bigint\" ? old + BigInt(delta) : old + delta; s.set(next); return post ? old : next; };'\n ];\n const views: ViewIR[] = [];\n for (const view of ast.views) {\n const output: string[] = [];\n const states = new Set<string>(), constants = new Set<string>();\n for (const node of view.body) if (node.kind !== 'element') {\n if (states.has(node.name) || constants.has(node.name) || imported.has(node.name) || names.has(node.name)) fail(`Duplicate binding ${node.name}`, node.start);\n (node.kind === 'state' ? states : constants).add(node.name);\n }\n let serial = 0;\n const available = new Set<string>();\n const transform = (expression: Expression, handler = false, async = false): string => {\n const declarations = [...states, ...constants].map(name => `${constants.has(name) ? 'const' : 'let'} ${name} = undefined;`).join('\\n');\n const prefix = `${ast.imports.map(i => i.source).join('\\n')}\\n${[...names].map(n => `function ${n}() {}`).join('\\n')}\\nfunction __hContext() {\\n${declarations}\\n${async ? 'async ' : ''}function __hExpression(${handler ? 'event' : ''}) {\\n${handler ? '' : 'return ('}`;\n const text = prefix + expression.source + (handler ? '' : ');') + '\\n}\\n}';\n const filename = '/__hesh_expression__.js';\n const settings: ts.CompilerOptions = { allowJs: true, checkJs: true, target: ts.ScriptTarget.ESNext, module: ts.ModuleKind.ESNext, noEmit: true };\n const host = ts.createCompilerHost(settings);\n const original = host.getSourceFile.bind(host);\n host.getSourceFile = (name, languageVersion, onError, shouldCreate) => name === filename ? ts.createSourceFile(name, text, languageVersion, true, ts.ScriptKind.JS) : original(name, languageVersion, onError, shouldCreate);\n const program = ts.createProgram([filename], settings, host);\n const file = program.getSourceFile(filename)!;\n const diagnostics = program.getSyntacticDiagnostics(file);\n if (diagnostics.length) {\n const d = diagnostics[0]!;\n fail(ts.flattenDiagnosticMessageText(d.messageText, '\\n'), expression.start + Math.max(0, (d.start ?? prefix.length) - prefix.length));\n }\n const checker = program.getTypeChecker();\n const context = file.statements.find(n => ts.isFunctionDeclaration(n) && n.name?.text === '__hContext') as ts.FunctionDeclaration;\n const symbols = new Map<ts.Symbol, string>();\n for (const stmt of context.body!.statements) if (ts.isVariableStatement(stmt)) {\n const name = stmt.declarationList.declarations[0]!.name as ts.Identifier;\n symbols.set(checker.getSymbolAtLocation(name)!, name.text);\n }\n const fn = context.body!.statements.at(-1) as ts.FunctionDeclaration;\n const dependencies = new Set<string>();\n const stateName = (node: ts.Node): string | undefined => {\n if (!ts.isIdentifier(node)) return;\n const symbol = checker.getSymbolAtLocation(node);\n const name = symbol ? symbols.get(symbol) : undefined;\n if (name && !handler && !available.has(name)) fail(`Binding ${name} is used before initialization`, expression.start);\n return name;\n };\n const read = (name: string) => f.createCallExpression(f.createPropertyAccessExpression(f.createIdentifier(name), 'get'), undefined, []);\n const write = (name: string, value: ts.Expression) => f.createCallExpression(f.createPropertyAccessExpression(f.createIdentifier(name), 'set'), undefined, [value]);\n const result = ts.transform(fn.body!, [context => {\n const visit: ts.Visitor = node => {\n if (ts.isIdentifier(node) && node.text.startsWith('__h')) fail('Identifiers beginning __h are reserved', expression.start + Math.max(0, node.getStart(file) - prefix.length));\n if ((ts.isPrefixUnaryExpression(node) || ts.isPostfixUnaryExpression(node)) && [ts.SyntaxKind.PlusPlusToken, ts.SyntaxKind.MinusMinusToken].includes(node.operator)) {\n const name = stateName(node.operand);\n if (name) {\n dependencies.add(name);\n if (constants.has(name)) fail(`Cannot assign constant ${name}`, expression.start);\n const delta = node.operator === ts.SyntaxKind.PlusPlusToken ? f.createNumericLiteral(1) : f.createPrefixUnaryExpression(ts.SyntaxKind.MinusToken, f.createNumericLiteral(1));\n return f.createCallExpression(f.createIdentifier('__hUpdate'), undefined, [f.createIdentifier(name), delta, node.kind === ts.SyntaxKind.PostfixUnaryExpression ? f.createTrue() : f.createFalse()]);\n }\n }\n if (ts.isBinaryExpression(node) && node.operatorToken.kind >= ts.SyntaxKind.FirstAssignment && node.operatorToken.kind <= ts.SyntaxKind.LastAssignment) {\n if (ts.isArrayLiteralExpression(node.left) || ts.isObjectLiteralExpression(node.left)) {\n const checkTarget = (target: ts.Node): void => {\n const name = stateName(target);\n if (name) fail('Destructuring assignments to component bindings are not supported', expression.start);\n ts.forEachChild(target, checkTarget);\n };\n checkTarget(node.left);\n }\n const name = stateName(node.left);\n if (name) {\n dependencies.add(name);\n if (constants.has(name)) fail(`Cannot assign constant ${name}`, expression.start);\n const right = ts.visitNode(node.right, visit) as ts.Expression;\n if (node.operatorToken.kind === ts.SyntaxKind.EqualsToken) return write(name, right);\n const operators: Partial<Record<ts.SyntaxKind, ts.BinaryOperator>> = {\n [ts.SyntaxKind.PlusEqualsToken]: ts.SyntaxKind.PlusToken, [ts.SyntaxKind.MinusEqualsToken]: ts.SyntaxKind.MinusToken,\n [ts.SyntaxKind.AsteriskEqualsToken]: ts.SyntaxKind.AsteriskToken, [ts.SyntaxKind.SlashEqualsToken]: ts.SyntaxKind.SlashToken,\n [ts.SyntaxKind.PercentEqualsToken]: ts.SyntaxKind.PercentToken, [ts.SyntaxKind.AsteriskAsteriskEqualsToken]: ts.SyntaxKind.AsteriskAsteriskToken,\n [ts.SyntaxKind.AmpersandEqualsToken]: ts.SyntaxKind.AmpersandToken, [ts.SyntaxKind.BarEqualsToken]: ts.SyntaxKind.BarToken,\n [ts.SyntaxKind.CaretEqualsToken]: ts.SyntaxKind.CaretToken, [ts.SyntaxKind.LessThanLessThanEqualsToken]: ts.SyntaxKind.LessThanLessThanToken,\n [ts.SyntaxKind.GreaterThanGreaterThanEqualsToken]: ts.SyntaxKind.GreaterThanGreaterThanToken, [ts.SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken]: ts.SyntaxKind.GreaterThanGreaterThanGreaterThanToken\n };\n const op = operators[node.operatorToken.kind];\n if (!op) fail('Logical assignment to state is not supported yet', expression.start);\n return write(name, f.createBinaryExpression(read(name), op!, right));\n }\n }\n if (ts.isShorthandPropertyAssignment(node)) {\n const symbol = checker.getShorthandAssignmentValueSymbol(node);\n const name = symbol && symbols.get(symbol);\n if (name && !handler && !available.has(name)) fail(`Binding ${name} is used before initialization`, expression.start);\n if (name && states.has(name)) { dependencies.add(name); return f.createPropertyAssignment(node.name.text, read(name)); }\n }\n if (ts.isIdentifier(node)) {\n const name = stateName(node);\n if (name && !handler && !available.has(name)) fail(`Binding ${name} is used before initialization`, expression.start);\n if (name && states.has(name)) { dependencies.add(name); return read(name); }\n }\n if ((ts.isForOfStatement(node) || ts.isForInStatement(node)) && stateName(node.initializer)) fail('Use a local loop variable, then assign state in the loop body', expression.start);\n return ts.visitEachChild(node, visit, context);\n };\n return node => ts.visitNode(node, visit) as ts.Block;\n }]);\n // Report unresolved names while leaving module resolution and imported types to Vite/tsc.\n for (const d of program.getSemanticDiagnostics(file)) if ((d.code < 2000 || [2304, 2552, 2588].includes(d.code)) && (d.start ?? 0) >= prefix.length && (d.start ?? 0) < prefix.length + expression.source.length) {\n fail(ts.flattenDiagnosticMessageText(d.messageText, '\\n'), expression.start + d.start! - prefix.length);\n }\n const body = result.transformed[0] as ts.Block;\n metadata.push({ view: view.name, start: expression.start, end: expression.end, dependencies: [...dependencies].sort(), kind: handler ? 'event' : 'expression' });\n let rendered: string;\n if (handler) rendered = printer.printNode(ts.EmitHint.Unspecified, body, file);\n else rendered = printer.printNode(ts.EmitHint.Expression, (body.statements[0] as ts.ReturnStatement).expression!, file);\n result.dispose();\n return rendered;\n };\n const value = (expr: Expression): string => {\n if (!expr.source.startsWith('\"')) return transform(expr);\n const tokens = tokenize(expr.source);\n if (tokens.length !== 1 || tokens[0]!.kind !== ts.SyntaxKind.StringLiteral) return transform(expr);\n const raw = expr.source.slice(1, -1);\n const parts: string[] = [];\n let literal = '', i = 0;\n const emit = () => { if (literal) { parts.push(JSON.stringify(literal)); literal = ''; } };\n while (i < raw.length) {\n if (raw[i] === '\\\\') {\n const next = raw[++i];\n const escapes: Record<string, string> = { n: '\\n', r: '\\r', t: '\\t', b: '\\b', f: '\\f', v: '\\v', '0': '\\0' };\n if (next === 'u' || next === 'x') fail('Use single quotes for Unicode/hex escapes in literal strings', expr.start + i);\n literal += escapes[next ?? ''] ?? next ?? ''; i++; continue;\n }\n if (raw[i] !== '{') { literal += raw[i++]; continue; }\n emit(); const start = ++i;\n const nested = tokenize(raw.slice(start)); let depth = 1, end = -1;\n for (const token of nested) { if (token.text === '{') depth++; if (token.text === '}' && --depth === 0) { end = start + token.start; break; } }\n if (end < 0) fail('Unterminated text interpolation', expr.start + start);\n parts.push(`String(${transform({ source: raw.slice(start, end), start: expr.start + 1 + start, end: expr.start + 1 + end })} ?? \"\")`);\n i = end + 1;\n }\n emit(); return parts.length ? parts.join(' + ') : '\"\"';\n };\n const emit = (node: Element, parent: string): void => {\n if (/^[A-Z]/.test(node.name)) {\n if (!names.has(node.name) && !imported.has(node.name)) fail(`Unknown component ${node.name}`, node.start);\n if (node.value || node.handler || node.children.length) fail('Component props, event blocks and slots are not supported in Milestone 1', node.start);\n output.push(`__hDOM.component(${parent}, ${node.name});`); return;\n }\n const id = `__hNode${serial++}`;\n output.push(`const ${id} = __hDOM.element(${parent}, ${JSON.stringify(node.name)});`);\n if (node.value) {\n if (node.name === 'input') {\n if (!states.has(node.value.source.trim()) || !available.has(node.value.source.trim())) fail('input requires an initialized state identifier', node.value.start);\n output.push(`__hDOM.input(${id}, ${node.value.source});`);\n } else if (node.name === 'image' || node.name === 'img') output.push(`__hDOM.attribute(${id}, \"src\", () => ${value(node.value)});`);\n else output.push(`__hDOM.text(${id}, () => ${value(node.value)});`);\n }\n if (node.handler) output.push(`__hDOM.listen(${id}, \"click\", ${node.async ? 'async ' : ''}(event) => ${transform(node.handler, true, node.async)});`);\n node.children.forEach(child => emit(child, id));\n };\n for (const node of view.body) {\n if (node.kind === 'element') emit(node, '__hParent');\n else { output.push(`const ${node.name} = ${node.kind === 'state' ? '__hSignal(' : ''}${transform(node.value)}${node.kind === 'state' ? ')' : ''};`); available.add(node.name); }\n }\n views.push({ name: view.name, exported: view.exported, default: view.default, instructions: output });\n }\n const ir: ModuleIR = { prelude, views, bindings: options.development === false ? [] : metadata };\n const output = [...ir.prelude, ...ir.views.flatMap(view => [\n `${view.exported ? 'export ' : ''}${view.default ? 'default ' : ''}function ${view.name}(__hParent) {`,\n ...view.instructions.map(instruction => instruction.split('\\n').map(line => ` ${line}`).join('\\n')),\n '}'\n ])];\n if (options.development !== false) output.push(`export const __hesh = ${JSON.stringify(metadata)};`);\n return { code: output.join('\\n'), css: '', metadata: options.development === false ? [] : metadata, ast, ir };\n}\n\nexport function createCompiler() {\n const cache = new Map<string, Result>();\n return {\n compile(source: string, options: CompileOptions = {}) {\n const key = JSON.stringify([source, options]);\n let result = cache.get(key);\n if (!result) { result = compile(source, options); cache.set(key, result); }\n return result;\n },\n clear() { cache.clear(); }\n };\n}\n\r\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/compiler/index.ts"],"names":[],"mappings":"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","sourcesContent":["import ts from 'typescript';\nimport { parse, tokenize, HeshError, type Expression, type Element, type Module } from '../parser/index.js';\n\nexport interface CompileOptions { filename?: string; development?: boolean; runtime?: string; reactivity?: string }\nexport interface Binding { view: string; start: number; end: number; dependencies: string[]; kind: string }\nexport interface ViewIR { name: string; exported: boolean; default: boolean; instructions: string[] }\nexport interface ModuleIR { prelude: string[]; views: ViewIR[]; bindings: Binding[] }\nexport interface Result { code: string; css: string; metadata: Binding[]; ast: Module; ir: ModuleIR }\nconst printer = ts.createPrinter();\nconst f = ts.factory;\n\nexport function compile(source: string, options: CompileOptions = {}): Result {\n const ast = parse(source, options.filename);\n if (ast.contracts.length) throw new HeshError('Architecture declarations require the project compiler (hesh check or hesh({ architecture: ... }))', source, ast.contracts[0]!.start, ast.filename);\n const metadata: Binding[] = [];\n const fail = (message: string, offset: number): never => { throw new HeshError(message, source, offset, ast.filename); };\n const names = new Set<string>();\n let defaults = 0;\n const imported = new Set<string>();\n const addImport = (name: string, offset: number): void => {\n if (name.startsWith('__h')) fail('Identifiers beginning __h are reserved', offset);\n if (imported.has(name)) fail(`Duplicate import binding ${name}`, offset);\n imported.add(name);\n };\n for (const item of ast.imports) {\n const diagnostics = ts.transpileModule(item.source, { fileName: 'imports.js', reportDiagnostics: true, compilerOptions: { allowJs: true, module: ts.ModuleKind.ESNext } }).diagnostics;\n if (diagnostics?.length) fail(ts.flattenDiagnosticMessageText(diagnostics[0]!.messageText, '\\n'), item.start);\n const parsed = ts.createSourceFile('imports.js', item.source, ts.ScriptTarget.Latest, true, ts.ScriptKind.JS);\n const statement = parsed.statements[0];\n if (!statement || !ts.isImportDeclaration(statement)) fail('Expected ESM import', item.start);\n const clause = (statement as ts.ImportDeclaration).importClause;\n if (clause?.name) addImport(clause.name.text, item.start);\n const bindings = clause?.namedBindings;\n if (bindings && ts.isNamedImports(bindings)) bindings.elements.forEach(e => addImport(e.name.text, item.start));\n else if (bindings) addImport(bindings.name.text, item.start);\n }\n for (const view of ast.views) {\n if (!/^[A-Z]/.test(view.name)) fail('View names must begin with an uppercase letter', view.start);\n if (names.has(view.name) || imported.has(view.name)) fail(`Duplicate component ${view.name}`, view.start);\n names.add(view.name);\n if (view.default && ++defaults > 1) fail('Only one default view is allowed', view.start);\n }\n const prelude = [\n `import { signal as __hSignal } from ${JSON.stringify(options.reactivity ?? '@heshammesalam/heshjs/reactivity')};`,\n `import * as __hDOM from ${JSON.stringify(options.runtime ?? '@heshammesalam/heshjs/dom')};`,\n ...ast.imports.map(i => i.source),\n 'const __hUpdate = (s, delta, post) => { const value = s.get(); const old = typeof value === \"bigint\" ? value : +value; const next = typeof old === \"bigint\" ? old + BigInt(delta) : old + delta; s.set(next); return post ? old : next; };'\n ];\n const views: ViewIR[] = [];\n for (const view of ast.views) {\n const output: string[] = [];\n const states = new Set<string>(), constants = new Set<string>();\n for (const node of view.body) if (node.kind !== 'element') {\n if (states.has(node.name) || constants.has(node.name) || imported.has(node.name) || names.has(node.name)) fail(`Duplicate binding ${node.name}`, node.start);\n (node.kind === 'state' ? states : constants).add(node.name);\n }\n let serial = 0;\n const available = new Set<string>();\n const transform = (expression: Expression, handler = false, async = false): string => {\n const declarations = [...states, ...constants].map(name => `${constants.has(name) ? 'const' : 'let'} ${name} = undefined;`).join('\\n');\n const prefix = `${ast.imports.map(i => i.source).join('\\n')}\\n${[...names].map(n => `function ${n}() {}`).join('\\n')}\\nfunction __hContext() {\\n${declarations}\\n${async ? 'async ' : ''}function __hExpression(${handler ? 'event' : ''}) {\\n${handler ? '' : 'return ('}`;\n const text = prefix + expression.source + (handler ? '' : ');') + '\\n}\\n}';\n const filename = '/__hesh_expression__.js';\n const settings: ts.CompilerOptions = { allowJs: true, checkJs: true, target: ts.ScriptTarget.ESNext, module: ts.ModuleKind.ESNext, noEmit: true };\n const host = ts.createCompilerHost(settings);\n const original = host.getSourceFile.bind(host);\n host.getSourceFile = (name, languageVersion, onError, shouldCreate) => name === filename ? ts.createSourceFile(name, text, languageVersion, true, ts.ScriptKind.JS) : original(name, languageVersion, onError, shouldCreate);\n const program = ts.createProgram([filename], settings, host);\n const file = program.getSourceFile(filename)!;\n const diagnostics = program.getSyntacticDiagnostics(file);\n if (diagnostics.length) {\n const d = diagnostics[0]!;\n fail(ts.flattenDiagnosticMessageText(d.messageText, '\\n'), expression.start + Math.max(0, (d.start ?? prefix.length) - prefix.length));\n }\n const checker = program.getTypeChecker();\n const context = file.statements.find(n => ts.isFunctionDeclaration(n) && n.name?.text === '__hContext') as ts.FunctionDeclaration;\n const symbols = new Map<ts.Symbol, string>();\n for (const stmt of context.body!.statements) if (ts.isVariableStatement(stmt)) {\n const name = stmt.declarationList.declarations[0]!.name as ts.Identifier;\n symbols.set(checker.getSymbolAtLocation(name)!, name.text);\n }\n const fn = context.body!.statements.at(-1) as ts.FunctionDeclaration;\n const dependencies = new Set<string>();\n const stateName = (node: ts.Node): string | undefined => {\n if (!ts.isIdentifier(node)) return;\n const symbol = checker.getSymbolAtLocation(node);\n const name = symbol ? symbols.get(symbol) : undefined;\n if (name && !handler && !available.has(name)) fail(`Binding ${name} is used before initialization`, expression.start);\n return name;\n };\n const read = (name: string) => f.createCallExpression(f.createPropertyAccessExpression(f.createIdentifier(name), 'get'), undefined, []);\n const write = (name: string, value: ts.Expression) => f.createCallExpression(f.createPropertyAccessExpression(f.createIdentifier(name), 'set'), undefined, [value]);\n const result = ts.transform(fn.body!, [context => {\n const visit: ts.Visitor = node => {\n if (ts.isIdentifier(node) && node.text.startsWith('__h')) fail('Identifiers beginning __h are reserved', expression.start + Math.max(0, node.getStart(file) - prefix.length));\n if ((ts.isPrefixUnaryExpression(node) || ts.isPostfixUnaryExpression(node)) && [ts.SyntaxKind.PlusPlusToken, ts.SyntaxKind.MinusMinusToken].includes(node.operator)) {\n const name = stateName(node.operand);\n if (name) {\n dependencies.add(name);\n if (constants.has(name)) fail(`Cannot assign constant ${name}`, expression.start);\n const delta = node.operator === ts.SyntaxKind.PlusPlusToken ? f.createNumericLiteral(1) : f.createPrefixUnaryExpression(ts.SyntaxKind.MinusToken, f.createNumericLiteral(1));\n return f.createCallExpression(f.createIdentifier('__hUpdate'), undefined, [f.createIdentifier(name), delta, node.kind === ts.SyntaxKind.PostfixUnaryExpression ? f.createTrue() : f.createFalse()]);\n }\n }\n if (ts.isBinaryExpression(node) && node.operatorToken.kind >= ts.SyntaxKind.FirstAssignment && node.operatorToken.kind <= ts.SyntaxKind.LastAssignment) {\n if (ts.isArrayLiteralExpression(node.left) || ts.isObjectLiteralExpression(node.left)) {\n const checkTarget = (target: ts.Node): void => {\n const name = stateName(target);\n if (name) fail('Destructuring assignments to component bindings are not supported', expression.start);\n ts.forEachChild(target, checkTarget);\n };\n checkTarget(node.left);\n }\n const name = stateName(node.left);\n if (name) {\n dependencies.add(name);\n if (constants.has(name)) fail(`Cannot assign constant ${name}`, expression.start);\n const right = ts.visitNode(node.right, visit) as ts.Expression;\n if (node.operatorToken.kind === ts.SyntaxKind.EqualsToken) return write(name, right);\n const operators: Partial<Record<ts.SyntaxKind, ts.BinaryOperator>> = {\n [ts.SyntaxKind.PlusEqualsToken]: ts.SyntaxKind.PlusToken, [ts.SyntaxKind.MinusEqualsToken]: ts.SyntaxKind.MinusToken,\n [ts.SyntaxKind.AsteriskEqualsToken]: ts.SyntaxKind.AsteriskToken, [ts.SyntaxKind.SlashEqualsToken]: ts.SyntaxKind.SlashToken,\n [ts.SyntaxKind.PercentEqualsToken]: ts.SyntaxKind.PercentToken, [ts.SyntaxKind.AsteriskAsteriskEqualsToken]: ts.SyntaxKind.AsteriskAsteriskToken,\n [ts.SyntaxKind.AmpersandEqualsToken]: ts.SyntaxKind.AmpersandToken, [ts.SyntaxKind.BarEqualsToken]: ts.SyntaxKind.BarToken,\n [ts.SyntaxKind.CaretEqualsToken]: ts.SyntaxKind.CaretToken, [ts.SyntaxKind.LessThanLessThanEqualsToken]: ts.SyntaxKind.LessThanLessThanToken,\n [ts.SyntaxKind.GreaterThanGreaterThanEqualsToken]: ts.SyntaxKind.GreaterThanGreaterThanToken, [ts.SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken]: ts.SyntaxKind.GreaterThanGreaterThanGreaterThanToken\n };\n const op = operators[node.operatorToken.kind];\n if (!op) fail('Logical assignment to state is not supported yet', expression.start);\n return write(name, f.createBinaryExpression(read(name), op!, right));\n }\n }\n if (ts.isShorthandPropertyAssignment(node)) {\n const symbol = checker.getShorthandAssignmentValueSymbol(node);\n const name = symbol && symbols.get(symbol);\n if (name && !handler && !available.has(name)) fail(`Binding ${name} is used before initialization`, expression.start);\n if (name && states.has(name)) { dependencies.add(name); return f.createPropertyAssignment(node.name.text, read(name)); }\n }\n if (ts.isIdentifier(node)) {\n const name = stateName(node);\n if (name && !handler && !available.has(name)) fail(`Binding ${name} is used before initialization`, expression.start);\n if (name && states.has(name)) { dependencies.add(name); return read(name); }\n }\n if ((ts.isForOfStatement(node) || ts.isForInStatement(node)) && stateName(node.initializer)) fail('Use a local loop variable, then assign state in the loop body', expression.start);\n return ts.visitEachChild(node, visit, context);\n };\n return node => ts.visitNode(node, visit) as ts.Block;\n }]);\n // Report unresolved names while leaving module resolution and imported types to Vite/tsc.\n for (const d of program.getSemanticDiagnostics(file)) if ((d.code < 2000 || [2304, 2552, 2588].includes(d.code)) && (d.start ?? 0) >= prefix.length && (d.start ?? 0) < prefix.length + expression.source.length) {\n fail(ts.flattenDiagnosticMessageText(d.messageText, '\\n'), expression.start + d.start! - prefix.length);\n }\n const body = result.transformed[0] as ts.Block;\n metadata.push({ view: view.name, start: expression.start, end: expression.end, dependencies: [...dependencies].sort(), kind: handler ? 'event' : 'expression' });\n let rendered: string;\n if (handler) rendered = printer.printNode(ts.EmitHint.Unspecified, body, file);\n else rendered = printer.printNode(ts.EmitHint.Expression, (body.statements[0] as ts.ReturnStatement).expression!, file);\n result.dispose();\n return rendered;\n };\n const value = (expr: Expression): string => {\n if (!expr.source.startsWith('\"')) return transform(expr);\n const tokens = tokenize(expr.source);\n if (tokens.length !== 1 || tokens[0]!.kind !== ts.SyntaxKind.StringLiteral) return transform(expr);\n const raw = expr.source.slice(1, -1);\n const parts: string[] = [];\n let literal = '', i = 0;\n const emit = () => { if (literal) { parts.push(JSON.stringify(literal)); literal = ''; } };\n while (i < raw.length) {\n if (raw[i] === '\\\\') {\n const next = raw[++i];\n const escapes: Record<string, string> = { n: '\\n', r: '\\r', t: '\\t', b: '\\b', f: '\\f', v: '\\v', '0': '\\0' };\n if (next === 'u' || next === 'x') fail('Use single quotes for Unicode/hex escapes in literal strings', expr.start + i);\n literal += escapes[next ?? ''] ?? next ?? ''; i++; continue;\n }\n if (raw[i] !== '{') { literal += raw[i++]; continue; }\n emit(); const start = ++i;\n const nested = tokenize(raw.slice(start)); let depth = 1, end = -1;\n for (const token of nested) { if (token.text === '{') depth++; if (token.text === '}' && --depth === 0) { end = start + token.start; break; } }\n if (end < 0) fail('Unterminated text interpolation', expr.start + start);\n parts.push(`String(${transform({ source: raw.slice(start, end), start: expr.start + 1 + start, end: expr.start + 1 + end })} ?? \"\")`);\n i = end + 1;\n }\n emit(); return parts.length ? parts.join(' + ') : '\"\"';\n };\n const emit = (node: Element, parent: string): void => {\n if (/^[A-Z]/.test(node.name)) {\n if (!names.has(node.name) && !imported.has(node.name)) fail(`Unknown component ${node.name}`, node.start);\n if (node.value || node.handler || node.children.length) fail('Component props, event blocks and slots are not supported in Milestone 1', node.start);\n output.push(`__hDOM.component(${parent}, ${node.name});`); return;\n }\n const id = `__hNode${serial++}`;\n output.push(`const ${id} = __hDOM.element(${parent}, ${JSON.stringify(node.name)});`);\n if (node.value) {\n if (node.name === 'input') {\n if (!states.has(node.value.source.trim()) || !available.has(node.value.source.trim())) fail('input requires an initialized state identifier', node.value.start);\n output.push(`__hDOM.input(${id}, ${node.value.source});`);\n } else if (node.name === 'image' || node.name === 'img') output.push(`__hDOM.attribute(${id}, \"src\", () => ${value(node.value)});`);\n else output.push(`__hDOM.text(${id}, () => ${value(node.value)});`);\n }\n if (node.handler) output.push(`__hDOM.listen(${id}, \"click\", ${node.async ? 'async ' : ''}(event) => ${transform(node.handler, true, node.async)});`);\n node.children.forEach(child => emit(child, id));\n };\n for (const node of view.body) {\n if (node.kind === 'element') emit(node, '__hParent');\n else { output.push(`const ${node.name} = ${node.kind === 'state' ? '__hSignal(' : ''}${transform(node.value)}${node.kind === 'state' ? ')' : ''};`); available.add(node.name); }\n }\n views.push({ name: view.name, exported: view.exported, default: view.default, instructions: output });\n }\n const ir: ModuleIR = { prelude, views, bindings: options.development === false ? [] : metadata };\n const output = [...ir.prelude, ...ir.views.flatMap(view => [\n `${view.exported ? 'export ' : ''}${view.default ? 'default ' : ''}function ${view.name}(__hParent) {`,\n ...view.instructions.map(instruction => instruction.split('\\n').map(line => ` ${line}`).join('\\n')),\n '}'\n ])];\n if (options.development !== false) output.push(`export const __hesh = ${JSON.stringify(metadata)};`);\n return { code: output.join('\\n'), css: '', metadata: options.development === false ? [] : metadata, ast, ir };\n}\n\nexport function createCompiler() {\n const cache = new Map<string, Result>();\n return {\n compile(source: string, options: CompileOptions = {}) {\n const key = JSON.stringify([source, options]);\n let result = cache.get(key);\n if (!result) { result = compile(source, options); cache.set(key, result); }\n return result;\n },\n clear() { cache.clear(); }\n };\n}\n\r\n"]}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { type RouteLocation } from '../hmvc/index.js';
|
|
2
|
+
import { createDomainGraph, type DomainDefinition, type DomainOptions, type DomainGraph } from '../domains/index.js';
|
|
3
|
+
import { type Disposer } from '../reactivity/index.js';
|
|
4
|
+
import type { PresentationState } from '../presentation/index.js';
|
|
5
|
+
export type InputType = 'string' | 'number' | 'boolean';
|
|
6
|
+
export interface TransitionOptions {
|
|
7
|
+
query?: Record<string, string>;
|
|
8
|
+
hash?: string;
|
|
9
|
+
presentation?: 'page';
|
|
10
|
+
}
|
|
11
|
+
export interface Destination<I extends object> {
|
|
12
|
+
readonly name: string;
|
|
13
|
+
href(input: I, options?: TransitionOptions): string;
|
|
14
|
+
open(input: I, options?: TransitionOptions): void;
|
|
15
|
+
replace(input: I, options?: TransitionOptions): void;
|
|
16
|
+
/** Prefetch code/resources, not business data or authorization results. */
|
|
17
|
+
prefetch(input: I): Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
export interface PresentationContext {
|
|
20
|
+
domains: Record<string, unknown>;
|
|
21
|
+
input: Record<string, string | number | boolean>;
|
|
22
|
+
location: RouteLocation;
|
|
23
|
+
signal: AbortSignal;
|
|
24
|
+
}
|
|
25
|
+
export interface PresentationResources {
|
|
26
|
+
create(context: PresentationContext): PresentationState;
|
|
27
|
+
view(parent: Node, state: PresentationState, destinations: Record<string, Destination<Record<string, unknown>>>): void;
|
|
28
|
+
}
|
|
29
|
+
export interface DestinationDefinition {
|
|
30
|
+
name: string;
|
|
31
|
+
url: string;
|
|
32
|
+
input: Record<string, InputType>;
|
|
33
|
+
owner: string;
|
|
34
|
+
access?: string;
|
|
35
|
+
load(): Promise<PresentationResources>;
|
|
36
|
+
}
|
|
37
|
+
export interface DestinationEvent {
|
|
38
|
+
type: 'loading' | 'ready' | 'blocked' | 'error' | 'cancelled' | 'disposed';
|
|
39
|
+
destination: string;
|
|
40
|
+
reason?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface ApplicationOptions extends DomainOptions {
|
|
43
|
+
window?: Window;
|
|
44
|
+
onError?: (error: unknown) => void;
|
|
45
|
+
onDiagnostic?: (event: DestinationEvent) => void;
|
|
46
|
+
}
|
|
47
|
+
export interface GraphApplication<D = Record<string, Destination<Record<string, unknown>>>, G = Record<string, Record<string, unknown>>> {
|
|
48
|
+
destinations: D;
|
|
49
|
+
domains: G;
|
|
50
|
+
status: {
|
|
51
|
+
get(): {
|
|
52
|
+
phase: 'idle' | 'loading' | 'ready' | 'error';
|
|
53
|
+
destination?: string;
|
|
54
|
+
error?: unknown;
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
start(parent: Node): Disposer;
|
|
58
|
+
stop(): void;
|
|
59
|
+
}
|
|
60
|
+
export declare function validateInput(schema: Record<string, InputType>, input: object): Record<string, string | number | boolean>;
|
|
61
|
+
export declare function createGraphApplication(definitions: readonly DomainDefinition[], pages: readonly DestinationDefinition[], options?: ApplicationOptions): GraphApplication;
|
|
62
|
+
export { createDomainGraph };
|
|
63
|
+
export type { DomainDefinition, DomainGraph };
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { createRouter } from '../router/index.js';
|
|
2
|
+
import { defineModule, useController, useModule, withModuleContext } from '../hmvc/index.js';
|
|
3
|
+
import { createDomainGraph, ClientPolicyDenied } from '../domains/index.js';
|
|
4
|
+
import { signal, effect, onCleanup, scope } from '../reactivity/index.js';
|
|
5
|
+
import { mount, element, text } from '../dom/index.js';
|
|
6
|
+
export function validateInput(schema, input) {
|
|
7
|
+
if (!input || typeof input !== 'object' || Array.isArray(input))
|
|
8
|
+
throw new Error('Destination input must be an object');
|
|
9
|
+
const values = input;
|
|
10
|
+
for (const key of Object.keys(values))
|
|
11
|
+
if (!Object.hasOwn(schema, key))
|
|
12
|
+
throw new Error(`Unknown destination input ${key}`);
|
|
13
|
+
const result = Object.create(null);
|
|
14
|
+
for (const [key, type] of Object.entries(schema)) {
|
|
15
|
+
const value = values[key];
|
|
16
|
+
if (!Object.hasOwn(values, key) || typeof value !== type || (type === 'number' && !Number.isFinite(value)) || (type === 'string' && !value.length))
|
|
17
|
+
throw new Error(`Destination input ${key} must be ${type}${type === 'string' ? ' (nonempty)' : ''}`);
|
|
18
|
+
if (type === 'string' && (value === '.' || value === '..'))
|
|
19
|
+
throw new Error(`Destination input ${key} cannot be a URL dot segment`);
|
|
20
|
+
result[key] = value;
|
|
21
|
+
}
|
|
22
|
+
return result;
|
|
23
|
+
}
|
|
24
|
+
function decodeInput(definition, params) {
|
|
25
|
+
const values = Object.create(null);
|
|
26
|
+
for (const [key, type] of Object.entries(definition.input)) {
|
|
27
|
+
const raw = params[key];
|
|
28
|
+
if (raw === undefined)
|
|
29
|
+
throw new Error(`Missing URL input ${key}`);
|
|
30
|
+
if (type === 'boolean' && raw !== 'true' && raw !== 'false')
|
|
31
|
+
throw new Error(`URL input ${key} must be true/false`);
|
|
32
|
+
if (type === 'number' && !raw.trim())
|
|
33
|
+
throw new Error(`URL input ${key} must be numeric`);
|
|
34
|
+
values[key] = type === 'number' ? Number(raw) : type === 'boolean' ? raw === 'true' : raw;
|
|
35
|
+
}
|
|
36
|
+
return validateInput(definition.input, values);
|
|
37
|
+
}
|
|
38
|
+
export function createGraphApplication(definitions, pages, options = {}) {
|
|
39
|
+
const graph = createDomainGraph(definitions, options);
|
|
40
|
+
const status = signal({ phase: 'idle' });
|
|
41
|
+
const report = options.onError ?? (error => console.error(error));
|
|
42
|
+
const emit = (type, destination, error) => {
|
|
43
|
+
if (!options.onDiagnostic)
|
|
44
|
+
return;
|
|
45
|
+
try {
|
|
46
|
+
options.onDiagnostic({ type, destination, ...(error === undefined ? {} : { reason: error instanceof Error ? error.message : String(error) }) });
|
|
47
|
+
}
|
|
48
|
+
catch (failure) {
|
|
49
|
+
report(failure);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
const destinations = Object.create(null);
|
|
53
|
+
const code = new Map();
|
|
54
|
+
let stopped = false;
|
|
55
|
+
const load = (page) => {
|
|
56
|
+
let result = code.get(page.name);
|
|
57
|
+
if (!result) {
|
|
58
|
+
result = Promise.resolve().then(page.load).catch(error => { code.delete(page.name); throw error; });
|
|
59
|
+
code.set(page.name, result);
|
|
60
|
+
}
|
|
61
|
+
return result;
|
|
62
|
+
};
|
|
63
|
+
const authorize = (page) => {
|
|
64
|
+
if (page.access && options.authorize?.(page.access) !== true)
|
|
65
|
+
throw new ClientPolicyDenied(page.access, page.name);
|
|
66
|
+
};
|
|
67
|
+
const routes = pages.map(page => ({ path: page.url, module: defineModule({
|
|
68
|
+
model: context => context.route,
|
|
69
|
+
controller: route => route,
|
|
70
|
+
view(parent) {
|
|
71
|
+
const parentContext = useModule();
|
|
72
|
+
const route = useController();
|
|
73
|
+
effect(() => {
|
|
74
|
+
const location = route.get();
|
|
75
|
+
const abort = new AbortController();
|
|
76
|
+
let dispose, settled = false;
|
|
77
|
+
onCleanup(() => { abort.abort(); dispose?.(); emit(settled ? 'disposed' : 'cancelled', page.name); });
|
|
78
|
+
const message = element(parent, 'p');
|
|
79
|
+
message.setAttribute('role', 'status');
|
|
80
|
+
text(message, () => 'Loading…');
|
|
81
|
+
status.set({ phase: 'loading', destination: page.name });
|
|
82
|
+
emit('loading', page.name);
|
|
83
|
+
const failed = (error) => {
|
|
84
|
+
if (abort.signal.aborted)
|
|
85
|
+
return;
|
|
86
|
+
settled = true;
|
|
87
|
+
message.textContent = 'Unable to open this destination.';
|
|
88
|
+
message.setAttribute('role', 'alert');
|
|
89
|
+
status.set({ phase: 'error', destination: page.name, error });
|
|
90
|
+
emit(error instanceof ClientPolicyDenied ? 'blocked' : 'error', page.name, error);
|
|
91
|
+
report(error);
|
|
92
|
+
};
|
|
93
|
+
let input;
|
|
94
|
+
try {
|
|
95
|
+
authorize(page);
|
|
96
|
+
input = decodeInput(page, location.params);
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
failed(error);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
void load(page).then(resources => {
|
|
103
|
+
if (abort.signal.aborted)
|
|
104
|
+
return;
|
|
105
|
+
const owned = scope(() => {
|
|
106
|
+
const state = resources.create({ input, domains: graph.forDomain(page.owner), location, signal: abort.signal });
|
|
107
|
+
if (state && typeof state.then === 'function')
|
|
108
|
+
throw new Error('Presentation factories must be synchronous; use the provided AbortSignal for async work');
|
|
109
|
+
mount(() => withModuleContext(parentContext, () => resources.view(parent, state, destinations)), parent, { onError: report });
|
|
110
|
+
});
|
|
111
|
+
dispose = owned.dispose;
|
|
112
|
+
if (abort.signal.aborted) {
|
|
113
|
+
dispose();
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
settled = true;
|
|
117
|
+
message.remove();
|
|
118
|
+
status.set({ phase: 'ready', destination: page.name });
|
|
119
|
+
emit('ready', page.name);
|
|
120
|
+
// Page-only focus management; opt-in target or the first heading.
|
|
121
|
+
const target = parent.querySelector?.('[data-hesh-focus], h1, h2');
|
|
122
|
+
if (target) {
|
|
123
|
+
if (!target.hasAttribute('tabindex'))
|
|
124
|
+
target.setAttribute('tabindex', '-1');
|
|
125
|
+
target.focus({ preventScroll: true });
|
|
126
|
+
}
|
|
127
|
+
}).catch(failed);
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}) }));
|
|
131
|
+
let router;
|
|
132
|
+
try {
|
|
133
|
+
router = createRouter({ routes, window: options.window, onError: report });
|
|
134
|
+
}
|
|
135
|
+
catch (error) {
|
|
136
|
+
graph.dispose();
|
|
137
|
+
throw error;
|
|
138
|
+
}
|
|
139
|
+
for (const page of pages) {
|
|
140
|
+
if (destinations[page.name]) {
|
|
141
|
+
graph.dispose();
|
|
142
|
+
throw new Error(`Duplicate destination ${page.name}`);
|
|
143
|
+
}
|
|
144
|
+
const href = (input, transition = {}) => {
|
|
145
|
+
if (stopped)
|
|
146
|
+
throw new Error('Application is disposed');
|
|
147
|
+
if (transition.presentation && transition.presentation !== 'page')
|
|
148
|
+
throw new Error('Only page presentation is supported');
|
|
149
|
+
const values = validateInput(page.input, input);
|
|
150
|
+
const path = page.url.split('/').map(part => part.startsWith(':') ? encodeURIComponent(String(values[part.slice(1)])) : part).join('/');
|
|
151
|
+
const query = new URLSearchParams(transition.query).toString();
|
|
152
|
+
const hash = transition.hash ? '#' + encodeURIComponent(transition.hash) : '';
|
|
153
|
+
return path + (query ? '?' + query : '') + hash;
|
|
154
|
+
};
|
|
155
|
+
destinations[page.name] = Object.freeze({ name: page.name, href,
|
|
156
|
+
open(input, transition) { authorize(page); router.navigate(href(input, transition)); },
|
|
157
|
+
replace(input, transition) { authorize(page); router.navigate(href(input, transition), { replace: true }); },
|
|
158
|
+
async prefetch(input) { href(input); await load(page); }
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
const stop = () => { if (stopped)
|
|
162
|
+
return; stopped = true; try {
|
|
163
|
+
router.stop();
|
|
164
|
+
}
|
|
165
|
+
finally {
|
|
166
|
+
try {
|
|
167
|
+
graph.dispose();
|
|
168
|
+
}
|
|
169
|
+
finally {
|
|
170
|
+
code.clear();
|
|
171
|
+
status.set({ phase: 'idle' });
|
|
172
|
+
}
|
|
173
|
+
} };
|
|
174
|
+
return { destinations: Object.freeze(destinations), domains: graph.domains, status: { get: status.get },
|
|
175
|
+
start(parent) { if (stopped)
|
|
176
|
+
throw new Error('Application is disposed'); try {
|
|
177
|
+
router.start(parent);
|
|
178
|
+
return stop;
|
|
179
|
+
}
|
|
180
|
+
catch (error) {
|
|
181
|
+
stop();
|
|
182
|
+
throw error;
|
|
183
|
+
} }, stop };
|
|
184
|
+
}
|
|
185
|
+
export { createDomainGraph };
|
|
186
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/destinations/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { createRouter } from '../router/index.js';\nimport { defineModule, useController, useModule, withModuleContext, type RouteLocation } from '../hmvc/index.js';\nimport { createDomainGraph, ClientPolicyDenied, type DomainDefinition, type DomainOptions, type DomainGraph } from '../domains/index.js';\nimport { signal, effect, onCleanup, scope, type Disposer } from '../reactivity/index.js';\nimport { mount, element, text } from '../dom/index.js';\nimport type { PresentationState } from '../presentation/index.js';\nexport type InputType = 'string' | 'number' | 'boolean';\nexport interface TransitionOptions { query?: Record<string, string>; hash?: string; presentation?: 'page' }\nexport interface Destination<I extends object> {\n readonly name: string;\n href(input: I, options?: TransitionOptions): string;\n open(input: I, options?: TransitionOptions): void;\n replace(input: I, options?: TransitionOptions): void;\n /** Prefetch code/resources, not business data or authorization results. */\n prefetch(input: I): Promise<void>;\n}\nexport interface PresentationContext {\n domains: Record<string, unknown>;\n input: Record<string, string | number | boolean>;\n location: RouteLocation;\n signal: AbortSignal;\n}\nexport interface PresentationResources {\n create(context: PresentationContext): PresentationState;\n view(parent: Node, state: PresentationState, destinations: Record<string, Destination<Record<string, unknown>>>): void;\n}\nexport interface DestinationDefinition {\n name: string; url: string; input: Record<string, InputType>; owner: string; access?: string;\n load(): Promise<PresentationResources>;\n}\nexport interface DestinationEvent { type: 'loading' | 'ready' | 'blocked' | 'error' | 'cancelled' | 'disposed'; destination: string; reason?: string }\nexport interface ApplicationOptions extends DomainOptions { window?: Window; onError?: (error: unknown) => void; onDiagnostic?: (event: DestinationEvent) => void }\nexport interface GraphApplication<D = Record<string, Destination<Record<string, unknown>>>, G = Record<string, Record<string, unknown>>> {\n destinations: D;\n domains: G;\n status: { get(): { phase: 'idle' | 'loading' | 'ready' | 'error'; destination?: string; error?: unknown } };\n start(parent: Node): Disposer;\n stop(): void;\n}\nexport function validateInput(schema: Record<string, InputType>, input: object): Record<string, string | number | boolean> {\n if (!input || typeof input !== 'object' || Array.isArray(input)) throw new Error('Destination input must be an object');\n const values = input as Record<string, unknown>;\n for (const key of Object.keys(values)) if (!Object.hasOwn(schema, key)) throw new Error(`Unknown destination input ${key}`);\n const result: Record<string, string | number | boolean> = Object.create(null);\n for (const [key, type] of Object.entries(schema)) {\n const value = values[key];\n if (!Object.hasOwn(values, key) || typeof value !== type || (type === 'number' && !Number.isFinite(value)) || (type === 'string' && !(value as string).length)) throw new Error(`Destination input ${key} must be ${type}${type === 'string' ? ' (nonempty)' : ''}`);\n if (type === 'string' && (value === '.' || value === '..')) throw new Error(`Destination input ${key} cannot be a URL dot segment`);\n result[key] = value as string | number | boolean;\n }\n return result;\n}\nfunction decodeInput(definition: DestinationDefinition, params: Readonly<Record<string, string>>): Record<string, string | number | boolean> {\n const values: Record<string, unknown> = Object.create(null);\n for (const [key, type] of Object.entries(definition.input)) {\n const raw = params[key];\n if (raw === undefined) throw new Error(`Missing URL input ${key}`);\n if (type === 'boolean' && raw !== 'true' && raw !== 'false') throw new Error(`URL input ${key} must be true/false`);\n if (type === 'number' && !raw.trim()) throw new Error(`URL input ${key} must be numeric`);\n values[key] = type === 'number' ? Number(raw) : type === 'boolean' ? raw === 'true' : raw;\n }\n return validateInput(definition.input, values);\n}\nexport function createGraphApplication(definitions: readonly DomainDefinition[], pages: readonly DestinationDefinition[], options: ApplicationOptions = {}): GraphApplication {\n const graph = createDomainGraph(definitions, options);\n const status = signal<{ phase: 'idle' | 'loading' | 'ready' | 'error'; destination?: string; error?: unknown }>({ phase: 'idle' });\n const report = options.onError ?? (error => console.error(error));\n const emit = (type: DestinationEvent['type'], destination: string, error?: unknown) => {\n if (!options.onDiagnostic) return;\n try { options.onDiagnostic({ type, destination, ...(error === undefined ? {} : { reason: error instanceof Error ? error.message : String(error) }) }); }\n catch (failure) { report(failure); }\n };\n const destinations: Record<string, Destination<Record<string, unknown>>> = Object.create(null);\n const code = new Map<string, Promise<PresentationResources>>();\n let stopped = false;\n const load = (page: DestinationDefinition) => {\n let result = code.get(page.name);\n if (!result) { result = Promise.resolve().then(page.load).catch(error => { code.delete(page.name); throw error; }); code.set(page.name, result); }\n return result;\n };\n const authorize = (page: DestinationDefinition) => {\n if (page.access && options.authorize?.(page.access) !== true) throw new ClientPolicyDenied(page.access, page.name);\n };\n const routes = pages.map(page => ({ path: page.url, module: defineModule({\n model: context => context.route,\n controller: route => route,\n view(parent) {\n const parentContext = useModule();\n const route = useController<{ get(): RouteLocation }>();\n effect(() => {\n const location = route.get();\n const abort = new AbortController(); let dispose: Disposer | undefined, settled = false;\n onCleanup(() => { abort.abort(); dispose?.(); emit(settled ? 'disposed' : 'cancelled', page.name); });\n const message = element(parent, 'p'); message.setAttribute('role', 'status'); text(message, () => 'Loading…');\n status.set({ phase: 'loading', destination: page.name });\n emit('loading', page.name);\n const failed = (error: unknown) => {\n if (abort.signal.aborted) return;\n settled = true;\n message.textContent = 'Unable to open this destination.'; message.setAttribute('role', 'alert');\n status.set({ phase: 'error', destination: page.name, error }); emit(error instanceof ClientPolicyDenied ? 'blocked' : 'error', page.name, error); report(error);\n };\n let input: ReturnType<typeof validateInput>;\n try { authorize(page); input = decodeInput(page, location.params); } catch (error) { failed(error); return; }\n void load(page).then(resources => {\n if (abort.signal.aborted) return;\n const owned = scope(() => {\n const state = resources.create({ input, domains: graph.forDomain(page.owner), location, signal: abort.signal });\n if (state && typeof (state as unknown as { then?: unknown }).then === 'function') throw new Error('Presentation factories must be synchronous; use the provided AbortSignal for async work');\n mount(() => withModuleContext(parentContext, () => resources.view(parent, state, destinations)), parent, { onError: report });\n });\n dispose = owned.dispose;\n if (abort.signal.aborted) { dispose(); return; }\n settled = true; message.remove(); status.set({ phase: 'ready', destination: page.name }); emit('ready', page.name);\n // Page-only focus management; opt-in target or the first heading.\n const target = (parent as Element).querySelector?.('[data-hesh-focus], h1, h2') as HTMLElement | null | undefined;\n if (target) { if (!target.hasAttribute('tabindex')) target.setAttribute('tabindex', '-1'); target.focus({ preventScroll: true }); }\n }).catch(failed);\n });\n }\n }) }));\n let router: ReturnType<typeof createRouter>;\n try { router = createRouter({ routes, window: options.window, onError: report }); }\n catch (error) { graph.dispose(); throw error; }\n for (const page of pages) {\n if (destinations[page.name]) { graph.dispose(); throw new Error(`Duplicate destination ${page.name}`); }\n const href = (input: object, transition: TransitionOptions = {}) => {\n if (stopped) throw new Error('Application is disposed');\n if (transition.presentation && transition.presentation !== 'page') throw new Error('Only page presentation is supported');\n const values = validateInput(page.input, input);\n const path = page.url.split('/').map(part => part.startsWith(':') ? encodeURIComponent(String(values[part.slice(1)])) : part).join('/');\n const query = new URLSearchParams(transition.query).toString();\n const hash = transition.hash ? '#' + encodeURIComponent(transition.hash) : '';\n return path + (query ? '?' + query : '') + hash;\n };\n destinations[page.name] = Object.freeze({ name: page.name, href,\n open(input: object, transition?: TransitionOptions) { authorize(page); router.navigate(href(input, transition)); },\n replace(input: object, transition?: TransitionOptions) { authorize(page); router.navigate(href(input, transition), { replace: true }); },\n async prefetch(input: object) { href(input); await load(page); }\n });\n }\n const stop = () => { if (stopped) return; stopped = true; try { router.stop(); } finally { try { graph.dispose(); } finally { code.clear(); status.set({ phase: 'idle' }); } } };\n return { destinations: Object.freeze(destinations), domains: graph.domains, status: { get: status.get },\n start(parent) { if (stopped) throw new Error('Application is disposed'); try { router.start(parent); return stop; } catch (error) { stop(); throw error; } }, stop };\n}\nexport { createDomainGraph };\nexport type { DomainDefinition, DomainGraph };\n"]}
|
package/dist/dom/index.d.ts
CHANGED
|
@@ -5,6 +5,8 @@ export interface MountOptions {
|
|
|
5
5
|
}
|
|
6
6
|
export declare function mount(component: Component, parent: Node, options?: MountOptions): Disposer;
|
|
7
7
|
export declare function element(parent: Node, name: string): HTMLElement;
|
|
8
|
+
/** Creates the exact HTML tag name, without Hesh shorthand aliases. */
|
|
9
|
+
export declare function nativeElement(parent: Node, name: string): HTMLElement;
|
|
8
10
|
export declare function text(parent: Node, read: () => unknown): void;
|
|
9
11
|
export declare function attribute(node: HTMLElement, name: string, read: () => unknown): void;
|
|
10
12
|
export declare function listen(node: HTMLElement, name: string, handler: (event: Event) => unknown): void;
|
package/dist/dom/index.js
CHANGED
|
@@ -12,7 +12,11 @@ export function mount(component, parent, options = {}) {
|
|
|
12
12
|
}
|
|
13
13
|
}
|
|
14
14
|
export function element(parent, name) {
|
|
15
|
-
|
|
15
|
+
return nativeElement(parent, aliases[name] ?? name);
|
|
16
|
+
}
|
|
17
|
+
/** Creates the exact HTML tag name, without Hesh shorthand aliases. */
|
|
18
|
+
export function nativeElement(parent, name) {
|
|
19
|
+
const node = parent.ownerDocument.createElement(name);
|
|
16
20
|
parent.appendChild(node);
|
|
17
21
|
onCleanup(() => node.remove());
|
|
18
22
|
return node;
|
package/dist/dom/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dom/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAA8B,MAAM,wBAAwB,CAAC;AAGrG,IAAI,YAAY,GAA6B,KAAK,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AAC3E,MAAM,OAAO,GAA2B,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;AAEtI,MAAM,UAAU,KAAK,CAAC,SAAoB,EAAE,MAAY,EAAE,UAAwB,EAAE;IAClF,MAAM,QAAQ,GAAG,YAAY,CAAC;IAC9B,YAAY,GAAG,OAAO,CAAC,OAAO,IAAI,QAAQ,CAAC;IAC3C,IAAI,CAAC;QAAC,OAAO,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC;IAAC,CAAC;YAC9C,CAAC;QAAC,YAAY,GAAG,QAAQ,CAAC;IAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,MAAY,EAAE,IAAY;IAChD,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dom/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { effect, onCleanup, scope, batch, type Signal, type Disposer } from '../reactivity/index.js';\nexport type Component = (parent: Node) => void;\nexport interface MountOptions { onError?: (error: unknown) => void }\nlet errorHandler: (error: unknown) => void = error => console.error(error);\nconst aliases: Record<string, string> = { text: 'span', card: 'div', row: 'div', stack: 'div', grid: 'div', image: 'img', link: 'a' };\n\nexport function mount(component: Component, parent: Node, options: MountOptions = {}): Disposer {\n const previous = errorHandler;\n errorHandler = options.onError ?? previous;\n try { return scope(() => component(parent)).dispose; }\n finally { errorHandler = previous; }\n}\n\nexport function element(parent: Node, name: string): HTMLElement {\n return nativeElement(parent, aliases[name] ?? name);\n}\n\n/** Creates the exact HTML tag name, without Hesh shorthand aliases. */\nexport function nativeElement(parent: Node, name: string): HTMLElement {\n const node = parent.ownerDocument!.createElement(name);\n parent.appendChild(node);\n onCleanup(() => node.remove());\n return node;\n}\n\nexport function text(parent: Node, read: () => unknown): void {\n const node = parent.ownerDocument!.createTextNode('');\n parent.appendChild(node);\n onCleanup(() => node.remove());\n effect(() => { node.data = String(read() ?? ''); });\n}\n\nfunction safeURL(value: string): string {\n // Parse like a browser, including embedded ASCII tabs/newlines.\n const normalized = value.replace(/[\\u0000-\\u0020]/g, '');\n const scheme = /^([a-z][a-z\\d+.-]*):/i.exec(normalized)?.[1]?.toLowerCase();\n if (scheme && !['http', 'https', 'mailto', 'tel'].includes(scheme)) {\n throw new Error(`Unsafe URL scheme: ${scheme}`);\n }\n return value;\n}\n\nexport function attribute(node: HTMLElement, name: string, read: () => unknown): void {\n if (/^on/i.test(name) || ['innerhtml', 'outerhtml', 'srcdoc'].includes(name.toLowerCase())) throw new Error(`Unsafe attribute: ${name}`);\n effect(() => {\n const value = read();\n if (value == null || value === false) node.removeAttribute(name);\n else {\n const rendered = value === true ? '' : String(value);\n node.setAttribute(name, ['href', 'src', 'action', 'formaction', 'poster', 'xlink:href'].includes(name.toLowerCase()) ? safeURL(rendered) : rendered);\n }\n });\n}\n\nexport function listen(node: HTMLElement, name: string, handler: (event: Event) => unknown): void {\n const report = errorHandler;\n const listener = (event: Event) => {\n try { Promise.resolve(batch(() => handler(event))).catch(report); }\n catch (error) { report(error); }\n };\n node.addEventListener(name, listener);\n onCleanup(() => node.removeEventListener(name, listener));\n}\n\nexport function input(node: HTMLInputElement, state: Signal<unknown>): void {\n effect(() => { const value = String(state.get() ?? ''); if (node.value !== value) node.value = value; });\n listen(node, 'input', () => state.set(node.value));\n}\n\nexport function component(parent: Node, view: Component): void {\n scope(() => view(parent));\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { type Disposer } from '../reactivity/index.js';
|
|
2
|
+
export interface DomainDefinition {
|
|
3
|
+
name: string;
|
|
4
|
+
exposes: readonly string[];
|
|
5
|
+
consumes: readonly string[];
|
|
6
|
+
access?: Readonly<Record<string, string>>;
|
|
7
|
+
factory: (dependencies: Record<string, Record<string, unknown>>) => unknown;
|
|
8
|
+
}
|
|
9
|
+
export interface DomainOptions {
|
|
10
|
+
authorize?: (policy: string) => boolean;
|
|
11
|
+
}
|
|
12
|
+
export declare class ClientPolicyDenied extends Error {
|
|
13
|
+
readonly policy: string;
|
|
14
|
+
readonly contract: string;
|
|
15
|
+
readonly code = "HESH-ACCESS-001";
|
|
16
|
+
constructor(policy: string, contract: string);
|
|
17
|
+
}
|
|
18
|
+
export interface DomainGraph<T = Record<string, Record<string, unknown>>> {
|
|
19
|
+
readonly domains: T;
|
|
20
|
+
forDomain(name: string): Record<string, unknown>;
|
|
21
|
+
dispose: Disposer;
|
|
22
|
+
}
|
|
23
|
+
export declare function contractPath(path: string): string[];
|
|
24
|
+
export declare function createDomainGraph(definitions: readonly DomainDefinition[], options?: DomainOptions): DomainGraph;
|