Skip to content

Commit 68d7dca

Browse files
authored
Merge pull request #2743 from sveltejs/namespaced-components
implement namespaced components
2 parents 4fa9369 + 85543f5 commit 68d7dca

File tree

18 files changed

+81
-17
lines changed

18 files changed

+81
-17
lines changed

site/content/docs/02-template-syntax.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ title: Template syntax
77

88
---
99

10-
A lowercase tag, like `<div>`, denotes a regular HTML element. A capitalised tag, such as `<Widget>`, indicates a *component*.
10+
A lowercase tag, like `<div>`, denotes a regular HTML element. A capitalised tag, such as `<Widget>` or `<Namespace.Widget>`, indicates a *component*.
1111

1212
```html
1313
<script>

src/compile/Component.ts

+2-4
Original file line numberDiff line numberDiff line change
@@ -759,7 +759,7 @@ export default class Component {
759759
const { name } = object;
760760

761761
if (name[0] === '$' && !scope.has(name)) {
762-
component.warn_if_undefined(object, null);
762+
component.warn_if_undefined(name, object, null);
763763
}
764764
}
765765
},
@@ -1202,9 +1202,7 @@ export default class Component {
12021202
return `ctx.${name}`;
12031203
}
12041204

1205-
warn_if_undefined(node, template_scope: TemplateScope) {
1206-
let { name } = node;
1207-
1205+
warn_if_undefined(name: string, node, template_scope: TemplateScope) {
12081206
if (name[0] === '$') {
12091207
name = name.slice(1);
12101208
this.has_reactive_assignments = true; // TODO does this belong here?

src/compile/nodes/Action.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export default class Action extends Node {
1111
constructor(component: Component, parent, scope, info) {
1212
super(component, parent, scope, info);
1313

14-
component.warn_if_undefined(info, scope);
14+
component.warn_if_undefined(info.name, info, scope);
1515

1616
this.name = info.name;
1717
component.qualify(info.name);

src/compile/nodes/Animation.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ export default class Animation extends Node {
1010
constructor(component: Component, parent, scope, info) {
1111
super(component, parent, scope, info);
1212

13-
component.warn_if_undefined(info, scope);
13+
component.warn_if_undefined(info.name, info, scope);
1414

1515
this.name = info.name;
1616
component.qualify(info.name);

src/compile/nodes/InlineComponent.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ export default class InlineComponent extends Node {
2323
super(component, parent, scope, info);
2424

2525
if (info.name !== 'svelte:component' && info.name !== 'svelte:self') {
26-
component.warn_if_undefined(info, scope);
27-
component.add_reference(info.name);
26+
const name = info.name.split('.')[0]; // accommodate namespaces
27+
component.warn_if_undefined(name, info, scope);
28+
component.add_reference(name);
2829
}
2930

3031
this.name = info.name;

src/compile/nodes/Transition.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ export default class Transition extends Node {
1212
constructor(component: Component, parent, scope, info) {
1313
super(component, parent, scope, info);
1414

15-
component.warn_if_undefined(info, scope);
15+
component.warn_if_undefined(info.name, info, scope);
1616

1717
this.name = info.name;
1818
component.qualify(info.name);

src/compile/nodes/shared/Expression.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ export default class Expression {
149149
}
150150

151151
component.add_reference(name);
152-
component.warn_if_undefined(nodes[0], template_scope);
152+
component.warn_if_undefined(name, nodes[0], template_scope);
153153
}
154154

155155
this.skip();

src/compile/render-dom/wrappers/InlineComponent/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ export default class InlineComponentWrapper extends Wrapper {
6363
this.var = (
6464
this.node.name === 'svelte:self' ? renderer.component.name :
6565
this.node.name === 'svelte:component' ? 'switch_instance' :
66-
this.node.name
66+
sanitize(this.node.name)
6767
).toLowerCase();
6868

6969
if (this.node.children.length) {

test/runtime/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ describe("runtime", () => {
7575
compileOptions.accessors = 'accessors' in config ? config.accessors : true;
7676

7777
Object.keys(require.cache)
78-
.filter(x => x.endsWith(".svelte"))
78+
.filter(x => x.endsWith('.svelte'))
7979
.forEach(file => {
8080
delete require.cache[file];
8181
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<script>
2+
export let foo;
3+
</script>
4+
5+
<p>foo {foo}</p>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import * as path from 'path';
2+
3+
export default {
4+
props: {
5+
a: 1
6+
},
7+
8+
html: `
9+
<p>foo 1</p>
10+
`,
11+
12+
before_test() {
13+
delete require.cache[path.resolve(__dirname, 'components.js')];
14+
},
15+
16+
test({ assert, component, target }) {
17+
component.a = 2;
18+
assert.htmlEqual(target.innerHTML, `
19+
<p>foo 2</p>
20+
`);
21+
}
22+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import Foo from './Foo.svelte';
2+
3+
export default { Foo };
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
<script>
2+
import Components from './components.js';
3+
4+
export let a;
5+
</script>
6+
7+
<Components.Foo foo={a}/>

test/server-side-rendering/index.js

+5-4
Original file line numberDiff line numberDiff line change
@@ -96,10 +96,11 @@ describe("ssr", () => {
9696
(config.skip ? it.skip : config.solo ? it.only : it)(dir, () => {
9797
const cwd = path.resolve("test/runtime/samples", dir);
9898

99-
glob('**/*.svelte', { cwd: `test/runtime/samples/${dir}` }).forEach(file => {
100-
const resolved = require.resolve(`../runtime/samples/${dir}/${file}`);
101-
delete require.cache[resolved];
102-
});
99+
Object.keys(require.cache)
100+
.filter(x => x.endsWith('.svelte'))
101+
.forEach(file => {
102+
delete require.cache[file];
103+
});
103104

104105
const compileOptions = Object.assign({ sveltePath }, config.compileOptions, {
105106
generate: 'ssr'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<script>
2+
import * as NS from 'some-library';
3+
</script>
4+
5+
<NS.Foo/>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
[]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
export default {
2+
test(assert, vars) {
3+
assert.deepEqual(vars, [
4+
{
5+
name: 'NS',
6+
export_name: null,
7+
injected: false,
8+
module: false,
9+
mutated: false,
10+
reassigned: false,
11+
referenced: true,
12+
writable: false
13+
}
14+
]);
15+
}
16+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<script>
2+
import * as NS from 'some-library';
3+
</script>
4+
5+
<NS.Foo/>

0 commit comments

Comments
 (0)