@swiftuijs/twill 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +138 -0
- package/bin/twill.mjs +12 -0
- package/dist/branches.d.ts +12 -0
- package/dist/cli.d.ts +1 -0
- package/dist/cli.js +128 -0
- package/dist/cli.js.map +1 -0
- package/dist/compiler-Bi9TNOhX.js +1127 -0
- package/dist/compiler-Bi9TNOhX.js.map +1 -0
- package/dist/compiler.d.ts +50 -0
- package/dist/config.d.ts +6 -0
- package/dist/config.js +55 -0
- package/dist/config.js.map +1 -0
- package/dist/declarations.d.ts +14 -0
- package/dist/declarations.js +132 -0
- package/dist/declarations.js.map +1 -0
- package/dist/defer.d.ts +17 -0
- package/dist/doctor.d.ts +20 -0
- package/dist/doctor.js +198 -0
- package/dist/doctor.js.map +1 -0
- package/dist/editor.d.ts +53 -0
- package/dist/editor.js +261 -0
- package/dist/editor.js.map +1 -0
- package/dist/esbuild.d.ts +3 -0
- package/dist/esbuild.js +7 -0
- package/dist/esbuild.js.map +1 -0
- package/dist/files-D1mERoxc.js +46 -0
- package/dist/files-D1mERoxc.js.map +1 -0
- package/dist/files.d.ts +5 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/loader.d.ts +3 -0
- package/dist/loader.js +54 -0
- package/dist/loader.js.map +1 -0
- package/dist/parser.d.ts +9 -0
- package/dist/plugin-BGabvyT6.js +112 -0
- package/dist/plugin-BGabvyT6.js.map +1 -0
- package/dist/plugin.d.ts +9 -0
- package/dist/project.d.ts +62 -0
- package/dist/project.js +416 -0
- package/dist/project.js.map +1 -0
- package/dist/recovery.d.ts +3 -0
- package/dist/register.d.ts +1 -0
- package/dist/register.js +7 -0
- package/dist/register.js.map +1 -0
- package/dist/rollup.d.ts +3 -0
- package/dist/rollup.js +7 -0
- package/dist/rollup.js.map +1 -0
- package/dist/rspack.d.ts +3 -0
- package/dist/rspack.js +7 -0
- package/dist/rspack.js.map +1 -0
- package/dist/syntax.d.ts +11 -0
- package/dist/syntax.js +10 -0
- package/dist/syntax.js.map +1 -0
- package/dist/transpile-DwVekVFM.js +51 -0
- package/dist/transpile-DwVekVFM.js.map +1 -0
- package/dist/transpile.d.ts +11 -0
- package/dist/typescript-plugin.LICENSE.txt +375 -0
- package/dist/typescript-plugin.cjs +17741 -0
- package/dist/typescript-plugin.cjs.map +1 -0
- package/dist/typescript-plugin.d.ts +5 -0
- package/dist/vite-react.d.ts +10 -0
- package/dist/vite-react.js +22 -0
- package/dist/vite-react.js.map +1 -0
- package/dist/vite.d.ts +3 -0
- package/dist/vite.js +7 -0
- package/dist/vite.js.map +1 -0
- package/dist/webpack.d.ts +3 -0
- package/dist/webpack.js +7 -0
- package/dist/webpack.js.map +1 -0
- package/package.json +180 -0
- package/schemas/twill.schema.json +16 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compiler-Bi9TNOhX.js","names":["tt"],"sources":["../src/parser.js","../src/defer.ts","../src/branches.ts","../src/compiler.ts"],"sourcesContent":["// Acorn's extension hooks intentionally use its internal AST shape. Keep that\n// boundary here; the public compiler API is typed in compiler.ts.\nimport { Parser, tokTypes as tt } from 'acorn';\nimport { tsPlugin } from 'acorn-typescript';\nimport jsx from 'acorn-jsx';\n\nconst options = { ecmaVersion: 'latest', sourceType: 'module', locations: true };\nconst bases = {\n js: Parser,\n jsx: Parser.extend(jsx()),\n ts: Parser.extend(tsPlugin({ allowSatisfies: true })),\n tsx: Parser.extend(tsPlugin({ allowSatisfies: true })),\n};\n\n// `guard` remains an ordinary JS identifier unless its expression is followed\n// by a top-level `else`. Token lookahead ignores strings/comments and balanced\n// groups; it never rewrites source or attempts to parse the expression itself.\nfunction guardAt(input, offset, implicitMember = false) {\n const lexer = Parser.tokenizer(input.slice(offset), { ecmaVersion: 'latest' });\n const stack = [];\n let first = true;\n try {\n for (;;) {\n const token = lexer.getToken();\n const label = token.type.label;\n if (\n first &&\n ['=', '.', '?.', ':', '++/--', '*', '/', '%', '==/!=/===/!==', 'in', 'instanceof'].includes(\n label,\n ) &&\n !(implicitMember && label === '.')\n )\n return false;\n if (\n !stack.length &&\n ['if', 'for', 'while', 'switch', 'try', 'return', 'throw', 'var', 'export'].includes(label)\n )\n return false;\n if (!first && !stack.length && label === 'const') return false;\n first = false;\n if (!stack.length && label === 'else') return true;\n if (!stack.length && ['eof', ';', '}'].includes(label)) return false;\n if (['(', '[', '{', '${'].includes(label)) stack.push(label);\n else if ([')', ']', '}'].includes(label)) {\n if (!stack.length) return false;\n stack.pop();\n }\n }\n } catch {\n return false;\n }\n}\n\n// Deliberately conservative: do not infer exits from calls, loops or a nested\n// function's return. JS/TS still checks the legality of break/continue/return.\nfunction exits(node) {\n switch (node.type) {\n case 'ReturnStatement':\n case 'ThrowStatement':\n case 'BreakStatement':\n case 'ContinueStatement':\n return true;\n case 'BlockStatement':\n return node.body.some(exits);\n case 'IfStatement':\n return !!node.alternate && exits(node.consequent) && exits(node.alternate);\n default:\n return false;\n }\n}\n\nfunction awaits(node) {\n if (!node || typeof node !== 'object') return false;\n if (node.type === 'AwaitExpression' || node.await === true || node.kind === 'await using')\n return true;\n if (node.type === 'DeferStatement') return node.awaited;\n if (['FunctionDeclaration', 'FunctionExpression', 'ArrowFunctionExpression'].includes(node.type))\n return false;\n if (['ClassDeclaration', 'ClassExpression'].includes(node.type)) {\n return (\n awaits(node.superClass) ||\n node.body.body.some((member) => member.computed && awaits(member.key))\n );\n }\n return Object.entries(node).some(([key, value]) => {\n if (key === 'loc' || key === 'trailing') return false;\n return Array.isArray(value) ? value.some(awaits) : !!value?.type && awaits(value);\n });\n}\n\nfunction deferAt(input, offset) {\n try {\n const next = Parser.tokenizer(input.slice(offset), { ecmaVersion: 'latest' }).getToken();\n return (\n next.type === tt.braceL &&\n !/[\\r\\n\\u2028\\u2029]/.test(input.slice(offset, offset + next.start))\n );\n } catch {\n // The isolated tokenizer may read JS division as a regexp. Let the real\n // expression parser handle ordinary uses of the identifier instead.\n return false;\n }\n}\n\n// Inspect only the possible parameter header, using real tokens so comments,\n// strings, default arguments and destructuring cannot confuse the delimiter.\nfunction headerAt(input, offset) {\n const lexer = Parser.tokenizer(input.slice(offset), options);\n const stack = [];\n let first = true;\n const tokens = [];\n try {\n for (;;) {\n const token = lexer.getToken();\n const label = token.type.label;\n if (first && label !== 'name' && label !== '(') return null;\n first = false;\n if (!stack.length && label === 'in') {\n const async = tokens.length > 1 && tokens[0].value === 'async';\n const firstParam = tokens[async ? 1 : 0];\n return {\n start: offset,\n end: offset + token.end,\n inStart: offset + token.start,\n text: input.slice(offset + tokens[0].start, offset + tokens.at(-1).end),\n textStart: offset + tokens[0].start,\n async,\n asyncEnd: async ? offset + tokens[0].end : null,\n parenthesized: firstParam.type.label === '(',\n };\n }\n if (label === 'eof' || (!stack.length && [';', '{', '}', '=>'].includes(label))) return null;\n if (['(', '[', '{'].includes(label)) stack.push(label);\n if ([')', ']', '}'].includes(label)) {\n if (!stack.length) return null;\n stack.pop();\n }\n tokens.push(token);\n }\n } catch {\n return null;\n }\n}\n\nfunction moveNodes(node, delta, locate) {\n if (!node || typeof node !== 'object') return;\n if (typeof node.start === 'number') {\n node.start += delta;\n node.end += delta;\n node.loc = { start: locate(node.start), end: locate(node.end) };\n }\n for (const [key, value] of Object.entries(node)) {\n if (key === 'loc') continue;\n if (Array.isArray(value)) value.forEach((item) => moveNodes(item, delta, locate));\n else if (value && typeof value === 'object') moveNodes(value, delta, locate);\n }\n}\n\nconst parsers = new Map();\nfunction parserFor(language) {\n if (parsers.has(language)) return parsers.get(language);\n const Base = bases[language];\n class TwillParser extends Base {\n skipHeader = null;\n closures = [];\n lineStarts = null;\n classSuperDepth = null;\n subscriptDepth = 0;\n derivedClassElement = false;\n implicitClosure = null;\n\n locate(offset) {\n if (!this.lineStarts) {\n this.lineStarts = [0];\n const breaks = /\\r\\n?|\\n|\\u2028|\\u2029/g;\n let match;\n while ((match = breaks.exec(this.input))) this.lineStarts.push(breaks.lastIndex);\n }\n let low = 0;\n let high = this.lineStarts.length;\n while (low + 1 < high) {\n const mid = (low + high) >>> 1;\n if (this.lineStarts[mid] <= offset) low = mid;\n else high = mid;\n }\n return { line: low + 1, column: offset - this.lineStarts[low] };\n }\n\n parseStatement(context, ...args) {\n if (this.isContextual('defer') && deferAt(this.input, this.end)) {\n // A newline leaves an ordinary identifier expression and separate JS\n // block. Calls, member access, assignments and labels are unchanged.\n const node = this.startNode();\n const async = this.canAwait;\n this.next();\n const enclosing = this.implicitClosure;\n const implicit =\n enclosing && this.currentVarScope() === this.scopeStack[enclosing.scopeIndex]\n ? enclosing\n : null;\n const previousScope = implicit?.scopeIndex;\n if (implicit) implicit.scopeIndex = this.scopeStack.length;\n let cleanup;\n try {\n // A defer body captures its enclosing callback's receiver, like a\n // named parameter. Ordinary nested functions remain separate scopes.\n cleanup = this.parseArrowExpression(this.startNode(), [], async, false);\n } finally {\n if (implicit) implicit.scopeIndex = previousScope;\n }\n node.awaited = awaits(cleanup.body);\n cleanup.async = node.awaited;\n node.cleanup = cleanup;\n return this.finishNode(node, 'DeferStatement');\n }\n if (!this.isContextual('guard') || !guardAt(this.input, this.end, !!this.implicitClosure))\n return super.parseStatement(context, ...args);\n const node = this.startNode();\n node.singleStatement = !!context;\n this.next();\n node.binding = null;\n if (this.type === tt._const) {\n if (context)\n this.raise(node.start, 'A guard binding requires a block; add braces around this body.');\n const declaration = this.startNode();\n this.next();\n this.parseVar(declaration, false, 'const');\n node.binding = this.finishNode(declaration, 'VariableDeclaration');\n if (node.binding.declarations.length !== 1)\n this.raise(node.start, 'guard const requires one binding declaration.');\n } else node.test = this.parseExpression();\n node.elseStart = this.start;\n this.expect(tt._else);\n if (this.type !== tt.braceL) this.unexpected();\n node.failure = this.parseBlock();\n if (!exits(node.failure))\n this.raise(\n node.failure.start,\n 'Every guard else path must exit with return, throw, break or continue.',\n );\n return this.finishNode(node, 'GuardStatement');\n }\n\n tsParseTypeParameter(...args) {\n const start = this.start;\n const loc = this.startLoc;\n const constant = this.type === tt._const;\n if (constant) this.next();\n const parameter = super.tsParseTypeParameter(...args);\n if (constant) {\n parameter.const = true;\n parameter.start = start;\n parameter.loc.start = loc;\n }\n return parameter;\n }\n\n parseExprSubscripts(...args) {\n this.subscriptDepth++;\n try {\n return super.parseExprSubscripts(...args);\n } finally {\n this.subscriptDepth--;\n }\n }\n\n parseClassSuper(...args) {\n const previous = this.classSuperDepth;\n this.classSuperDepth = this.subscriptDepth;\n try {\n return super.parseClassSuper(...args);\n } finally {\n this.classSuperDepth = previous;\n }\n }\n\n parseClassElement(...args) {\n const previous = this.derivedClassElement;\n this.derivedClassElement = !!args[0];\n try {\n return super.parseClassElement(...args);\n } finally {\n this.derivedClassElement = previous;\n }\n }\n\n raise(position, message, ...args) {\n // acorn-typescript 1.4.13 inverts the subclass check for `override`.\n // Permit this valid syntax; TypeScript still checks override semantics.\n if (\n language.startsWith('ts') &&\n this.derivedClassElement &&\n typeof message === 'string' &&\n message.includes(\"cannot have an 'override' modifier\")\n )\n return;\n return super.raise(position, message, ...args);\n }\n\n readToken(code) {\n // acorn-typescript enables JSX by default. Plain .twill follows TypeScript's\n // non-JSX grammar, including angle-bracket assertions.\n if (language === 'ts' && code === 60 && !this.inType && this.exprAllowed)\n return this.readToken_lt_gt(code);\n return super.readToken(code);\n }\n\n parseExprAtom(...args) {\n if (this.type === tt.dot) {\n const closure = this.implicitClosure;\n if (!closure || this.currentVarScope() !== this.scopeStack[closure.scopeIndex])\n this.raise(\n this.start,\n 'Implicit member access requires a trailing closure without a parameter header.',\n );\n // A zero-width receiver lets Acorn parse the original dot/property chain.\n // The compiler supplies one hygienic parameter; property tokens stay mapped.\n const node = this.startNode();\n node.name = '__twillImplicit';\n closure.members.push(node);\n return this.finishNodeAt(node, 'Identifier', this.start, this.startLoc);\n }\n if (this.type === tt._switch) return this.parseSwitchExpression();\n if (language === 'ts' && this.type === tt.relational && this.value === '<') {\n const node = this.startNode();\n this.tsInType(() => {\n this.next();\n node.typeAnnotation = this.tsParseType();\n if (!this.tsMatchRightRelational()) this.unexpected();\n this.next();\n });\n node.expression = this.parseMaybeUnary(null, false, false, args[1]);\n // Let the TS plugin backtrack and recognize a generic arrow function.\n if (node.expression.type === 'ArrowFunctionExpression') this.unexpected(node.start);\n return this.finishNode(node, 'TSTypeAssertion');\n }\n return super.parseExprAtom(...args);\n }\n\n parseSwitchExpression() {\n const node = this.startNode();\n this.next();\n node.parenStart = this.start;\n node.discriminant = this.parseParenExpression();\n node.parenEnd = this.lastTokStart;\n this.expect(tt.braceL);\n node.cases = [];\n let mode,\n discriminator,\n sawDefault = false;\n while (this.type !== tt.braceR) {\n const branch = this.startNode();\n const isCase = this.type === tt._case;\n if (!isCase && this.type !== tt._default) this.unexpected();\n this.next();\n this.enterScope(0); // Each expression arm has its own lexical bindings.\n if (!isCase) {\n if (sawDefault) this.raise(branch.start, 'Multiple default clauses.');\n sawDefault = true;\n branch.test = null;\n } else if (this.type === tt.braceL) {\n if (mode === 'value')\n this.raise(branch.start, 'Cannot mix object patterns and value cases.');\n mode = 'pattern';\n const errors = {\n shorthandAssign: -1,\n trailingComma: -1,\n parenthesizedAssign: -1,\n parenthesizedBind: -1,\n doubleProto: -1,\n };\n const pattern = this.parseObj(false, errors);\n const tags = pattern.properties.filter(\n (property) =>\n property.type === 'Property' &&\n !property.computed &&\n !property.method &&\n property.kind === 'init' &&\n ((property.value.type === 'Literal' && !property.value.regex) ||\n (property.value.type === 'UnaryExpression' &&\n ['+', '-'].includes(property.value.operator) &&\n property.value.argument.type === 'Literal' &&\n typeof property.value.argument.value === 'number')),\n );\n if (tags.length !== 1)\n this.raise(\n pattern.start,\n 'An object case needs exactly one literal discriminator; other properties bind values.',\n );\n const tag = tags[0];\n const key = String(tag.key.name ?? tag.key.value);\n if (discriminator !== undefined && key !== discriminator)\n this.raise(tag.start, 'Object cases must use the same discriminator property.');\n discriminator = key;\n pattern.properties = pattern.properties.filter((property) => property !== tag);\n this.toAssignable(pattern, true, errors);\n this.checkLValPattern(pattern, 2, false);\n pattern.properties.push(tag);\n pattern.properties.sort((a, b) => a.start - b.start);\n branch.pattern = pattern;\n branch.tag = tag;\n } else {\n if (mode === 'pattern')\n this.raise(branch.start, 'Cannot mix object patterns and value cases.');\n mode = 'value';\n branch.test = this.parseExpression();\n }\n branch.colonStart = this.start;\n this.expect(tt.colon);\n if (this.type === tt._throw) {\n const thrown = this.parseThrowStatement(this.startNode());\n branch.value = thrown.argument;\n branch.throw = true;\n branch.valueEnd = thrown.end;\n } else {\n branch.value = this.parseMaybeAssign();\n branch.valueEnd = this.lastTokEnd;\n this.semicolon();\n }\n this.exitScope();\n node.cases.push(this.finishNode(branch, 'TwillSwitchCase'));\n }\n this.next();\n if (!node.cases.length)\n this.raise(node.start, 'A switch expression requires at least one arm.');\n node.discriminator = discriminator;\n return this.finishNode(node, 'TwillSwitchExpression');\n }\n\n next(...args) {\n super.next(...args);\n if (this.skipHeader !== null) {\n const end = this.skipHeader;\n this.skipHeader = null;\n while (this.start < end && this.type !== tt.eof) super.next(...args);\n }\n }\n\n parseTrailingClosure(callee, label) {\n const start = this.start;\n const header = headerAt(this.input, this.end);\n let params = [];\n let async = false;\n let parameterText = '()';\n if (header) {\n let text = header.text.trim();\n async = header.async;\n if (async) text = text.replace(/^async\\s+/, '');\n parameterText = text.startsWith('(') ? text : `(${text})`;\n const prefix = async ? 'async ' : '';\n try {\n const arrow = Base.parse(`${prefix}${parameterText} => {}`, {\n ...options,\n sourceType: this.options.sourceType,\n }).body[0].expression;\n params = arrow.params;\n const sourceStart = header.textStart + header.text.indexOf(text);\n const addedParen = text.startsWith('(') ? 0 : 1;\n params.forEach((param) =>\n moveNodes(param, sourceStart - prefix.length - addedParen, (offset) =>\n this.locate(offset),\n ),\n );\n } catch (error) {\n this.raise(start, `Invalid trailing closure parameters: ${error.message}`);\n }\n }\n const node = this.startNode();\n // parseArrowExpression supplies the real function scope, including return,\n // await, lexical this/super, duplicate bindings and strict-mode checks.\n this.skipHeader = header?.end ?? null;\n const previous = this.implicitClosure;\n const implicit = header ? null : { scopeIndex: this.scopeStack.length, members: [] };\n this.implicitClosure = implicit;\n let arrow;\n try {\n arrow = this.parseArrowExpression(node, params, async, false);\n } finally {\n this.implicitClosure = previous;\n }\n this.closures.push({\n node: arrow,\n callee,\n label,\n header,\n parameterText,\n async,\n implicitMembers: implicit?.members ?? [],\n });\n return arrow;\n }\n\n parseSubscript(base, startPos, startLoc, noCalls, maybeAsyncArrow, optionalChained, forInit) {\n // The TS parser treats a same-line brace after type arguments as an\n // expression operand. In this dialect it can instead begin the callback.\n const classBody =\n this.classSuperDepth !== null && this.subscriptDepth === this.classSuperDepth + 1;\n if (!noCalls && !classBody && this.tsMatchLeftRelational?.() && this.start === base.end) {\n const parameters = this.tsTryParseAndCatch(() => {\n const parsed = this.tsParseTypeArgumentsInExpression();\n return parsed &&\n this.type === tt.braceL &&\n !/[\\r\\n\\u2028\\u2029]/.test(this.input.slice(parsed.end, this.start))\n ? parsed\n : undefined;\n });\n if (parameters) {\n const instantiation = this.startNodeAt(startPos, startLoc);\n instantiation.expression = base;\n instantiation.typeParameters = parameters;\n base = this.finishNode(instantiation, 'TSInstantiationExpression');\n }\n }\n const supported = [\n 'CallExpression',\n 'Identifier',\n 'MemberExpression',\n 'TSInstantiationExpression',\n ].includes(base.type);\n // Only the outer heritage expression owns the class body brace. Nested\n // calls, parenthesized expressions and computed lookups allow callbacks.\n if (!noCalls && supported && this.type === tt.braceL && !classBody) {\n if (base.trailing)\n this.raise(\n this.start,\n 'Additional trailing closures require labels (for example completion: { ... }).',\n );\n // Bare names on a new line remain ordinary JavaScript statements.\n if (base.type !== 'CallExpression' && /[\\r\\n]/.test(this.input.slice(base.end, this.start)))\n return base;\n const hadParens = base.type === 'CallExpression' && base.end === this.lastTokEnd;\n const callee = hadParens\n ? base.callee\n : base.type === 'TSInstantiationExpression'\n ? base.expression\n : base;\n const node = this.startNodeAt(startPos, startLoc);\n node.callee = callee;\n node.arguments = hadParens ? [...base.arguments] : [];\n node.optional = base.optional ?? false;\n if ((hadParens || base.type === 'TSInstantiationExpression') && base.typeParameters)\n node.typeParameters = base.typeParameters;\n const callEnd = this.lastTokEnd;\n const args = [this.parseTrailingClosure(callee, null)];\n while (this.type === tt.name) {\n const tail = this.input.slice(this.end);\n // Only recognize a label when a colon and opening brace follow it.\n const lexer = Parser.tokenizer(tail, options);\n const colon = lexer.getToken();\n if (colon.type !== tt.colon || lexer.getToken().type !== tt.braceL) break;\n const label = { name: this.value, start: this.start, end: this.end };\n this.next();\n this.expect(tt.colon);\n args.push(this.parseTrailingClosure(callee, label));\n }\n node.arguments.push(...args);\n node.trailing = {\n callEnd,\n hadParens,\n originalArgs: hadParens ? base.arguments : [],\n closures: args,\n };\n return this.finishNode(node, 'CallExpression');\n }\n return super.parseSubscript(\n base,\n startPos,\n startLoc,\n noCalls,\n maybeAsyncArrow,\n optionalChained,\n forInit,\n );\n }\n }\n parsers.set(language, TwillParser);\n return TwillParser;\n}\n\nexport function parse(source, language = 'ts', sourceType = 'module') {\n const TwillParser = parserFor(language);\n const comments = [];\n const parser = new TwillParser(\n { ...options, sourceType, allowHashBang: true, onComment: comments },\n source,\n );\n const ast = parser.parse();\n const live = new Set();\n const calls = [];\n const guards = [];\n const defers = [];\n const switches = [];\n const visit = (node) => {\n if (!node || typeof node !== 'object') return;\n if (\n node.type === 'ArrowFunctionExpression' ||\n (node.type === 'Identifier' && node.start === node.end && node.name === '__twillImplicit')\n )\n live.add(node);\n if (node.trailing) calls.push(node);\n if (node.type === 'GuardStatement') guards.push(node);\n if (node.type === 'DeferStatement') defers.push(node);\n if (node.type === 'TwillSwitchExpression') switches.push(node);\n for (const [key, value] of Object.entries(node)) {\n if (key === 'trailing' || key === 'loc') continue;\n if (Array.isArray(value)) value.forEach(visit);\n else if (value?.type) visit(value);\n }\n };\n visit(ast);\n return {\n ast,\n calls,\n guards,\n defers,\n switches,\n comments,\n closures: parser.closures\n .filter((closure) => live.has(closure.node))\n .map((closure) => ({\n ...closure,\n // TS backtracking can discard tentative expression parses. Only receivers\n // reachable in the final tree may add a parameter or source insertion.\n implicitMembers: closure.implicitMembers\n .filter((node) => live.has(node))\n .map((node) => node.start),\n })),\n };\n}\n","import MagicString from 'magic-string';\nimport type { Language } from './compiler.js';\n\ntype Node = { type: string; start: number; end: number; [key: string]: any };\ntype Comment = { start: number; end: number; value: string; type: string };\ntype Scope = { block: Node; functionBody: boolean; defers: Node[] };\nconst functions = new Set(['FunctionDeclaration', 'FunctionExpression', 'ArrowFunctionExpression']);\n\nfunction children(node: Node, visit: (child: Node) => void) {\n for (const [key, value] of Object.entries(node)) {\n if (key === 'loc' || key === 'trailing') continue;\n if (Array.isArray(value))\n value.forEach((child) => {\n if (child?.type) visit(child);\n });\n else if (value?.type) visit(value);\n }\n}\n\n/** Scope-local cleanup callbacks; dynamic registrations use lazy stacks. */\nexport function lowerDefers(\n source: string,\n ast: Node,\n code: MagicString,\n language: Language,\n usedNames: Set<string>,\n contentStarts: Map<Node, number>,\n comments: Comment[],\n fail: (node: Node, message: string) => never,\n) {\n const scopes: Scope[] = [];\n const visit = (node: Node, scope: Scope | undefined, parent?: Node) => {\n if (functions.has(node.type) || ['Program', 'TSModuleBlock', 'SwitchCase'].includes(node.type))\n scope = undefined;\n if (node.type === 'BlockStatement' || node.type === 'StaticBlock') {\n scope = {\n block: node,\n functionBody: !!parent && functions.has(parent.type) && parent.body === node,\n defers: [],\n };\n scopes.push(scope);\n }\n if (node.type === 'DeferStatement') {\n if (!scope)\n fail(\n node,\n 'defer requires an explicit block or function body; wrap a switch case in braces.',\n );\n scope.defers.push(node);\n const check = (item: Node) => {\n if (functions.has(item.type)) return;\n if (item.type === 'ReturnStatement')\n fail(\n item,\n 'A defer cleanup cannot return; use a nested function for local early returns.',\n );\n children(item, check);\n };\n check(node.cleanup.body);\n }\n children(node, (child) => visit(child, scope, node));\n };\n visit(ast, undefined);\n let counter = 0;\n const fresh = (part: string) => {\n let name: string;\n do name = `__twill${part}${counter++}`;\n while (usedNames.has(name));\n usedNames.add(name);\n return name;\n };\n const sortedComments = [...comments].sort((a, b) => b.end - a.end);\n const leadingComment = (statement: Node, minimum: number) => {\n let start = statement.start;\n // Move adjacent JSDoc with hoisted function initializers, retaining checkJs\n // annotations. Comments emitted during TS backtracking may be duplicated.\n for (const comment of sortedComments) {\n if (comment.end > start || comment.start < minimum) continue;\n if (/\\S/.test(source.slice(comment.end, start))) break;\n if (comment.type === 'Block' && comment.value.startsWith('*')) start = comment.start;\n else break;\n }\n return start;\n };\n for (const scope of scopes) {\n if (!scope.defers.length) continue;\n const { block } = scope;\n const statements = block.body as Node[];\n // A direct statement executes at most once per block entry. Nested or\n // unbraced-loop registrations still require the dynamic stack.\n const single = scope.defers.length === 1 && statements.includes(scope.defers[0]!);\n const stack = fresh(single ? 'Cleanup' : 'Defers');\n const failure = single ? '' : fresh('Failure');\n const failed = single ? '' : fresh('Failed');\n const callback = single ? stack : fresh('Cleanup');\n const error = single ? '' : fresh('Error');\n const anyAsync = scope.defers.some((node) => node.awaited);\n const allAsync = scope.defers.every((node) => node.awaited);\n const mixed = anyAsync && !allAsync;\n const callbackType = mixed ? '{ run: () => unknown; async: boolean }' : '() => unknown';\n const storageType = single\n ? '(() => unknown) | undefined'\n : `Array<${callbackType}> | undefined`;\n const annotation = language.startsWith('ts') ? `: ${storageType}` : '';\n const jsdoc = language.startsWith('js') ? `\\n/** @type {${storageType}} */\\n` : '';\n let start = contentStarts.get(block) ?? block.start + 1;\n // StaticBlock.start includes the `static` token, unlike BlockStatement.\n if (block.type === 'StaticBlock') start = statements[0]!.start;\n let index = 0;\n while (statements[index]?.directive) start = statements[index++]!.end;\n const ordinary = statements.slice(index);\n const declarations = scope.functionBody\n ? ordinary.filter((node) => node.type === 'FunctionDeclaration')\n : [];\n if (scope.functionBody && ordinary.some((node) => node.type === 'TSDeclareFunction'))\n fail(\n ordinary.find((node) => node.type === 'TSDeclareFunction')!,\n 'Function overloads/ambient function declarations in a defer scope are not supported; move them to a separate scope.',\n );\n const names = [...new Set(declarations.map((node) => node.id.name as string))];\n code.appendLeft(\n start,\n `;${jsdoc}let ${stack}${annotation};${names.length ? `var ${names.join(',')};` : ''}try {\\n`,\n );\n // Function-body declarations bind like var, including parameter aliases.\n // Initializers stay in the try's lexical environment so they still capture\n // let/const declared anywhere in the original body. Preserve the name token\n // and parameter/body tokens rather than regenerating function source.\n let anchor = start;\n const initial = new Set<Node>();\n for (const statement of ordinary) {\n if (statement.type !== 'FunctionDeclaration') break;\n initial.add(statement);\n anchor = statement.end;\n }\n for (const declaration of declarations) {\n const commentStart = leadingComment(declaration, start);\n if (!initial.has(declaration)) code.move(commentStart, declaration.end, anchor);\n if (commentStart < declaration.start) code.prependLeft(commentStart, '\\n');\n code.move(declaration.start, declaration.id.start, declaration.id.end);\n code.appendLeft(declaration.id.end, ' = ');\n code.appendLeft(declaration.end, ';');\n }\n for (const node of scope.defers) {\n const arrow = `${node.awaited ? 'async ' : ''}() => `;\n const prefix = single\n ? `${stack} = ${arrow}`\n : `(${stack} ??= []).push(${mixed ? `{ async: ${node.awaited}, run: ` : ''}${arrow}`;\n code.overwrite(node.start, node.cleanup.body.start, prefix);\n code.appendLeft(node.end, single ? ';' : `${mixed ? '}' : ''});`);\n }\n if (single) {\n // Guard the await as well as the call: unreached async cleanup must not\n // add a microtask turn. Native finally preserves all completion kinds.\n const call = allAsync ? `if (${stack}) await ${stack}();` : `${stack}?.();`;\n code.prependLeft(block.end - 1, `\\n} finally { ${call} }\\n`);\n continue;\n }\n const call = mixed\n ? `if (${callback}.async) await ${callback}.run(); else ${callback}.run();`\n : `${allAsync ? 'await ' : ''}${callback}();`;\n // Nested-finally semantics: every registered cleanup runs, and the last\n // cleanup failure replaces an earlier cleanup/body failure (even undefined).\n code.prependLeft(\n block.end - 1,\n `} finally { let ${failed} = false, ${failure}; while (${stack}?.length) { const ${callback} = ${stack}.pop(); if (${callback}) { try { ${call} } catch (${error}) { ${failed} = true; ${failure} = ${error}; } } } if (${failed}) throw ${failure}; }`,\n );\n }\n}\n","import MagicString from 'magic-string';\nimport { Parser, tokTypes } from 'acorn';\nimport type { Language } from './compiler.js';\n\ntype Node = { type: string; start: number; end: number; [key: string]: any };\nfunction suspension(node: Node): Node | undefined {\n if (['AwaitExpression', 'YieldExpression'].includes(node.type)) return node;\n if (['FunctionDeclaration', 'FunctionExpression', 'ArrowFunctionExpression'].includes(node.type))\n return;\n for (const [key, value] of Object.entries(node)) {\n if (['loc', 'trailing', 'tag'].includes(key)) continue;\n for (const child of Array.isArray(value) ? value : [value]) {\n if (child?.type) {\n const found = suspension(child);\n if (found) return found;\n }\n }\n }\n}\n\n/** Native switches with per-arm scopes; expression contexts use a synchronous\n * lexical IIFE. Direct returns need no extra function or scheduling. */\nexport function lowerSwitchExpressions(\n source: string,\n ast: Node,\n switches: Node[],\n code: MagicString,\n language: Language,\n usedNames: Set<string>,\n fail: (node: Node, message: string) => never,\n) {\n const returns = new Set<Node>();\n const visit = (node: Node) => {\n if (node.type === 'ReturnStatement' && node.argument?.type === 'TwillSwitchExpression') {\n returns.add(node.argument);\n code.remove(node.start, node.start + 6);\n // Acorn omits grouping parentheses from expression node ranges.\n // Preserve comments while removing only the return's outer grouping.\n for (const [start, end] of [\n [node.start + 6, node.argument.start],\n [node.argument.end, node.end],\n ]) {\n const tokens = Parser.tokenizer(source.slice(start, end), { ecmaVersion: 'latest' });\n for (;;) {\n const token = tokens.getToken();\n if (token.type === tokTypes.eof) break;\n if (token.type === tokTypes.parenL || token.type === tokTypes.parenR)\n code.remove(start + token.start, start + token.end);\n }\n }\n }\n for (const [key, value] of Object.entries(node)) {\n if (['loc', 'trailing', 'tag'].includes(key)) continue;\n for (const child of Array.isArray(value) ? value : [value]) if (child?.type) visit(child);\n }\n };\n visit(ast);\n let counter = 0;\n const fresh = (part: string) => {\n let name: string;\n do name = `__twill${part}${counter++}`;\n while (usedNames.has(name));\n usedNames.add(name);\n return name;\n };\n for (const node of switches) {\n const direct = returns.has(node);\n const suspended = !direct && suspension(node);\n if (suspended)\n fail(\n suspended,\n 'await/yield inside a switch expression requires a direct return. Bind the subject first, or await the whole result explicitly.',\n );\n const subject = fresh('Subject');\n code.appendLeft(node.start, `${direct ? '{' : '(() => {'}const ${subject} = `);\n code.remove(node.parenStart, node.parenStart + 1);\n // Retain a real source-backed switch token for typed lint diagnostics.\n code.move(node.start, node.start + 6, node.parenEnd);\n code.appendLeft(node.parenEnd, '; ');\n code.overwrite(\n node.parenEnd,\n node.parenEnd + 1,\n ` (${subject}${node.discriminator === undefined ? '' : `[${JSON.stringify(node.discriminator)}]`})`,\n );\n for (const branch of node.cases) {\n if (branch.pattern) {\n const { pattern, tag } = branch;\n // A discarded discriminator binding preserves native rest exclusion.\n // Its key remains source-backed; the literal moves to the case label.\n code.appendLeft(tag.value.start, fresh('Tag'));\n code.move(tag.value.start, tag.value.end, pattern.start);\n code.appendLeft(tag.value.end, ': { const ');\n code.overwrite(\n branch.colonStart,\n branch.colonStart + 1,\n ` = ${subject}; ${branch.throw ? '' : 'return '}`,\n );\n code.appendLeft(branch.valueEnd, '; }');\n if (source[branch.end - 1] === ';') code.remove(branch.end - 1, branch.end);\n } else if (!branch.throw) code.appendLeft(branch.colonStart + 1, ' return ');\n }\n const hasDefault = node.cases.some((branch: Node) => !branch.pattern && branch.test === null);\n const check = !hasDefault && language.startsWith('ts') ? ` ${subject} satisfies never;` : '';\n // Transpile-only JS hosts cannot prove unions. Unexpected values fail\n // visibly rather than returning an accidental undefined.\n const failure = hasDefault\n ? ''\n : `${check} throw new TypeError('Non-exhaustive switch expression');`;\n code.overwrite(node.end - 1, node.end, `}${failure}${direct ? '}' : '})()'}`);\n }\n}\n","import MagicString from 'magic-string';\nimport { Parser, tokTypes } from 'acorn';\nimport { parse } from './parser.js';\nimport { lowerDefers } from './defer.js';\nimport { lowerSwitchExpressions } from './branches.js';\nimport {\n originalPositionFor,\n generatedPositionFor,\n TraceMap,\n GREATEST_LOWER_BOUND,\n} from '@jridgewell/trace-mapping';\n\nexport type Language = 'js' | 'jsx' | 'ts' | 'tsx';\nexport interface TransformOptions {\n filename?: string;\n language?: Language;\n sourceType?: 'module' | 'script';\n /** Standard JSX runtime source; normally inherited from tsconfig.json. */\n jsxImportSource?: string;\n /** Swift's single-expression implicit return. Defaults to true. */\n implicitReturn?: boolean;\n}\nexport const extensions = ['.twill', '.twillx'] as const;\nexport function isTwillFile(id: string): boolean {\n return extensions.some((extension) => id.split(/[?#]/, 1)[0]!.endsWith(extension));\n}\nexport function inferLanguage(filename: string): Language {\n if (/\\.(?:twillx|tsx)$/.test(filename)) return 'tsx';\n if (/\\.jsx$/.test(filename)) return 'jsx';\n if (/\\.(?:js|mjs|cjs)$/.test(filename)) return 'js';\n return 'ts';\n}\n\nexport class TwillSyntaxError extends SyntaxError {\n readonly filename: string;\n readonly line: number;\n readonly column: number;\n readonly offset: number;\n readonly frame: string;\n constructor(\n source: string,\n filename: string,\n error: { message: string; pos?: number; loc?: { line: number; column: number } },\n ) {\n const line = error.loc?.line ?? 1;\n const column = error.loc?.column ?? 0;\n super(`${filename}:${line}:${column + 1}: ${error.message.replace(/\\s*\\(\\d+:\\d+\\)$/, '')}`);\n this.name = 'TwillSyntaxError';\n this.filename = filename;\n this.line = line;\n this.column = column;\n this.offset = error.pos ?? 0;\n this.frame = `${source.split(/\\r\\n|[\\r\\n\\u2028\\u2029]/)[line - 1] ?? ''}\\n${' '.repeat(column)}^`;\n }\n}\n\n// The parser boundary uses ESTree, including TS/JSX nodes from Acorn plugins.\ntype Node = { type: string; start: number; end: number; [key: string]: any };\ntype ClosureMetadata = {\n node: Node;\n label: { start: number; end: number } | null;\n header: { end: number; inStart: number; asyncEnd: number | null; parenthesized: boolean } | null;\n async: boolean;\n implicitMembers: number[];\n};\nfunction walk(node: Node, visit: (node: Node) => void): void {\n visit(node);\n for (const [key, value] of Object.entries(node)) {\n if (['loc', 'trailing'].includes(key)) continue;\n if (Array.isArray(value))\n value.forEach((child) => {\n if (child?.type) walk(child, visit);\n });\n else if (value?.type) walk(value, visit);\n }\n}\nfunction calleeName(node: Node): string | undefined {\n if (node.type === 'Identifier') return node.start === node.end ? undefined : node.name;\n if (node.type === 'MemberExpression' && !node.computed) {\n const object = calleeName(node.object);\n if (object) return `${object}.${node.property.name}`;\n }\n}\n\nexport function transform(source: string, options: TransformOptions = {}) {\n const filename = options.filename ?? 'input.twill';\n let parsed: {\n ast: Node;\n calls: Node[];\n guards: Node[];\n defers: Node[];\n switches: Node[];\n comments: { start: number; end: number; value: string; type: string }[];\n closures: ClosureMetadata[];\n };\n try {\n parsed = parse(\n source,\n options.language ?? inferLanguage(filename),\n options.sourceType ?? 'module',\n );\n } catch (error) {\n throw new TwillSyntaxError(\n source,\n filename,\n error as ConstructorParameters<typeof TwillSyntaxError>[2],\n );\n }\n const code = new MagicString(source);\n const usedNames = new Set<string>();\n const patternGuards = parsed.guards.filter(\n (guard) => guard.binding && guard.binding.declarations[0].id.type !== 'Identifier',\n );\n if (\n patternGuards.length ||\n parsed.switches.length ||\n parsed.defers.length ||\n parsed.closures.some((closure) => closure.implicitMembers.length) ||\n /\\.twillx$/.test(filename.split(/[?#]/, 1)[0]!)\n )\n walk(parsed.ast, (node) => {\n if (node.type === 'Identifier') usedNames.add(node.name);\n });\n let guardCounter = 0;\n for (const guard of parsed.guards) {\n // A guard is one source statement. Without these braces an outer `else`\n // would bind to the lowered inner if (JavaScript's dangling-else rule).\n if (guard.singleStatement) {\n code.prependLeft(guard.start, '{');\n code.appendLeft(guard.end, '}');\n }\n if (guard.binding) {\n const binding = guard.binding.declarations[0].id;\n // Nullish checks preserve false, 0 and empty strings. The original\n // initializer runs once and the binding stays in the surrounding scope.\n if (binding.type === 'Identifier') code.remove(guard.start, guard.start + 'guard'.length);\n else {\n let temporary: string;\n do temporary = `__twillGuard${guardCounter++}`;\n while (usedNames.has(temporary));\n usedNames.add(temporary);\n // Move native pattern tokens intact, preserving editor definitions and\n // initializer TDZ/shadowing. A type annotation belongs to the temporary.\n const patternEnd = binding.typeAnnotation?.start ?? binding.end;\n code.overwrite(guard.start, binding.start, `const ${temporary}`);\n code.move(binding.start, patternEnd, guard.end);\n code.prependRight(binding.start, '; const ');\n code.appendLeft(patternEnd, ` = ${temporary};`);\n code.overwrite(guard.elseStart, guard.elseStart + 4, `; if (${temporary} == null)`);\n continue;\n }\n code.overwrite(\n guard.elseStart,\n guard.elseStart + 'else'.length,\n `; if (${binding.name} == null)`,\n );\n } else {\n code.overwrite(guard.start, guard.start + 'guard'.length, 'if (!(');\n code.overwrite(guard.elseStart, guard.elseStart + 'else'.length, '))');\n }\n }\n const uiFile = /\\.twillx$/.test(filename.split(/[?#]/, 1)[0]!);\n const metadataByNode = new Map(parsed.closures.map((item) => [item.node, item]));\n const componentCalls = new Set(\n parsed.calls.filter((node) => {\n const name = calleeName(node.callee);\n // Like JSX tags, uppercase final names opt into component syntax in UI\n // files. Parenthesized callable expressions retain ordinary callback behavior.\n return (\n uiFile &&\n node.start === node.callee.start &&\n !!name &&\n /^[A-Z]/.test(name.split('.').at(-1)!)\n );\n }),\n );\n for (const call of componentCalls) {\n const implicit = call.trailing.closures.flatMap(\n (closure: Node) => metadataByNode.get(closure)!.implicitMembers,\n )[0];\n if (implicit !== undefined)\n throw new TwillSyntaxError(source, filename, {\n message:\n 'Implicit member access is for ordinary callbacks. Use explicit parameters for component render props or slots.',\n pos: implicit,\n loc: {\n line: source.slice(0, implicit).split(/\\r\\n|[\\r\\n\\u2028\\u2029]/).length,\n column: source\n .slice(0, implicit)\n .split(/\\r\\n|[\\r\\n\\u2028\\u2029]/)\n .at(-1)!.length,\n },\n });\n }\n let implicitCounter = 0;\n for (const metadata of parsed.closures) {\n if (!metadata.implicitMembers.length) continue;\n let name: string;\n do name = `__twillArg${implicitCounter++}`;\n while (usedNames.has(name));\n usedNames.add(name);\n code.overwrite(metadata.node.start, metadata.node.start + 1, `(${name}) => {`);\n for (const offset of metadata.implicitMembers) code.appendLeft(offset, name);\n }\n // TypeScript only reads file-level leading pragmas, and the last wins.\n const leadingComments = parsed.comments\n .filter((comment) => comment.start < (parsed.ast.body[0]?.start ?? source.length))\n .map((comment) => comment.value)\n .join('\\n');\n const pragma = [...leadingComments.matchAll(/@jsxImportSource\\s+(\\S+)/g)].at(-1)?.[1];\n const imports = parsed.ast.body\n .filter((node: Node) => node.type === 'ImportDeclaration')\n .map((node: Node) => node.source.value as string);\n const vueImport = imports.some((name: string) => name === 'vue' || name.startsWith('@vue/'));\n const reactImport = imports.some((name: string) => name === 'react' || name.startsWith('react/'));\n if (componentCalls.size && !pragma && !options.jsxImportSource && vueImport && reactImport)\n throw new TwillSyntaxError(source, filename, {\n message:\n 'Both React and Vue are imported. Select the standard JSX runtime with @jsxImportSource or tsconfig jsxImportSource.',\n pos: parsed.calls[0]!.start,\n loc: parsed.calls[0]!.loc.start,\n });\n const jsxImportSource = pragma ?? options.jsxImportSource ?? (vueImport ? 'vue' : 'react');\n const vue = jsxImportSource === 'vue';\n if (uiFile && !pragma && jsxImportSource !== 'react') {\n const start = source.startsWith('#!') ? source.indexOf('\\n') + 1 : 0;\n code.appendLeft(start, `/** @jsxImportSource ${jsxImportSource} */\\n`);\n }\n const attributeClosings: number[] = [];\n const componentProps: {\n start: number;\n end: number;\n properties: { name: string; start: number; end: number; shorthand: boolean }[];\n }[] = [];\n const stripPunctuation = (start: number, end: number, types: readonly unknown[]) => {\n const text = source.slice(start, end);\n const lexer = Parser.tokenizer(text, { ecmaVersion: 'latest' });\n const edits = new MagicString(text);\n for (let token = lexer.getToken(); token.type !== tokTypes.eof; token = lexer.getToken())\n if (types.includes(token.type)) edits.remove(token.start, token.end);\n return edits.toString();\n };\n let counter = 0;\n for (const node of parsed.calls) {\n const { callEnd, hadParens, originalArgs, closures } = node.trailing;\n const component = componentCalls.has(node);\n if (component) {\n if (\n originalArgs.length > 1 ||\n originalArgs[0]?.type === 'SpreadElement' ||\n node.optional ||\n node.callee.optional\n )\n throw new TwillSyntaxError(source, filename, {\n message:\n 'Component syntax accepts one props object and children; optional calls use ordinary callbacks.',\n pos: node.start,\n loc: node.loc.start,\n });\n if (closures.length > 1 && !vue)\n throw new TwillSyntaxError(source, filename, {\n message:\n 'React components accept one children closure. Supply render props in the props object.',\n pos: closures[1].start,\n loc: closures[1].loc.start,\n });\n if (vue) {\n const labels = new Set(['default']);\n for (const closure of closures.slice(1)) {\n const label = metadataByNode.get(closure)!.label!;\n const name = source.slice(label.start, label.end);\n if (labels.has(name))\n throw new TwillSyntaxError(source, filename, {\n message: `Duplicate Vue slot: ${name}`,\n pos: label.start,\n loc: closure.loc.start,\n });\n labels.add(name);\n }\n }\n const opening = vue ? '>{({default: ' : '>{(';\n const tagEnd = node.typeParameters?.end ?? node.callee.end;\n code.appendLeft(node.callee.start, '(<');\n const props = originalArgs[0] as Node | undefined;\n const directAttributes =\n !vue &&\n props?.type === 'ObjectExpression' &&\n props.properties.every(\n (property: Node) =>\n property.type === 'SpreadElement' ||\n (property.kind === 'init' &&\n !property.method &&\n !property.computed &&\n (property.key.name ?? property.key.value) !== '__proto__' &&\n /^[A-Za-z_$][\\w$.:-]*$/.test(String(property.key.name ?? property.key.value))),\n );\n if (directAttributes) {\n componentProps.push({\n start: props!.start,\n end: props!.end,\n properties: props!.properties\n .filter((property: Node) => property.type !== 'SpreadElement')\n .map((property: Node) => ({\n name: String(property.key.name ?? property.key.value),\n start: property.key.start,\n end: property.key.end,\n shorthand: Boolean(property.shorthand),\n })),\n });\n // Literal props become native JSX attributes. This retains contextual\n // callback types and passes keys explicitly, as React's runtime expects.\n code.overwrite(\n tagEnd,\n props!.start + 1,\n ' ' + stripPunctuation(tagEnd, props!.start, [tokTypes.parenL]),\n );\n let previous = props!.start + 1;\n for (const property of props!.properties as Node[]) {\n if (previous < property.start)\n code.overwrite(\n previous,\n property.start,\n stripPunctuation(previous, property.start, [tokTypes.comma]) + ' ',\n );\n if (property.type === 'SpreadElement') code.prependLeft(property.start, '{');\n else {\n const name = String(property.key.name ?? property.key.value);\n if (property.shorthand) code.prependLeft(property.start, `${name}={`);\n else {\n code.overwrite(property.key.start, property.key.end, name);\n const start = property.key.end;\n const colon = Parser.tokenizer(source.slice(start, property.value.start), {\n ecmaVersion: 'latest',\n }).getToken();\n code.overwrite(start + colon.start, start + colon.end, '={');\n }\n }\n attributeClosings.push(property.end);\n previous = property.end;\n }\n const end = props!.end - 1;\n code.overwrite(\n previous,\n callEnd,\n stripPunctuation(previous, end, [tokTypes.comma]) +\n stripPunctuation(props!.end, callEnd, [tokTypes.parenR, tokTypes.comma]) +\n opening,\n );\n } else if (originalArgs.length) {\n const head = source.slice(tagEnd, originalArgs[0].start);\n const paren = Parser.tokenizer(head, { ecmaVersion: 'latest' }).getToken();\n code.overwrite(\n tagEnd,\n originalArgs[0].start,\n ' {...(' + head.slice(0, paren.start) + head.slice(paren.end),\n );\n const tailStart = originalArgs[0].end;\n const tail = Parser.tokenizer(source.slice(tailStart, callEnd - 1), {\n ecmaVersion: 'latest',\n });\n // Parenthesized props may contain closing parentheses before the comma.\n for (let token = tail.getToken(); token.type !== tokTypes.eof; token = tail.getToken())\n if (token.type === tokTypes.comma)\n code.remove(tailStart + token.start, tailStart + token.end);\n code.overwrite(callEnd - 1, callEnd, ')}' + opening);\n } else if (hadParens) {\n const gap = source.slice(tagEnd, callEnd);\n const tokens = Parser.tokenizer(gap, { ecmaVersion: 'latest' });\n const first = tokens.getToken();\n const last = tokens.getToken();\n code.overwrite(tagEnd, callEnd, opening + gap.slice(first.end, last.start));\n } else code.appendLeft(callEnd, opening);\n } else if (hadParens) {\n // Keep comments and trailing commas intact. The closing parenthesis is\n // moved after the closure; remove any comma immediately before it.\n const tailStart = originalArgs.at(-1)?.end ?? callEnd - 1;\n const tail = source.slice(tailStart, callEnd - 1);\n const token = Parser.tokenizer(tail, { ecmaVersion: 'latest' }).getToken();\n if (token.type === tokTypes.comma)\n code.remove(tailStart + token.start, tailStart + token.end);\n code.overwrite(callEnd - 1, callEnd, originalArgs.length ? ',' : '');\n } else code.appendLeft(callEnd, '(');\n let directChild = false;\n for (const closure of closures) {\n const metadata = metadataByNode.get(closure)!;\n const body = closure.body.body as Node[];\n const content = component && (vue || !metadata.header);\n const expressions = body.filter((statement) => statement.type === 'ExpressionStatement');\n const singleContent =\n content &&\n expressions.length === 1 &&\n body.every((statement) =>\n [\n 'ExpressionStatement',\n 'VariableDeclaration',\n 'FunctionDeclaration',\n 'ClassDeclaration',\n 'DeferStatement',\n 'EmptyStatement',\n ].includes(statement.type),\n ) &&\n body.filter((statement) => statement.type !== 'EmptyStatement').at(-1) === expressions[0];\n if (singleContent && body.length === 1 && !vue) {\n // A single JSX child is a value, not an array or an eagerly invoked\n // callback. This also supports libraries requiring ReactElement children.\n directChild = true;\n code.remove(closure.start, closure.start + 1);\n code.remove(closure.end - 1, closure.end);\n const statement = expressions[0]!;\n if (source[statement.end - 1] === ';') code.remove(statement.end - 1, statement.end);\n continue;\n }\n if (metadata.label) {\n const label = source\n .slice(metadata.label.start, metadata.label.end)\n .replace(/\\s*:\\s*$/, '');\n code.overwrite(\n metadata.label.start,\n closure.start,\n component && vue ? `, [${JSON.stringify(label)}]: ` : ', ',\n );\n }\n if (metadata.header) {\n const header = metadata.header;\n // Preserve parameter tokens in place so types, hover and diagnostics map\n // to their original locations instead of a regenerated header string.\n code.overwrite(\n closure.start,\n closure.start + 1,\n header.parenthesized || metadata.async ? '' : '(',\n );\n if (metadata.async && !header.parenthesized) code.appendLeft(header.asyncEnd!, ' (');\n code.overwrite(header.inStart, header.end, `${header.parenthesized ? '' : ') '}=> {`);\n } else if (!metadata.implicitMembers.length)\n code.overwrite(closure.start, closure.start + 1, '() => {');\n if (content && !singleContent) {\n let collector: string;\n do collector = `__twillChildren${counter++}`;\n while (usedNames.has(collector));\n const bodyStart = metadata.header?.end ?? closure.start + 1;\n const collect = (statement: Node): void => {\n switch (statement.type) {\n case 'ExpressionStatement':\n code.prependLeft(statement.start, `${collector}.push(`);\n code.appendLeft(\n source[statement.end - 1] === ';' ? statement.end - 1 : statement.end,\n ')',\n );\n break;\n case 'BlockStatement':\n statement.body.forEach(collect);\n break;\n case 'IfStatement':\n collect(statement.consequent);\n if (statement.alternate) collect(statement.alternate);\n break;\n case 'GuardStatement':\n collect(statement.failure);\n break;\n case 'ForStatement':\n case 'ForOfStatement':\n case 'ForInStatement':\n case 'WhileStatement':\n case 'DoWhileStatement':\n collect(statement.body);\n break;\n case 'SwitchStatement':\n statement.cases.forEach((branch: Node) => branch.consequent.forEach(collect));\n break;\n case 'TryStatement':\n collect(statement.block);\n if (statement.handler) collect(statement.handler.body);\n if (statement.finalizer) collect(statement.finalizer);\n break;\n case 'LabeledStatement':\n collect(statement.body);\n break;\n case 'ReturnStatement':\n throw new TwillSyntaxError(source, filename, {\n message:\n 'Component children collect expressions; use expressions instead of return.',\n pos: statement.start,\n loc: statement.loc.start,\n });\n // Declarations, break/continue, throw, functions and classes keep\n // their normal semantics. Never collect inside a nested function.\n }\n };\n body.forEach(collect);\n // Prefix after collecting so a compact first expression cannot place\n // its push wrapper before the collector declaration at the same offset.\n code.prependLeft(bodyStart, `const ${collector} = [];`);\n code.prependLeft(\n closure.end - 1,\n vue\n ? `;return ${collector};`\n : `;return ${collector}.length === 1 ? ${collector}[0] : ${collector};`,\n );\n } else if (\n singleContent ||\n (options.implicitReturn !== false &&\n body.length === 1 &&\n body[0]!.type === 'ExpressionStatement')\n ) {\n // Parentheses prevent object literals / comma expressions from changing meaning.\n const statement = singleContent ? expressions[0]! : body[0]!;\n code.prependLeft(statement.start, 'return (');\n code.appendLeft(source[statement.end - 1] === ';' ? statement.end - 1 : statement.end, ')');\n }\n }\n if (component)\n code.prependLeft(\n closures.at(-1).end,\n (vue ? '})}' : directChild || metadataByNode.get(closures[0])!.header ? ')}' : ')()}') +\n `</${calleeName(node.callee)}>)`,\n );\n else code.appendLeft(closures.at(-1).end, ')');\n // The parser may visit nested trailing calls after this one. Edits use\n // original offsets throughout, so nested scopes compose without reparsing.\n }\n if (parsed.switches.length)\n lowerSwitchExpressions(\n source,\n parsed.ast,\n parsed.switches,\n code,\n options.language ?? inferLanguage(filename),\n usedNames,\n (node, message) => {\n throw new TwillSyntaxError(source, filename, {\n message,\n pos: node.start,\n loc: node.loc.start,\n });\n },\n );\n // Apply outer attribute braces after nested call suffixes at the same offset.\n for (const end of attributeClosings) code.appendLeft(end, '}');\n if (parsed.defers.length) {\n const starts = new Map<Node, number>();\n for (const metadata of parsed.closures)\n if (metadata.header) starts.set(metadata.node.body, metadata.header.end);\n lowerDefers(\n source,\n parsed.ast,\n code,\n options.language ?? inferLanguage(filename),\n usedNames,\n starts,\n parsed.comments,\n (node, message) => {\n throw new TwillSyntaxError(source, filename, {\n message,\n pos: node.start,\n loc: node.loc.start,\n });\n },\n );\n }\n const map = code.generateMap({\n source: filename,\n file: filename.replace(/\\.twillx?$/, '.js'),\n includeContent: true,\n hires: true,\n });\n return {\n code: code.toString(),\n map,\n changed: code.hasChanged(),\n closures: parsed.closures.length,\n guards: parsed.guards.length,\n defers: parsed.defers.length,\n switches: parsed.switches.length,\n componentProps,\n };\n}\n\nexport type TransformResult = ReturnType<typeof transform>;\nconst traceMaps = new WeakMap<TransformResult, TraceMap>();\nfunction traceMap(result: TransformResult): TraceMap {\n let map = traceMaps.get(result);\n if (!map) {\n map = new TraceMap(result.map as any);\n traceMaps.set(result, map);\n }\n return map;\n}\nexport function originalPosition(result: TransformResult, line: number, column: number) {\n return originalPositionFor(traceMap(result), {\n line,\n column,\n bias: GREATEST_LOWER_BOUND,\n });\n}\nexport function generatedPosition(result: TransformResult, line: number, column: number) {\n return generatedPositionFor(traceMap(result), {\n source: result.map.sources[0]!,\n line,\n column,\n bias: GREATEST_LOWER_BOUND,\n });\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export type Language = 'js' | 'jsx' | 'ts' | 'tsx';
|
|
2
|
+
export interface TransformOptions {
|
|
3
|
+
filename?: string;
|
|
4
|
+
language?: Language;
|
|
5
|
+
sourceType?: 'module' | 'script';
|
|
6
|
+
/** Standard JSX runtime source; normally inherited from tsconfig.json. */
|
|
7
|
+
jsxImportSource?: string;
|
|
8
|
+
/** Swift's single-expression implicit return. Defaults to true. */
|
|
9
|
+
implicitReturn?: boolean;
|
|
10
|
+
}
|
|
11
|
+
export declare const extensions: readonly [".twill", ".twillx"];
|
|
12
|
+
export declare function isTwillFile(id: string): boolean;
|
|
13
|
+
export declare function inferLanguage(filename: string): Language;
|
|
14
|
+
export declare class TwillSyntaxError extends SyntaxError {
|
|
15
|
+
readonly filename: string;
|
|
16
|
+
readonly line: number;
|
|
17
|
+
readonly column: number;
|
|
18
|
+
readonly offset: number;
|
|
19
|
+
readonly frame: string;
|
|
20
|
+
constructor(source: string, filename: string, error: {
|
|
21
|
+
message: string;
|
|
22
|
+
pos?: number;
|
|
23
|
+
loc?: {
|
|
24
|
+
line: number;
|
|
25
|
+
column: number;
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
export declare function transform(source: string, options?: TransformOptions): {
|
|
30
|
+
code: string;
|
|
31
|
+
map: import('magic-string').SourceMap;
|
|
32
|
+
changed: boolean;
|
|
33
|
+
closures: number;
|
|
34
|
+
guards: number;
|
|
35
|
+
defers: number;
|
|
36
|
+
switches: number;
|
|
37
|
+
componentProps: {
|
|
38
|
+
start: number;
|
|
39
|
+
end: number;
|
|
40
|
+
properties: {
|
|
41
|
+
name: string;
|
|
42
|
+
start: number;
|
|
43
|
+
end: number;
|
|
44
|
+
shorthand: boolean;
|
|
45
|
+
}[];
|
|
46
|
+
}[];
|
|
47
|
+
};
|
|
48
|
+
export type TransformResult = ReturnType<typeof transform>;
|
|
49
|
+
export declare function originalPosition(result: TransformResult, line: number, column: number): import('@jridgewell/trace-mapping').OriginalMapping | import('@jridgewell/trace-mapping').InvalidOriginalMapping;
|
|
50
|
+
export declare function generatedPosition(result: TransformResult, line: number, column: number): import('@jridgewell/trace-mapping').GeneratedMapping | import('@jridgewell/trace-mapping').InvalidGeneratedMapping;
|
package/dist/config.d.ts
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { TransformOptions } from './compiler.js';
|
|
2
|
+
type Config = Pick<TransformOptions, 'implicitReturn' | 'jsxImportSource'>;
|
|
3
|
+
export declare function loadConfig(root?: string, configFile?: string): Config;
|
|
4
|
+
/** Config dependencies, including inherited tsconfigs and optional new files. */
|
|
5
|
+
export declare function configurationFiles(root: string): string[];
|
|
6
|
+
export {};
|
package/dist/config.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import ts from "typescript";
|
|
4
|
+
//#region src/config.ts
|
|
5
|
+
var jsxConfigs = /* @__PURE__ */ new Map();
|
|
6
|
+
/** Use the project's standard JSX setting, including extended tsconfigs. */
|
|
7
|
+
function jsxSource(root, configFile) {
|
|
8
|
+
const filename = configFile ?? ts.findConfigFile(root, ts.sys.fileExists);
|
|
9
|
+
if (!filename) return void 0;
|
|
10
|
+
const cached = jsxConfigs.get(filename);
|
|
11
|
+
if (cached && [...cached.files].every(([file, time]) => (existsSync(file) ? statSync(file).mtimeMs : -1) === time)) return cached.source;
|
|
12
|
+
const files = /* @__PURE__ */ new Map();
|
|
13
|
+
const source = ts.getParsedCommandLineOfConfigFile(filename, {}, {
|
|
14
|
+
...ts.sys,
|
|
15
|
+
readDirectory: () => [],
|
|
16
|
+
readFile(file) {
|
|
17
|
+
files.set(file, existsSync(file) ? statSync(file).mtimeMs : -1);
|
|
18
|
+
return ts.sys.readFile(file);
|
|
19
|
+
},
|
|
20
|
+
getCurrentDirectory: () => root,
|
|
21
|
+
onUnRecoverableConfigFileDiagnostic() {}
|
|
22
|
+
})?.options.jsxImportSource;
|
|
23
|
+
jsxConfigs.set(filename, {
|
|
24
|
+
files,
|
|
25
|
+
source
|
|
26
|
+
});
|
|
27
|
+
return source;
|
|
28
|
+
}
|
|
29
|
+
function loadConfig(root = process.cwd(), configFile) {
|
|
30
|
+
const filename = resolve(root, "twill.config.json");
|
|
31
|
+
const jsxImportSource = jsxSource(root, configFile);
|
|
32
|
+
if (!existsSync(filename)) return { jsxImportSource };
|
|
33
|
+
const value = JSON.parse(readFileSync(filename, "utf8"));
|
|
34
|
+
if (!value || typeof value !== "object" || Array.isArray(value)) throw new Error(`${filename}: expected an object`);
|
|
35
|
+
if (value.implicitReturn !== void 0 && typeof value.implicitReturn !== "boolean") throw new Error(`${filename}: implicitReturn must be a boolean`);
|
|
36
|
+
for (const key of Object.keys(value)) if (!["implicitReturn", "$schema"].includes(key)) throw new Error(`${filename}: unknown option ${key}`);
|
|
37
|
+
return {
|
|
38
|
+
implicitReturn: value.implicitReturn,
|
|
39
|
+
jsxImportSource
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
/** Config dependencies, including inherited tsconfigs and optional new files. */
|
|
43
|
+
function configurationFiles(root) {
|
|
44
|
+
jsxSource(root);
|
|
45
|
+
const tsconfig = ts.findConfigFile(root, ts.sys.fileExists);
|
|
46
|
+
return [...new Set([
|
|
47
|
+
resolve(root, "twill.config.json"),
|
|
48
|
+
resolve(root, "tsconfig.json"),
|
|
49
|
+
...tsconfig ? [...jsxConfigs.get(tsconfig)?.files.keys() ?? [tsconfig]] : []
|
|
50
|
+
].map((file) => resolve(file)))];
|
|
51
|
+
}
|
|
52
|
+
//#endregion
|
|
53
|
+
export { configurationFiles, loadConfig };
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","names":[],"sources":["../src/config.ts"],"sourcesContent":["import { existsSync, readFileSync, statSync } from 'node:fs';\nimport { resolve } from 'node:path';\nimport ts from 'typescript';\nimport type { TransformOptions } from './compiler.js';\n\ntype Config = Pick<TransformOptions, 'implicitReturn' | 'jsxImportSource'>;\nconst jsxConfigs = new Map<string, { files: Map<string, number>; source?: string }>();\n\n/** Use the project's standard JSX setting, including extended tsconfigs. */\nfunction jsxSource(root: string, configFile?: string): string | undefined {\n const filename = configFile ?? ts.findConfigFile(root, ts.sys.fileExists);\n if (!filename) return undefined;\n const cached = jsxConfigs.get(filename);\n if (\n cached &&\n [...cached.files].every(\n ([file, time]) => (existsSync(file) ? statSync(file).mtimeMs : -1) === time,\n )\n )\n return cached.source;\n const files = new Map<string, number>();\n const parsed = ts.getParsedCommandLineOfConfigFile(\n filename,\n {},\n {\n ...ts.sys,\n // Only read configuration, not the project's source tree.\n readDirectory: () => [],\n readFile(file) {\n files.set(file, existsSync(file) ? statSync(file).mtimeMs : -1);\n return ts.sys.readFile(file);\n },\n getCurrentDirectory: () => root,\n onUnRecoverableConfigFileDiagnostic() {},\n },\n );\n const source = parsed?.options.jsxImportSource;\n jsxConfigs.set(filename, { files, source });\n return source;\n}\n\nexport function loadConfig(root = process.cwd(), configFile?: string): Config {\n const filename = resolve(root, 'twill.config.json');\n const jsxImportSource = jsxSource(root, configFile);\n if (!existsSync(filename)) return { jsxImportSource };\n const value = JSON.parse(readFileSync(filename, 'utf8'));\n if (!value || typeof value !== 'object' || Array.isArray(value))\n throw new Error(`${filename}: expected an object`);\n if (value.implicitReturn !== undefined && typeof value.implicitReturn !== 'boolean')\n throw new Error(`${filename}: implicitReturn must be a boolean`);\n for (const key of Object.keys(value))\n if (!['implicitReturn', '$schema'].includes(key))\n throw new Error(`${filename}: unknown option ${key}`);\n return { implicitReturn: value.implicitReturn, jsxImportSource };\n}\n\n/** Config dependencies, including inherited tsconfigs and optional new files. */\nexport function configurationFiles(root: string): string[] {\n jsxSource(root);\n const tsconfig = ts.findConfigFile(root, ts.sys.fileExists);\n return [\n ...new Set(\n [\n resolve(root, 'twill.config.json'),\n resolve(root, 'tsconfig.json'),\n ...(tsconfig ? [...(jsxConfigs.get(tsconfig)?.files.keys() ?? [tsconfig])] : []),\n ].map((file) => resolve(file)),\n ),\n ];\n}\n"],"mappings":";;;;AAMA,IAAM,6BAAa,IAAI,IAA6D;;AAGpF,SAAS,UAAU,MAAc,YAAyC;CACxE,MAAM,WAAW,cAAc,GAAG,eAAe,MAAM,GAAG,IAAI,UAAU;CACxE,IAAI,CAAC,UAAU,OAAO,KAAA;CACtB,MAAM,SAAS,WAAW,IAAI,QAAQ;CACtC,IACE,UACA,CAAC,GAAG,OAAO,KAAK,CAAC,CAAC,OACf,CAAC,MAAM,WAAW,WAAW,IAAI,IAAI,SAAS,IAAI,CAAC,CAAC,UAAU,QAAQ,IACzE,GAEA,OAAO,OAAO;CAChB,MAAM,wBAAQ,IAAI,IAAoB;CAgBtC,MAAM,SAfS,GAAG,iCAChB,UACA,CAAC,GACD;EACE,GAAG,GAAG;EAEN,qBAAqB,CAAC;EACtB,SAAS,MAAM;GACb,MAAM,IAAI,MAAM,WAAW,IAAI,IAAI,SAAS,IAAI,CAAC,CAAC,UAAU,EAAE;GAC9D,OAAO,GAAG,IAAI,SAAS,IAAI;EAC7B;EACA,2BAA2B;EAC3B,sCAAsC,CAAC;CACzC,CAEa,CAAA,EAAQ,QAAQ;CAC/B,WAAW,IAAI,UAAU;EAAE;EAAO;CAAO,CAAC;CAC1C,OAAO;AACT;AAEA,SAAgB,WAAW,OAAO,QAAQ,IAAI,GAAG,YAA6B;CAC5E,MAAM,WAAW,QAAQ,MAAM,mBAAmB;CAClD,MAAM,kBAAkB,UAAU,MAAM,UAAU;CAClD,IAAI,CAAC,WAAW,QAAQ,GAAG,OAAO,EAAE,gBAAgB;CACpD,MAAM,QAAQ,KAAK,MAAM,aAAa,UAAU,MAAM,CAAC;CACvD,IAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,GAC5D,MAAM,IAAI,MAAM,GAAG,SAAS,qBAAqB;CACnD,IAAI,MAAM,mBAAmB,KAAA,KAAa,OAAO,MAAM,mBAAmB,WACxE,MAAM,IAAI,MAAM,GAAG,SAAS,mCAAmC;CACjE,KAAK,MAAM,OAAO,OAAO,KAAK,KAAK,GACjC,IAAI,CAAC,CAAC,kBAAkB,SAAS,CAAC,CAAC,SAAS,GAAG,GAC7C,MAAM,IAAI,MAAM,GAAG,SAAS,mBAAmB,KAAK;CACxD,OAAO;EAAE,gBAAgB,MAAM;EAAgB;CAAgB;AACjE;;AAGA,SAAgB,mBAAmB,MAAwB;CACzD,UAAU,IAAI;CACd,MAAM,WAAW,GAAG,eAAe,MAAM,GAAG,IAAI,UAAU;CAC1D,OAAO,CACL,GAAG,IAAI,IACL;EACE,QAAQ,MAAM,mBAAmB;EACjC,QAAQ,MAAM,eAAe;EAC7B,GAAI,WAAW,CAAC,GAAI,WAAW,IAAI,QAAQ,CAAC,EAAE,MAAM,KAAK,KAAK,CAAC,QAAQ,CAAE,IAAI,CAAC;CAChF,CAAC,CAAC,KAAK,SAAS,QAAQ,IAAI,CAAC,CAC/B,CACF;AACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ProjectDiagnostic } from './project.js';
|
|
2
|
+
export interface DeclarationOptions {
|
|
3
|
+
outDir?: string;
|
|
4
|
+
build?: boolean;
|
|
5
|
+
declarationMap?: boolean;
|
|
6
|
+
}
|
|
7
|
+
export interface DeclarationBuild {
|
|
8
|
+
projects: string[];
|
|
9
|
+
files: string[];
|
|
10
|
+
diagnostics: ProjectDiagnostic[];
|
|
11
|
+
}
|
|
12
|
+
/** Emits ordinary declaration files; a reference build visits dependencies first.
|
|
13
|
+
* No output is written for a project with syntax, type or emit errors. */
|
|
14
|
+
export declare function emitDeclarations(tsconfig: string, options?: DeclarationOptions): DeclarationBuild;
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import { TwillProject, sourceFilename } from "./project.js";
|
|
2
|
+
import MagicString from "magic-string";
|
|
3
|
+
import { mkdirSync, renameSync, writeFileSync } from "node:fs";
|
|
4
|
+
import { basename, dirname, relative, resolve } from "node:path";
|
|
5
|
+
import ts from "typescript";
|
|
6
|
+
import remapping from "@ampproject/remapping";
|
|
7
|
+
//#region src/declarations.ts
|
|
8
|
+
var moduleName = (value) => value.replace(/\.twillx?(?:\.tsx?)?$/, ".js").replace(/\.(?:tsx?|jsx)$/, ".js").replace(/\.(m|c)ts$/, ".$1js");
|
|
9
|
+
var outputName = (filename) => filename.replace(/\.twillx?\.d\.ts(?=\.map$|$)/, ".d.ts");
|
|
10
|
+
function moduleEdits(text, filename, source, redirects) {
|
|
11
|
+
const file = ts.createSourceFile(filename, text, ts.ScriptTarget.Latest, true);
|
|
12
|
+
const edits = new MagicString(text);
|
|
13
|
+
const visit = (node) => {
|
|
14
|
+
if (ts.isStringLiteral(node)) {
|
|
15
|
+
const parent = node.parent;
|
|
16
|
+
if ((ts.isImportDeclaration(parent) || ts.isExportDeclaration(parent)) && parent.moduleSpecifier === node || ts.isExternalModuleReference(parent) || ts.isLiteralTypeNode(parent) && ts.isImportTypeNode(parent.parent)) {
|
|
17
|
+
let value = moduleName(node.text);
|
|
18
|
+
if (source && node.text.startsWith(".")) {
|
|
19
|
+
const base = sourceFilename(resolve(dirname(source), node.text));
|
|
20
|
+
const target = [base, ...[
|
|
21
|
+
".twill",
|
|
22
|
+
".twillx",
|
|
23
|
+
".ts",
|
|
24
|
+
".tsx",
|
|
25
|
+
".mts",
|
|
26
|
+
".cts",
|
|
27
|
+
".js"
|
|
28
|
+
].map((ext) => base + ext)].map((candidate) => redirects.get(candidate)).find(Boolean);
|
|
29
|
+
if (target) {
|
|
30
|
+
value = relative(dirname(filename), target).replaceAll("\\", "/").replace(/\.d\.(ts|mts|cts)$/, (_, extension) => extension === "ts" ? ".js" : extension === "mts" ? ".mjs" : ".cjs");
|
|
31
|
+
if (!value.startsWith(".")) value = "./" + value;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (value !== node.text) edits.overwrite(node.getStart() + 1, node.end - 1, value);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
ts.forEachChild(node, visit);
|
|
38
|
+
};
|
|
39
|
+
visit(file);
|
|
40
|
+
return edits;
|
|
41
|
+
}
|
|
42
|
+
/** Emits ordinary declaration files; a reference build visits dependencies first.
|
|
43
|
+
* No output is written for a project with syntax, type or emit errors. */
|
|
44
|
+
function emitDeclarations(tsconfig, options = {}) {
|
|
45
|
+
const result = {
|
|
46
|
+
projects: [],
|
|
47
|
+
files: [],
|
|
48
|
+
diagnostics: []
|
|
49
|
+
};
|
|
50
|
+
const visited = /* @__PURE__ */ new Set();
|
|
51
|
+
const active = /* @__PURE__ */ new Set();
|
|
52
|
+
const redirects = /* @__PURE__ */ new Map();
|
|
53
|
+
const build = (config, root) => {
|
|
54
|
+
config = sourceFilename(resolve(config));
|
|
55
|
+
if (active.has(config)) throw new Error(`Circular project reference: ${config}`);
|
|
56
|
+
if (visited.has(config)) return;
|
|
57
|
+
active.add(config);
|
|
58
|
+
const parsed = ts.getParsedCommandLineOfConfigFile(config, {}, {
|
|
59
|
+
...ts.sys,
|
|
60
|
+
getCurrentDirectory: () => dirname(config),
|
|
61
|
+
onUnRecoverableConfigFileDiagnostic() {}
|
|
62
|
+
});
|
|
63
|
+
if (options.build) for (const reference of parsed?.projectReferences ?? []) build(ts.resolveProjectReferencePath(reference), false);
|
|
64
|
+
active.delete(config);
|
|
65
|
+
visited.add(config);
|
|
66
|
+
if (result.diagnostics.some((item) => item.category === "error")) return;
|
|
67
|
+
const project = new TwillProject(config, {}, { declarationRedirects: redirects });
|
|
68
|
+
try {
|
|
69
|
+
const outDir = resolve(root && options.outDir || parsed?.options.declarationDir || parsed?.options.outDir || resolve(project.root, "dist"));
|
|
70
|
+
const emitted = project.declarationOutput(outDir, options.declarationMap ?? true);
|
|
71
|
+
result.diagnostics.push(...emitted.diagnostics);
|
|
72
|
+
if (emitted.diagnostics.some((item) => item.category === "error")) return;
|
|
73
|
+
const inputs = new Set(project.sourceFiles().map((file) => ts.sys.useCaseSensitiveFileNames ? file : file.toLowerCase()));
|
|
74
|
+
const files = /* @__PURE__ */ new Map();
|
|
75
|
+
const edits = /* @__PURE__ */ new Map();
|
|
76
|
+
const projectRedirects = new Map(redirects);
|
|
77
|
+
const outputKeys = /* @__PURE__ */ new Set();
|
|
78
|
+
for (const file of emitted.files) if (!file.filename.endsWith(".map")) for (const source of file.sources) projectRedirects.set(source, outputName(file.filename));
|
|
79
|
+
for (const file of emitted.files) {
|
|
80
|
+
const filename = outputName(file.filename);
|
|
81
|
+
const key = ts.sys.useCaseSensitiveFileNames ? filename : filename.toLowerCase();
|
|
82
|
+
if (inputs.has(key)) throw new Error(`Declaration output would overwrite source: ${filename}`);
|
|
83
|
+
if (outputKeys.has(key)) throw new Error(`Declaration output collision: ${filename}`);
|
|
84
|
+
outputKeys.add(key);
|
|
85
|
+
if (!filename.endsWith(".map")) {
|
|
86
|
+
const changed = moduleEdits(file.text, filename, file.sources[0], projectRedirects);
|
|
87
|
+
edits.set(filename, changed);
|
|
88
|
+
files.set(filename, {
|
|
89
|
+
text: changed.toString().replace(/(sourceMappingURL=.*)\.twillx?\.d\.ts\.map/g, "$1.d.ts.map"),
|
|
90
|
+
sources: file.sources
|
|
91
|
+
});
|
|
92
|
+
} else files.set(filename, {
|
|
93
|
+
text: file.text,
|
|
94
|
+
sources: file.sources
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
for (const [filename, file] of files) if (filename.endsWith(".map")) {
|
|
98
|
+
const declaration = filename.slice(0, -4);
|
|
99
|
+
const originalMap = JSON.parse(file.text);
|
|
100
|
+
const source = sourceFilename(resolve(dirname(filename), originalMap.sourceRoot ?? "", decodeURIComponent(originalMap.sources[0] ?? "")));
|
|
101
|
+
const transformed = project.transformed(source);
|
|
102
|
+
const maps = [edits.get(declaration).generateMap({
|
|
103
|
+
source: declaration,
|
|
104
|
+
hires: true,
|
|
105
|
+
includeContent: true
|
|
106
|
+
}), originalMap];
|
|
107
|
+
if (transformed) maps.push(transformed.map);
|
|
108
|
+
const combined = remapping(maps, () => null);
|
|
109
|
+
combined.file = basename(declaration);
|
|
110
|
+
combined.sources = combined.sources.map(() => relative(dirname(filename), source).replaceAll("\\", "/"));
|
|
111
|
+
file.text = JSON.stringify(combined);
|
|
112
|
+
}
|
|
113
|
+
for (const [filename, file] of files) {
|
|
114
|
+
mkdirSync(dirname(filename), { recursive: true });
|
|
115
|
+
const staging = filename + ".twill-tmp";
|
|
116
|
+
writeFileSync(staging, file.text);
|
|
117
|
+
renameSync(staging, filename);
|
|
118
|
+
result.files.push(filename);
|
|
119
|
+
if (!filename.endsWith(".map")) for (const source of file.sources) redirects.set(source, filename);
|
|
120
|
+
}
|
|
121
|
+
result.projects.push(config);
|
|
122
|
+
} finally {
|
|
123
|
+
project.dispose();
|
|
124
|
+
}
|
|
125
|
+
};
|
|
126
|
+
build(tsconfig, true);
|
|
127
|
+
return result;
|
|
128
|
+
}
|
|
129
|
+
//#endregion
|
|
130
|
+
export { emitDeclarations };
|
|
131
|
+
|
|
132
|
+
//# sourceMappingURL=declarations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"declarations.js","names":[],"sources":["../src/declarations.ts"],"sourcesContent":["import ts from 'typescript';\nimport MagicString from 'magic-string';\nimport remapping from '@ampproject/remapping';\nimport { resolve, dirname, basename, relative } from 'node:path';\nimport { mkdirSync, writeFileSync, renameSync } from 'node:fs';\nimport { TwillProject, type ProjectDiagnostic, sourceFilename } from './project.js';\n\nexport interface DeclarationOptions {\n outDir?: string;\n build?: boolean;\n declarationMap?: boolean;\n}\nexport interface DeclarationBuild {\n projects: string[];\n files: string[];\n diagnostics: ProjectDiagnostic[];\n}\n\nconst moduleName = (value: string) =>\n value\n .replace(/\\.twillx?(?:\\.tsx?)?$/, '.js')\n .replace(/\\.(?:tsx?|jsx)$/, '.js')\n .replace(/\\.(m|c)ts$/, '.$1js');\nconst outputName = (filename: string) => filename.replace(/\\.twillx?\\.d\\.ts(?=\\.map$|$)/, '.d.ts');\nfunction moduleEdits(\n text: string,\n filename: string,\n source: string | undefined,\n redirects: ReadonlyMap<string, string>,\n) {\n const file = ts.createSourceFile(filename, text, ts.ScriptTarget.Latest, true);\n const edits = new MagicString(text);\n const visit = (node: ts.Node) => {\n if (ts.isStringLiteral(node)) {\n const parent = node.parent;\n if (\n ((ts.isImportDeclaration(parent) || ts.isExportDeclaration(parent)) &&\n parent.moduleSpecifier === node) ||\n ts.isExternalModuleReference(parent) ||\n (ts.isLiteralTypeNode(parent) && ts.isImportTypeNode(parent.parent))\n ) {\n let value = moduleName(node.text);\n if (source && node.text.startsWith('.')) {\n const base = sourceFilename(resolve(dirname(source), node.text));\n const target = [\n base,\n ...['.twill', '.twillx', '.ts', '.tsx', '.mts', '.cts', '.js'].map((ext) => base + ext),\n ]\n .map((candidate) => redirects.get(candidate))\n .find(Boolean);\n if (target) {\n value = relative(dirname(filename), target)\n .replaceAll('\\\\', '/')\n .replace(/\\.d\\.(ts|mts|cts)$/, (_, extension: string) =>\n extension === 'ts' ? '.js' : extension === 'mts' ? '.mjs' : '.cjs',\n );\n if (!value.startsWith('.')) value = './' + value;\n }\n }\n if (value !== node.text) edits.overwrite(node.getStart() + 1, node.end - 1, value);\n }\n }\n ts.forEachChild(node, visit);\n };\n visit(file);\n return edits;\n}\n\n/** Emits ordinary declaration files; a reference build visits dependencies first.\n * No output is written for a project with syntax, type or emit errors. */\nexport function emitDeclarations(\n tsconfig: string,\n options: DeclarationOptions = {},\n): DeclarationBuild {\n const result: DeclarationBuild = { projects: [], files: [], diagnostics: [] };\n const visited = new Set<string>();\n const active = new Set<string>();\n const redirects = new Map<string, string>();\n const build = (config: string, root: boolean) => {\n config = sourceFilename(resolve(config));\n if (active.has(config)) throw new Error(`Circular project reference: ${config}`);\n if (visited.has(config)) return;\n active.add(config);\n const parsed = ts.getParsedCommandLineOfConfigFile(\n config,\n {},\n {\n ...ts.sys,\n getCurrentDirectory: () => dirname(config),\n onUnRecoverableConfigFileDiagnostic() {},\n },\n );\n if (options.build)\n for (const reference of parsed?.projectReferences ?? [])\n build(ts.resolveProjectReferencePath(reference), false);\n active.delete(config);\n visited.add(config);\n if (result.diagnostics.some((item) => item.category === 'error')) return;\n const project = new TwillProject(config, {}, { declarationRedirects: redirects });\n try {\n const outDir = resolve(\n (root && options.outDir) ||\n parsed?.options.declarationDir ||\n parsed?.options.outDir ||\n resolve(project.root, 'dist'),\n );\n const emitted = project.declarationOutput(outDir, options.declarationMap ?? true);\n result.diagnostics.push(...emitted.diagnostics);\n if (emitted.diagnostics.some((item) => item.category === 'error')) return;\n const inputs = new Set(\n project\n .sourceFiles()\n .map((file) => (ts.sys.useCaseSensitiveFileNames ? file : file.toLowerCase())),\n );\n const files = new Map<string, { text: string; sources: string[] }>();\n const edits = new Map<string, MagicString>();\n const projectRedirects = new Map(redirects);\n const outputKeys = new Set<string>();\n for (const file of emitted.files)\n if (!file.filename.endsWith('.map'))\n for (const source of file.sources)\n projectRedirects.set(source, outputName(file.filename));\n for (const file of emitted.files) {\n const filename = outputName(file.filename);\n const key = ts.sys.useCaseSensitiveFileNames ? filename : filename.toLowerCase();\n if (inputs.has(key))\n throw new Error(`Declaration output would overwrite source: ${filename}`);\n if (outputKeys.has(key)) throw new Error(`Declaration output collision: ${filename}`);\n outputKeys.add(key);\n if (!filename.endsWith('.map')) {\n const changed = moduleEdits(file.text, filename, file.sources[0], projectRedirects);\n edits.set(filename, changed);\n files.set(filename, {\n text: changed\n .toString()\n .replace(/(sourceMappingURL=.*)\\.twillx?\\.d\\.ts\\.map/g, '$1.d.ts.map'),\n sources: file.sources,\n });\n } else files.set(filename, { text: file.text, sources: file.sources });\n }\n for (const [filename, file] of files)\n if (filename.endsWith('.map')) {\n const declaration = filename.slice(0, -4);\n const originalMap = JSON.parse(file.text);\n const source = sourceFilename(\n resolve(\n dirname(filename),\n originalMap.sourceRoot ?? '',\n decodeURIComponent(originalMap.sources[0] ?? ''),\n ),\n );\n const transformed = project.transformed(source);\n const changed = edits.get(declaration)!;\n const maps: any[] = [\n changed.generateMap({ source: declaration, hires: true, includeContent: true }),\n originalMap,\n ];\n if (transformed) maps.push(transformed.map);\n const combined = remapping(maps as any, () => null);\n combined.file = basename(declaration);\n combined.sources = combined.sources.map(() =>\n relative(dirname(filename), source).replaceAll('\\\\', '/'),\n );\n file.text = JSON.stringify(combined);\n }\n for (const [filename, file] of files) {\n mkdirSync(dirname(filename), { recursive: true });\n const staging = filename + '.twill-tmp';\n writeFileSync(staging, file.text);\n renameSync(staging, filename);\n result.files.push(filename);\n if (!filename.endsWith('.map'))\n for (const source of file.sources) redirects.set(source, filename);\n }\n result.projects.push(config);\n } finally {\n project.dispose();\n }\n };\n build(tsconfig, true);\n return result;\n}\n"],"mappings":"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"}
|
package/dist/defer.d.ts
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { default as MagicString } from 'magic-string';
|
|
2
|
+
import { Language } from './compiler.js';
|
|
3
|
+
type Node = {
|
|
4
|
+
type: string;
|
|
5
|
+
start: number;
|
|
6
|
+
end: number;
|
|
7
|
+
[key: string]: any;
|
|
8
|
+
};
|
|
9
|
+
type Comment = {
|
|
10
|
+
start: number;
|
|
11
|
+
end: number;
|
|
12
|
+
value: string;
|
|
13
|
+
type: string;
|
|
14
|
+
};
|
|
15
|
+
/** Scope-local cleanup callbacks; dynamic registrations use lazy stacks. */
|
|
16
|
+
export declare function lowerDefers(source: string, ast: Node, code: MagicString, language: Language, usedNames: Set<string>, contentStarts: Map<Node, number>, comments: Comment[], fail: (node: Node, message: string) => never): void;
|
|
17
|
+
export {};
|
package/dist/doctor.d.ts
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { default as ts } from 'typescript';
|
|
2
|
+
import { TwillProject } from './project.js';
|
|
3
|
+
/** Shareable diagnostics without source contents or environment-variable values. */
|
|
4
|
+
export declare function inspectProject(project: TwillProject, filename?: string): {
|
|
5
|
+
twillVersion: string;
|
|
6
|
+
typescriptVersion: string;
|
|
7
|
+
nodeVersion: string;
|
|
8
|
+
root: string;
|
|
9
|
+
configFiles: readonly string[];
|
|
10
|
+
compilerOptions: ts.CompilerOptions;
|
|
11
|
+
files: {
|
|
12
|
+
total: number;
|
|
13
|
+
twill: number;
|
|
14
|
+
native: number;
|
|
15
|
+
};
|
|
16
|
+
sourceFiles: string[];
|
|
17
|
+
diagnostics: import('./project.js').ProjectDiagnostic[];
|
|
18
|
+
diagnosticTimeMs: number;
|
|
19
|
+
ok: boolean;
|
|
20
|
+
};
|