Skip to content
This repository has been archived by the owner on Oct 29, 2024. It is now read-only.

Commit

Permalink
[FEAT] Implement Glimmer Components RFC
Browse files Browse the repository at this point in the history
This PR turns the `@glimmer/component` package into an Ember addon,
allowing it to work in both Ember.js and Glimmer.js applications. This
works by keeping the `GlimmerComponent` class definition in a separate
file that then gets imported by the Glimmer.js implementation in `src`,
and is included in the Ember.js implementation via `addon/index.js`.
  • Loading branch information
Chris Garrett committed Feb 9, 2019
1 parent ee4090d commit 5ec0400
Show file tree
Hide file tree
Showing 86 changed files with 6,293 additions and 868 deletions.
24 changes: 24 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,27 @@
dist

/.node

# See https://help.github.com/ignore-files/ for more about ignoring files.

# compiled output
/dist/
/tmp/

# dependencies
**/node_modules/**
**/tmp/**

# misc
/.sass-cache
/connect.lock
/coverage/
/libpeerconnection.log
/npm-debug.log*
/testem.log
/yarn-error.log

# ember-try
**/.node_modules.ember-try/**
**/bower.json.ember-try
**/package.json.ember-try
31 changes: 26 additions & 5 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,23 +1,44 @@
language: node_js
node_js:
- "8"
- '8'

env:
- MOZ_HEADLESS=1

cache: yarn
cache:
yarn: true

addons:
chrome: stable
firefox: latest

before_install:
- "curl -o- -L https://yarnpkg.com/install.sh | bash -s --"
- 'curl -o- -L https://yarnpkg.com/install.sh | bash -s --'
- export PATH="$HOME/.yarn/bin:$PATH"

install:
- yarn install --non-interactive

script:
- yarn tslint
- yarn test
# Usually, it's ok to finish the test scenario without reverting
# to the addon's original dependency state, skipping "cleanup".
- yarn test:ember $EMBER_TRY_SCENARIO --skip-cleanup

jobs:
fail_fast: true

include:
- stage: Glimmer Tests
name: Package Tests
script: yarn test
- name: Lint
script: yarn tslint

- stage: Ember Tests
name: Node
script: yarn test:ember:node
- env: EMBER_TRY_SCENARIO=ember-default
- env: EMBER_TRY_SCENARIO=ember-release
- env: EMBER_TRY_SCENARIO=ember-beta
- env: EMBER_TRY_SCENARIO=ember-canary
- env: EMBER_TRY_SCENARIO=ember-lts-3.4
3 changes: 3 additions & 0 deletions .watchmanconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"ignore_dirs": ["tmp", "dist"]
}
24 changes: 13 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ packages, so this meta-repo exists to help you find what you're looking for.

## Resources

