Comparing version 5.0.0-next.243 to 5.0.0-next.244
@@ -5,3 +5,3 @@ { | ||
"license": "MIT", | ||
"version": "5.0.0-next.243", | ||
"version": "5.0.0-next.244", | ||
"type": "module", | ||
@@ -8,0 +8,0 @@ "types": "./types/index.d.ts", |
@@ -438,2 +438,12 @@ /* This file is generated by scripts/process-messages/index.js. Do not edit! */ | ||
/** | ||
* TypeScript language features like %feature% are not natively supported, and their use is generally discouraged. Outside of `<script>` tags, these features are not supported. For use within `<script>` tags, you will need to use a preprocessor to convert it to JavaScript before it gets passed to the Svelte compiler. If you are using `vitePreprocess`, make sure to specifically enable preprocessing script tags (`vitePreprocess({ script: true })`) | ||
* @param {null | number | NodeLike} node | ||
* @param {string} feature | ||
* @returns {never} | ||
*/ | ||
export function typescript_invalid_feature(node, feature) { | ||
e(node, "typescript_invalid_feature", `TypeScript language features like ${feature} are not natively supported, and their use is generally discouraged. Outside of \`<script>\` tags, these features are not supported. For use within \`<script>\` tags, you will need to use a preprocessor to convert it to JavaScript before it gets passed to the Svelte compiler. If you are using \`vitePreprocess\`, make sure to specifically enable preprocessing script tags (\`vitePreprocess({ script: true })\`)`); | ||
} | ||
/** | ||
* Declaration cannot be empty | ||
@@ -440,0 +450,0 @@ * @param {null | number | NodeLike} node |
@@ -5,2 +5,3 @@ /** @import { Context, Visitors } from 'zimmerframe' */ | ||
import * as b from '../../utils/builders.js'; | ||
import * as e from '../../errors.js'; | ||
@@ -20,2 +21,5 @@ /** | ||
const visitors = { | ||
Decorator(node) { | ||
e.typescript_invalid_feature(node, 'decorators (related TSC proposal is not stage 4 yet)'); | ||
}, | ||
ImportDeclaration(node) { | ||
@@ -57,2 +61,10 @@ if (node.importKind === 'type') return b.empty; | ||
}, | ||
PropertyDefinition(node) { | ||
if (node.accessor) { | ||
e.typescript_invalid_feature( | ||
node, | ||
'accessor fields (related TSC proposal is not stage 4 yet)' | ||
); | ||
} | ||
}, | ||
TSAsExpression(node, context) { | ||
@@ -79,6 +91,9 @@ return context.visit(node.expression); | ||
}, | ||
TSEnumDeclaration() { | ||
return b.empty; | ||
TSEnumDeclaration(node) { | ||
e.typescript_invalid_feature(node, 'enums'); | ||
}, | ||
TSParameterProperty(node) { | ||
TSParameterProperty(node, context) { | ||
if (node.accessibility && context.path.at(-2)?.kind === 'constructor') { | ||
e.typescript_invalid_feature(node, 'accessibility modifiers on constructor parameters'); | ||
} | ||
return node.parameter; | ||
@@ -96,3 +111,29 @@ }, | ||
FunctionExpression: remove_this_param, | ||
FunctionDeclaration: remove_this_param | ||
FunctionDeclaration: remove_this_param, | ||
TSDeclareFunction() { | ||
return b.empty; | ||
}, | ||
ClassDeclaration(node, context) { | ||
if (node.declare) { | ||
return b.empty; | ||
} | ||
return context.next(); | ||
}, | ||
VariableDeclaration(node, context) { | ||
if (node.declare) { | ||
return b.empty; | ||
} | ||
return context.next(); | ||
}, | ||
TSModuleDeclaration(node, context) { | ||
if (!node.body) return b.empty; | ||
// namespaces can contain non-type nodes | ||
const cleaned = /** @type {any[]} */ (node.body.body).map((entry) => context.visit(entry)); | ||
if (cleaned.some((entry) => entry !== b.empty)) { | ||
e.typescript_invalid_feature(node, 'namespaces with non-type nodes'); | ||
} | ||
return b.empty; | ||
} | ||
}; | ||
@@ -99,0 +140,0 @@ |
@@ -192,8 +192,20 @@ /** @import { Expression } from 'estree' */ | ||
while ((attribute = read(parser))) { | ||
if (attribute.type === 'Attribute' || attribute.type === 'BindDirective') { | ||
if (unique_names.includes(attribute.name)) { | ||
// animate and transition can only be specified once per element so no need | ||
// to check here, use can be used multiple times, same for the on directive | ||
// finally let already has error handling in case of duplicate variable names | ||
if ( | ||
attribute.type === 'Attribute' || | ||
attribute.type === 'BindDirective' || | ||
attribute.type === 'StyleDirective' || | ||
attribute.type === 'ClassDirective' | ||
) { | ||
// `bind:attribute` and `attribute` are just the same but `class:attribute`, | ||
// `style:attribute` and `attribute` are different and should be allowed together | ||
// so we concatenate the type while normalizing the type for BindDirective | ||
const type = attribute.type === 'BindDirective' ? 'Attribute' : attribute.type; | ||
if (unique_names.includes(type + attribute.name)) { | ||
e.attribute_duplicate(attribute); | ||
// <svelte:element bind:this this=..> is allowed | ||
} else if (attribute.name !== 'this') { | ||
unique_names.push(attribute.name); | ||
unique_names.push(type + attribute.name); | ||
} | ||
@@ -200,0 +212,0 @@ } |
@@ -460,4 +460,19 @@ /** @import * as ESTree from 'estree' */ | ||
const body = [...module.body, ...state.hoisted]; | ||
// Merge hoisted statements into module body. | ||
// Ensure imports are on top, with the order preserved, then module body, then hoisted statements | ||
/** @type {ESTree.ImportDeclaration[]} */ | ||
const imports = []; | ||
/** @type {ESTree.Program['body']} */ | ||
let body = []; | ||
for (const entry of [...module.body, ...state.hoisted]) { | ||
if (entry.type === 'ImportDeclaration') { | ||
imports.push(entry); | ||
} else { | ||
body.push(entry); | ||
} | ||
} | ||
body = [...imports, ...body]; | ||
const component = b.function_declaration( | ||
@@ -464,0 +479,0 @@ b.id(analysis.name), |
@@ -251,4 +251,4 @@ /** @import { Expression, ExpressionStatement, Identifier, MemberExpression, ObjectExpression, Statement } from 'estree' */ | ||
); | ||
continue; | ||
} | ||
continue; | ||
} | ||
@@ -255,0 +255,0 @@ |
@@ -31,3 +31,4 @@ /** @import { CallExpression, Expression, Identifier, Literal, VariableDeclaration, VariableDeclarator } from 'estree' */ | ||
rune === '$inspect' || | ||
rune === '$state.snapshot' | ||
rune === '$state.snapshot' || | ||
rune === '$host' | ||
) { | ||
@@ -34,0 +35,0 @@ if (init != null && is_hoisted_function(init)) { |
@@ -9,3 +9,3 @@ // generated during release, do not modify | ||
*/ | ||
export const VERSION = '5.0.0-next.243'; | ||
export const VERSION = '5.0.0-next.244'; | ||
export const PUBLIC_VERSION = '5'; |
Sorry, the diff of this file is too big to display
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
2199353
48568