From 1091d23ed171e833fc7e1cb4dfde82bdcb34ba15 Mon Sep 17 00:00:00 2001 From: Richard Harris Date: Sat, 14 Sep 2019 18:58:26 -0400 Subject: [PATCH] some annoying typescript stuff --- package-lock.json | 23 ++---- package.json | 4 +- rollup.config.js | 5 +- src/compiler/compile/Component.ts | 78 +++++++++---------- src/compiler/compile/create_module.ts | 11 +-- src/compiler/compile/css/Selector.ts | 32 ++++---- src/compiler/compile/css/Stylesheet.ts | 51 ++++++------ .../compile/css/gather_possible_values.ts | 2 +- src/compiler/compile/css/interfaces.ts | 6 ++ src/compiler/compile/nodes/EachBlock.ts | 33 ++++---- src/compiler/compile/nodes/EventHandler.ts | 18 +++-- src/compiler/compile/nodes/Let.ts | 2 +- .../compile/nodes/shared/Expression.ts | 26 ++++--- .../compile/nodes/shared/map_children.ts | 4 +- src/compiler/compile/render_dom/Block.ts | 34 ++++---- src/compiler/compile/render_dom/Renderer.ts | 12 +-- src/compiler/compile/render_dom/index.ts | 48 ++++++------ .../compile/render_dom/wrappers/AwaitBlock.ts | 4 +- .../compile/render_dom/wrappers/Body.ts | 2 +- .../compile/render_dom/wrappers/DebugTag.ts | 2 +- .../compile/render_dom/wrappers/EachBlock.ts | 17 ++-- .../render_dom/wrappers/Element/Binding.ts | 38 +++++---- .../render_dom/wrappers/Element/index.ts | 10 +-- .../compile/render_dom/wrappers/IfBlock.ts | 5 +- .../wrappers/InlineComponent/index.ts | 10 +-- .../render_dom/wrappers/MustacheTag.ts | 4 +- .../render_dom/wrappers/RawMustacheTag.ts | 4 +- .../compile/render_dom/wrappers/Slot.ts | 2 +- .../compile/render_dom/wrappers/Text.ts | 5 +- .../compile/render_dom/wrappers/Title.ts | 2 +- .../compile/render_dom/wrappers/Window.ts | 6 +- .../compile/render_dom/wrappers/shared/Tag.ts | 4 +- .../render_dom/wrappers/shared/Wrapper.ts | 10 +-- .../render_dom/wrappers/shared/bind_this.ts | 4 +- .../compile/render_ssr/handlers/EachBlock.ts | 2 +- src/compiler/compile/render_ssr/index.ts | 59 +++++++------- .../compile/utils/flatten_reference.ts | 12 ++- src/compiler/compile/utils/get_object.ts | 8 +- src/compiler/compile/utils/invalidate.ts | 4 +- src/compiler/compile/utils/scope.ts | 52 +++++++------ src/compiler/compile/utils/tail.ts | 7 -- src/compiler/compile/utils/unwrap_parens.ts | 6 -- src/compiler/interfaces.ts | 41 +++++++--- src/compiler/parse/index.ts | 12 +-- src/compiler/parse/read/script.ts | 14 ++-- src/compiler/parse/read/style.ts | 14 ++-- src/compiler/parse/state/mustache.ts | 10 +-- src/compiler/parse/state/tag.ts | 10 +-- 48 files changed, 397 insertions(+), 372 deletions(-) create mode 100644 src/compiler/compile/css/interfaces.ts delete mode 100644 src/compiler/compile/utils/tail.ts delete mode 100644 src/compiler/compile/utils/unwrap_parens.ts diff --git a/package-lock.json b/package-lock.json index 827178a325..dccb96164f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -502,27 +502,20 @@ "dev": true }, "code-red": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/code-red/-/code-red-0.0.8.tgz", - "integrity": "sha512-wvKPondTM1H6MoUnz5tj6z1xawzmaulkC0qLv5S1KLkShWgRybgIdvGyVr5pPQt2ovpdmh6BcpRXXoqs5X8tcA==", + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/code-red/-/code-red-0.0.9.tgz", + "integrity": "sha512-xQVOUxMYfFXgkW/VA1raehj+YH8CV98c8XG5cFhpeEYoO8fIjr4KM4E0Ov6lLC2rSu5qtMWmrcA1gveZwg8r1w==", "dev": true, "requires": { "acorn": "^7.0.0", - "estree-walker": "^0.6.1", "is-reference": "^1.1.3", "periscopic": "^1.0.0", "source-map": "^0.7.3" }, "dependencies": { "astring": { - "version": "github:Rich-Harris/astring#ff83f5e4e75b304cdd428ada4a71372276b0084d", - "from": "github:Rich-Harris/astring#ff83f5e4e75b304cdd428ada4a71372276b0084d" - }, - "estree-walker": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.6.1.tgz", - "integrity": "sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==", - "dev": true + "version": "github:Rich-Harris/astring#00fa527b66cc1b57efb2a4b9052dd4e190ae3590", + "from": "github:Rich-Harris/astring#00fa527b66cc1b57efb2a4b9052dd4e190ae3590" }, "source-map": { "version": "0.7.3", @@ -1212,9 +1205,9 @@ "dev": true }, "estree-walker": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.7.0.tgz", - "integrity": "sha512-6BzTIhsjm2jnqLO+O23aaiDGr9jsrgwT1ObAIEebwvbJthCoF5T1MtybbCx540r2U5fsn/8IIv7ZWqMqTHuu6Q==", + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-0.8.1.tgz", + "integrity": "sha512-H6cJORkqvrNziu0KX2hqOMAlA2CiuAxHeGJXSIoKA/KLv229Dw806J3II6mKTm5xiDX1At1EXCfsOQPB+tMB+g==", "dev": true }, "esutils": { diff --git a/package.json b/package.json index 0ea531048b..f86ff68cd0 100644 --- a/package.json +++ b/package.json @@ -63,13 +63,13 @@ "acorn": "^7.0.0", "agadoo": "^1.0.1", "c8": "^5.0.1", - "code-red": "0.0.8", + "code-red": "0.0.9", "codecov": "^3.5.0", "css-tree": "1.0.0-alpha22", "eslint": "^6.3.0", "eslint-plugin-import": "^2.18.2", "eslint-plugin-svelte3": "^2.7.3", - "estree-walker": "^0.7.0", + "estree-walker": "^0.8.1", "is-reference": "^1.1.3", "jsdom": "^15.1.1", "kleur": "^3.0.3", diff --git a/rollup.config.js b/rollup.config.js index 7cce25e24c..25cc581044 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -20,8 +20,9 @@ const ts_plugin = is_publish const external = id => id.startsWith('svelte/'); -const inlined_estree = fs.readFileSync('./node_modules/estree-walker/index.d.ts', 'utf-8').replace(/declare.*\{((.|[\n\r])+)\}/m, '$1'); -fs.writeFileSync(`./compiler.d.ts`, `export { compile, parse, preprocess, VERSION } from './types/compiler/index';\n${inlined_estree}`); +// const inlined_estree = fs.readFileSync('./node_modules/estree-walker/index.d.ts', 'utf-8').replace(/declare.*\{((.|[\n\r])+)\}/m, '$1'); +// fs.writeFileSync(`./compiler.d.ts`, `export { compile, parse, preprocess, VERSION } from './types/compiler/index';\n${inlined_estree}`); +fs.writeFileSync(`./compiler.d.ts`, `export { compile, parse, preprocess, VERSION } from './types/compiler/index';`); export default [ /* runtime */ diff --git a/src/compiler/compile/Component.ts b/src/compiler/compile/Component.ts index 29e05c7987..4262b07fdd 100644 --- a/src/compiler/compile/Component.ts +++ b/src/compiler/compile/Component.ts @@ -15,7 +15,7 @@ import Stylesheet from './css/Stylesheet'; import { test } from '../config'; import Fragment from './nodes/Fragment'; import internal_exports from './internal_exports'; -import { Node, Ast, CompileOptions, Var, Warning, Identifier } from '../interfaces'; +import { Ast, CompileOptions, Var, Warning } from '../interfaces'; import error from '../utils/error'; import get_code_frame from '../utils/get_code_frame'; import flatten_reference from './utils/flatten_reference'; @@ -23,9 +23,8 @@ import is_reference from 'is-reference'; import TemplateScope from './nodes/shared/TemplateScope'; import fuzzymatch from '../utils/fuzzymatch'; import get_object from './utils/get_object'; -import unwrap_parens from './utils/unwrap_parens'; import Slot from './nodes/Slot'; -import { Node as ESTreeNode } from 'estree'; +import { Node, ImportDeclaration, Identifier, Program, ExpressionStatement, AssignmentExpression } from 'estree'; import add_to_set from './utils/add_to_set'; import check_graph_for_cycles from './utils/check_graph_for_cycles'; import { print, x } from 'code-red'; @@ -46,7 +45,7 @@ childKeys.Attribute = ['value']; childKeys.ExportNamedDeclaration = ['declaration', 'specifiers']; function remove_node( - body: Node, + body: Node[], node: Node ) { const i = body.indexOf(node); @@ -78,14 +77,14 @@ export default class Component { vars: Var[] = []; var_lookup: Map = new Map(); - imports: Node[] = []; + imports: ImportDeclaration[] = []; module_javascript: string; javascript: string; hoistable_nodes: Set = new Set(); node_for_declaration: Map = new Map(); - partly_hoisted: Node[] = []; - fully_hoisted: Node[] = []; + partly_hoisted: (Node | Node[])[] = []; + fully_hoisted: (Node | Node[])[] = []; reactive_declarations: Array<{ assignees: Set; dependencies: Set; @@ -589,7 +588,7 @@ export default class Component { walk(script.content, { enter(node) { if (node.type === 'LabeledStatement' && node.label.name === '$') { - component.warn(node, { + component.warn(node as any, { code: 'module-script-reactive-declaration', message: '$: has no effect in a module script', }); @@ -602,23 +601,25 @@ export default class Component { scope.declarations.forEach((node, name) => { if (name[0] === '$') { - this.error(node, { + this.error(node as any, { code: 'illegal-declaration', message: `The $ prefix is reserved, and cannot be used for variable and import names`, }); } + const writable = node.type === 'VariableDeclaration' && (node.kind === 'var' || node.kind === 'let'); + this.add_var({ name, module: true, hoistable: true, - writable: node.kind === 'var' || node.kind === 'let', + writable }); }); globals.forEach((node, name) => { if (name[0] === '$') { - this.error(node, { + this.error(node as any, { code: 'illegal-subscription', message: `Cannot reference store value inside '; -function get_context(parser: Parser, attributes: Node[], start: number) { +function get_context(parser: Parser, attributes: any[], start: number): string { const context = attributes.find(attribute => attribute.name === 'context'); if (!context) return 'default'; @@ -28,7 +29,7 @@ function get_context(parser: Parser, attributes: Node[], start: number) { return value; } -export default function read_script(parser: Parser, start: number, attributes: Node[]) { +export default function read_script(parser: Parser, start: number, attributes: Node[]) : Script { const script_start = parser.index; const script_end = parser.template.indexOf(script_closing_tag, script_start); @@ -41,7 +42,7 @@ export default function read_script(parser: Parser, start: number, attributes: N repeat(' ', script_start) + parser.template.slice(script_start, script_end); parser.index = script_end + script_closing_tag.length; - let ast; + let ast: Program; try { ast = acorn.parse(source); @@ -49,8 +50,11 @@ export default function read_script(parser: Parser, start: number, attributes: N parser.acorn_error(err); } - ast.start = script_start; + // TODO is this necessary? + (ast as any).start = script_start; + return { + type: 'Script', start, end: parser.index, context: get_context(parser, attributes, start), diff --git a/src/compiler/parse/read/style.ts b/src/compiler/parse/read/style.ts index a14356e05b..4a16475d6b 100644 --- a/src/compiler/parse/read/style.ts +++ b/src/compiler/parse/read/style.ts @@ -1,9 +1,10 @@ import parse from 'css-tree/lib/parser/index.js'; import { walk } from 'estree-walker'; import { Parser } from '../index'; -import { Node } from '../../interfaces'; +import { Node } from 'estree'; +import { Style } from '../../interfaces'; -export default function read_style(parser: Parser, start: number, attributes: Node[]) { +export default function read_style(parser: Parser, start: number, attributes: Node[]): Style { const content_start = parser.index; const styles = parser.read_until(/<\/style>/); const content_end = parser.index; @@ -30,7 +31,7 @@ export default function read_style(parser: Parser, start: number, attributes: No // tidy up AST walk(ast, { - enter: (node: Node) => { + enter: (node: any) => { // `any` because this isn't an ESTree node // replace `ref:a` nodes if (node.type === 'Selector') { for (let i = 0; i < node.children.length; i += 1) { @@ -58,6 +59,7 @@ export default function read_style(parser: Parser, start: number, attributes: No const end = parser.index; return { + type: 'Style', start, end, attributes, @@ -65,12 +67,12 @@ export default function read_style(parser: Parser, start: number, attributes: No content: { start: content_start, end: content_end, - styles, - }, + styles + } }; } -function is_ref_selector(a: Node, b: Node) { +function is_ref_selector(a: any, b: any) { // TODO add CSS node types if (!b) return false; return ( diff --git a/src/compiler/parse/state/mustache.ts b/src/compiler/parse/state/mustache.ts index 8de35cee48..4a1578ada5 100644 --- a/src/compiler/parse/state/mustache.ts +++ b/src/compiler/parse/state/mustache.ts @@ -4,9 +4,9 @@ import { closing_tag_omitted } from '../utils/html'; import { whitespace } from '../../utils/patterns'; import { trim_start, trim_end } from '../../utils/trim'; import { Parser } from '../index'; -import { Node } from '../../interfaces'; +import { TemplateNode } from '../../interfaces'; -function trim_whitespace(block: Node, trim_before: boolean, trim_after: boolean) { +function trim_whitespace(block: TemplateNode, trim_before: boolean, trim_after: boolean) { if (!block.children || block.children.length === 0) return; // AwaitBlock const first_child = block.children[0]; @@ -175,7 +175,7 @@ export default function mustache(parser: Parser) { parser.eat('}', true); } - const then_block: Node = { + const then_block: TemplateNode = { start, end: null, type: 'ThenBlock', @@ -200,7 +200,7 @@ export default function mustache(parser: Parser) { parser.eat('}', true); } - const catch_block: Node = { + const catch_block: TemplateNode = { start, end: null, type: 'CatchBlock', @@ -232,7 +232,7 @@ export default function mustache(parser: Parser) { const expression = read_expression(parser); - const block: Node = type === 'AwaitBlock' ? + const block: TemplateNode = type === 'AwaitBlock' ? { start, end: null, diff --git a/src/compiler/parse/state/tag.ts b/src/compiler/parse/state/tag.ts index 21a7b3caea..6b187d141b 100644 --- a/src/compiler/parse/state/tag.ts +++ b/src/compiler/parse/state/tag.ts @@ -4,7 +4,7 @@ import read_style from '../read/style'; import { decode_character_references, closing_tag_omitted } from '../utils/html'; import { is_void } from '../../utils/names'; import { Parser } from '../index'; -import { Directive, DirectiveType, Node, Text } from '../../interfaces'; +import { Directive, DirectiveType, TemplateNode, Text } from '../../interfaces'; import fuzzymatch from '../../utils/fuzzymatch'; import list from '../../utils/list'; @@ -112,7 +112,7 @@ export default function tag(parser: Parser) { : name === 'title' && parent_is_head(parser.stack) ? 'Title' : name === 'slot' && !parser.customElement ? 'Slot' : 'Element'; - const element: Node = { + const element: TemplateNode = { start, end: null, // filled in later type, @@ -406,7 +406,7 @@ function read_attribute(parser: Parser, unique_names: Set) { end: directive.end, type: 'Identifier', name: directive.name - }; + } as any; } return directive; @@ -447,7 +447,7 @@ function read_attribute_value(parser: Parser) { return value; } -function read_sequence(parser: Parser, done: () => boolean): Node[] { +function read_sequence(parser: Parser, done: () => boolean): TemplateNode[] { let current_chunk: Text = { start: parser.index, end: null, @@ -464,7 +464,7 @@ function read_sequence(parser: Parser, done: () => boolean): Node[] { } } - const chunks: Node[] = []; + const chunks: TemplateNode[] = []; while (parser.index < parser.template.length) { const index = parser.index;