* [Guides](https://glimmerjs.com/guides)
* [API Docs](https://glimmerjs.com/api/)
* [Glimmer Playground](https://glimmer-playground.netlify.com)
- [Guides](https://glimmerjs.com/guides)
- [API Docs](https://glimmerjs.com/api/)
- [Glimmer Playground](https://glimmer-playground.netlify.com)

## Packages

Expand All @@ -17,22 +17,24 @@ Glimmer.js is the developer-facing API on top of the low-level [Glimmer VM](http

These packages are imported and used by Glimmer developers directly.

* [`@glimmer/application`] - user-friendly wrapper around the Glimmer VM environment
* [`@glimmer/component`] - defines the Glimmer component base class and component lifecycle
* [`@glimmer/web-component`] - addon for mounting Glimmer components as Web Components
* [`@glimmer/application-test-helpers`] - helpers for testing Glimmer components
- [`@glimmer/application`] - user-friendly wrapper around the Glimmer VM environment
- [`@glimmer/component`] - defines the Glimmer component base class and component lifecycle
- [`@glimmer/tracking`] - defines the Glimmer property change tracking system
- [`@glimmer/web-component`] - addon for mounting Glimmer components as Web Components
- [`@glimmer/application-test-helpers`] - helpers for testing Glimmer components

[`@glimmer/application`]: https://github.com/glimmerjs/glimmer.js/tree/master/packages/%40glimmer/application
[`@glimmer/component`]: https://github.com/glimmerjs/glimmer.js/tree/master/packages/%40glimmer/component
[`@glimmer/tracking`]: https://github.com/glimmerjs/glimmer.js/tree/master/packages/%40glimmer/tracking
[`@glimmer/web-component`]: https://github.com/glimmerjs/glimmer-web-component
[`@glimmer/application-test-helpers`]: https://github.com/glimmerjs/glimmer.js/tree/master/packages/%40glimmer/application-test-helpers

### Internals

These packages are used internally by Glimmer but may be useful for more advanced users.

* [`@glimmer/di`] - lightweight dependency injection library used by `@glimmer/application`
* [`@glimmer/resolver`] - resolver used by `@glimmer/application` to look up component modules
- [`@glimmer/di`] - lightweight dependency injection library used by `@glimmer/application`
- [`@glimmer/resolver`] - resolver used by `@glimmer/application` to look up component modules

[`@glimmer/di`]: https://github.com/glimmerjs/glimmer-di
[`@glimmer/resolver`]: https://github.com/glimmerjs/glimmer-resolver
Expand All @@ -42,8 +44,8 @@ These packages are used internally by Glimmer but may be useful for more advance
These packages are used for building Glimmer apps, and aren't intended to run in
the user's browser.

* [`@glimmer/application-pipeline`] - Broccoli-based build pipeline for Glimmer apps
* [`@glimmer/resolution-map-builder`] - utilities for building the resolution map used by `@glimmer-resolver`
- [`@glimmer/application-pipeline`] - Broccoli-based build pipeline for Glimmer apps
- [`@glimmer/resolution-map-builder`] - utilities for building the resolution map used by `@glimmer-resolver`

[`@glimmer/application-pipeline`]: https://github.com/glimmerjs/glimmer-application-pipeline
[`@glimmer/resolution-map-builder`]: https://github.com/glimmerjs/resolution-map-builder
23 changes: 6 additions & 17 deletions build/broccoli/build-packages.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,10 @@ module.exports = function buildPackages(es2017, matrix) {
let es5 = transpileToES5(es2017);
let targets = { es5, es2017 };

// We ignore the `@glimmer/blueprint` tree as it is ember-only, and is picked
// up later on in the build process.
let packages = project.packages
.filter(pkg => pkg.name !== '@glimmer/blueprint')
.map(buildPackage);

packages = flatten(packages);
Expand All @@ -32,24 +35,10 @@ module.exports = function buildPackages(es2017, matrix) {
return packages;

function buildPackage(pkg) {
let pkgName = pkg.name;
let builds;

// The blueprint package is structured differently from other packages, so
// we just copy it over verbatim to the build output.
if (pkgName === '@glimmer/blueprint') {
builds = [funnel(`packages/${pkgName}`, {
destDir: `${pkgName}/`,
exclude: ['**/node_modules/**']
})];
} else {
builds = buildMatrix(pkgName, matrix);
}

return [
writePackageJSON(pkgName),
writeLicense(`${pkgName}/LICENSE`),
...builds
writePackageJSON(pkg.name),
writeLicense(`${pkg.name}/LICENSE`),
...buildMatrix(pkg.name, matrix)
];
}

Expand Down
25 changes: 14 additions & 11 deletions build/broccoli/optimize.js
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
'use strict';

const babel = require('broccoli-babel-transpiler');
const stripGlimmerUtils = require('babel-plugin-strip-glimmer-utils');
const debugMacros = require('babel-plugin-debug-macros').default;

/**
* Optimizes out Glimmer utility functions and strips debug code with a set of
Expand All @@ -12,17 +10,22 @@ module.exports = function(jsTree) {
let isProduction = process.env.EMBER_ENV === 'production';

let plugins = [
[debugMacros, {
envFlags: {
source: '@glimmer/env',
flags: {
DEBUG: !isProduction,
CI: !!process.env.CI
}
},
[require.resolve('babel-plugin-debug-macros'), {
debugTools: {
isDebug: !isProduction,
source: '@glimmer/debug'
},

flags: [
{
source: '@glimmer/env',
flags: {
DEBUG: !isProduction,
CI: !!process.env.CI
}
}
],

externalizeHelpers: {
module: true
}
Expand All @@ -32,7 +35,7 @@ module.exports = function(jsTree) {
if (isProduction) {
plugins = [
...plugins,
[stripGlimmerUtils, {
[require.resolve('babel-plugin-strip-glimmer-utils'), {
bindings: ['expect', 'unwrap'],
source: '@glimmer/util'
}]
Expand Down
15 changes: 14 additions & 1 deletion ember-cli-build.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,22 @@ module.exports = function(_options) {
];
}

// Include any Ember Addon files, without src (Glimmer files)
let emberTree = funnel('packages/', {
exclude: [
'**/node_modules',
'**/tmp',
'**/types',
'**/dist',
'**/src',
'**/test',
'*/*/index.ts'
]
});

// Third, build our module/ES combinations for each package, and their tests.
let packagesTree = buildPackages(jsTree, matrix);
let testsTree = buildTests(tsTree, jsTree, packagesTree);

return merge([packagesTree, testsTree]);
return merge([packagesTree, testsTree, emberTree], { overwrite: true });
}
8 changes: 5 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,16 +9,18 @@
"start": "ember serve",
"test": "ember test && ember test --env production",
"test:node": "bin/run-node-tests.js",
"problems": "tsc -p tsconfig.json --noEmit",
"tslint": "tslint --project tsconfig.json"
"test:ember": "yarn workspace @glimmer/component ember try:one",
"test:ember:node": "yarn workspace @glimmer/component test:node",
"tslint": "tslint --project tsconfig.json",
"problems": "tsc -p tsconfig.json --noEmit"
},
"workspaces": [
"packages/@glimmer/*"
],
"devDependencies": {
"@types/qunit": "^2.0.31",
"amd-name-resolver": "^1.0.0",
"babel-plugin-debug-macros": "^0.1.11",
"babel-plugin-debug-macros": "^0.2.0",
"babel-plugin-strip-glimmer-utils": "^0.1.1",
"babel-plugin-transform-es2015-modules-amd": "^6.24.1",
"babel-plugin-transform-proto-to-assign": "^6.23.0",
Expand Down
13 changes: 6 additions & 7 deletions packages/@glimmer/application-test-helpers/src/app-builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import Resolver, {
ResolverConfiguration
} from "@glimmer/resolver";
import { Dict, ModuleLocator, TemplateLocator } from "@glimmer/interfaces";
import { FactoryDefinition } from "@glimmer/di";
import defaultResolverConfiguration from "./default-resolver-configuration";
import { precompile } from "./compiler";
import Application, {
Expand Down Expand Up @@ -36,7 +35,7 @@ export interface AppBuilderOptions<T> {
document?: SimpleDocument;
}

export interface ComponentFactory extends FactoryDefinition<unknown> {}
export interface ComponentFactory {}

export class TestApplication extends Application {
rootElement: Element;
Expand Down Expand Up @@ -106,7 +105,7 @@ export class AppBuilder<T extends TestApplication> {
this.options.resolverConfiguration || defaultResolverConfiguration;
resolverConfiguration.app = resolverConfiguration.app || {
name: this.rootName,
rootName: this.rootName
rootName: this.rootName,
};

let registry = new BasicModuleRegistry(this.modules);
Expand Down Expand Up @@ -152,7 +151,7 @@ export class AppBuilder<T extends TestApplication> {
meta[locator.module] = {
v: vmHandle,
h: handle,
table: template.symbolTable
table: template.symbolTable,
};
});

Expand All @@ -176,8 +175,8 @@ export class AppBuilder<T extends TestApplication> {
meta,
heap: {
table: heap.table,
handle: heap.handle
}
handle: heap.handle,
},
};

return new BytecodeLoader({ bytecode, data });
Expand Down Expand Up @@ -209,7 +208,7 @@ export class AppBuilder<T extends TestApplication> {
loader,
renderer,
rootName: this.rootName,
document: this.options.document
document: this.options.document,
});

let rootElement = doc.createElement("div");
Expand Down
Loading

0 comments on commit 5ec0400

Please sign in to comment.