# Component Composition Text Interface
# Updates from 2023-06-01
* We changed the component import syntax from `component id` to `use kebab-name`, to better emphasise that the name is expected to be resolved rather than imported
* `new` was pushed into `expression`, and an alternate `expression` production case was added for aliasing paths
* Export syntax was reworked to no longer include an optional type, and instead now includes an optional `id` or `kabob-name` to use when exporting the path
## Grammar
```
id ::= /* from component model pr */
kabob-name ::= [a-z][a-zA-Z0-9-]*
package-name ::= /* just the package subset of id */
path ::= kabob-name { `[` (id | kabob-name) `]` } .
compose-document ::= {import} {statement} {export} .
import ::= `import` kabob-name `:` id .
component-import ::= `use` package-name [`as` kabob-name] `;` .
statement ::= `let` kabob-name `=` expression `;` .
expression ::= `new` kabob-name [arguments]
| path .
arguments ::= `{` argument {`,` argument} [`,`] `}` .
argument ::= [kabob-name `=`] expression .
export ::= `export` path [ `as` (id | kabob-name) ] `;` .
```
## Examples
### service.wit
```
default world endpoint {
export handler: self.handler
}
world middleware {
export incoming: self.handler
import downstream: self.handler
}
interface handler {
handle-request(req: request) -> result<response>
...
record request { ...
record response { ...
}
```
### Example 1
```
import downstream: service.handler;
use foo:middleware;
let service = new foo:middleware{
downstream: foo[bar:baz/handler]
};
export service as incoming;
```
## Example 2
```
import downstream: service.handler;
use auth:middleware as auth;
use cors:middleware as cors;
let downstream = new cors{new auth{downstream}};
export downstream;
```
# Original
## Grammar
```
compose-document ::= {import} {statement} {export} .
import ::= instance-import | component-import .
instance-import ::= `import` id `:` instance-ty `;` .
component-import ::= `component` id [`:` component-ty] `;` .
statement ::= `let` id `=` `new` expression `;` .
expression ::= id [arguments] .
arguments ::= `(` argument {`,` argument} [`,`] `)` .
argument ::= id [`:` expression] .
export ::= `export` expression [`as` instance-ty] `;` .
```
## Examples
### service.wit
```
default world endpoint {
export handler: self.handler
}
world middleware {
export incoming: self.handler
import downstream: self.handler
}
interface handler {
handle-request(req: request) -> result<response>
...
record request { ...
record response { ...
}
```
### Example 1
```
import downstream: service.handler;
// World derived from resolved concrete component
component middleware;
let service = new middleware[downstream];
export service as service.handler;
```
### Example 2
```
import downstream: service.handler;
component auth: service.middleware;
component cors: service.middleware;
let downstream = new auth[downstream];
let downstream = new cors[downstream];
export downstream as service.handler;
```