Skip to content

Commit

Permalink
Merge pull request #15987 from emberjs/update-glimmer-linking
Browse files Browse the repository at this point in the history
Make yarn link of glimmer easier.
  • Loading branch information
krisselden authored Dec 15, 2017
2 parents 82ec375 + 4bcc6c7 commit 05b1ab4
Show file tree
Hide file tree
Showing 5 changed files with 124 additions and 82 deletions.
31 changes: 5 additions & 26 deletions bin/yarn-link-glimmer.js
Original file line number Diff line number Diff line change
@@ -1,31 +1,10 @@
#!/usr/bin/env node
"use strict";
const child_process = require("child_process");
const glimmerDeps = [];

addGlimmerPackageDeps(require("../package"), true);
const yarnConfig = JSON.parse(JSON.parse(require('child_process').execSync('yarn --json config current', { encoding: 'utf8' })).data);
const linkedModules = yarnConfig.linkedModules.filter((m) => m.startsWith('@glimmer/'));

function linkGlimmerDep(glimmerDep) {
if (glimmerDeps.indexOf(glimmerDep) === -1) {
glimmerDeps.push(glimmerDep);
console.log(glimmerDep);
child_process.execSync(`yarn link "${glimmerDep}"`);
addGlimmerPackageDeps(require(`${glimmerDep}/package`), false);
}
}

function addGlimmerDeps(dependencies) {
if (!dependencies) return;
Object.keys(dependencies).forEach(dep => {
if (dep.lastIndexOf("@glimmer", 0) === 0) {
linkGlimmerDep(dep);
}
});
}

function addGlimmerPackageDeps(packageJson, dev) {
addGlimmerDeps(packageJson["dependencies"]);
if (dev) {
addGlimmerDeps(packageJson["devDependencies"]);
}
}
linkedModules.forEach(mod => {
child_process.execSync(`yarn link "${mod}"`);
});
16 changes: 3 additions & 13 deletions broccoli/find-lib.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,9 @@
/* eslint-env node */
"use strict";

const path = require('path');
const findPackage = require('./find-package');

module.exports = function findLib(name, libPath) {
let packagePath = path.join(name, 'package');
let packageRoot = path.dirname(require.resolve(packagePath));

libPath = libPath || getLibPath(packagePath);

return path.resolve(packageRoot, libPath);
let pkg = findPackage(name);
return pkg.resolve(libPath) || (pkg.module || pkg.main).dir;
};

function getLibPath(packagePath) {
let packageJson = require(packagePath);

return path.dirname(packageJson['module'] || packageJson['main']);
}
52 changes: 52 additions & 0 deletions broccoli/find-package.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
"use strict";
const path = require('path');

const cache = new Map();

module.exports = function findPackage(name) {
let info = cache.get(name);
if (info === undefined) {
info = new PackageInfo(name);
cache.set(name, info);
}
return info;
};

class PackageInfo {
constructor(name) {
this.name = name;
let pkgName = name + '/package';
let config = require(pkgName);
this.config = config;
this.dir = path.dirname(require.resolve(pkgName));
}

get main() {
return this.parseResolve(this.config.main);
}

get module() {
return this.parseResolve(this.config.module);
}

get dependencies() {
return this.config.dependencies && Object.keys(this.config.dependencies);
}

resolve(relative) {
if (!relative) return;
return path.resolve(this.dir, relative);
}

parseResolve(relative) {
if (!relative) return;
let resolved = this.resolve(relative);
let parsed = path.parse(resolved);
return {
dir: parsed.dir,
base: parsed.base,
path: resolved,
};
}

}
73 changes: 59 additions & 14 deletions broccoli/packages.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
'use strict';
/* eslint-env node */
const { readFileSync } = require('fs');
const { readFileSync, existsSync } = require('fs');
const path = require('path');
const Rollup = require('broccoli-rollup');
const Funnel = require('broccoli-funnel');
const filterTypeScript = require('broccoli-typescript-compiler').filterTypeScript;
const BroccoliDebug = require('broccoli-debug');
const findLib = require('./find-lib');
const findPackage = require('./find-package');
const funnelLib = require('./funnel-lib');
const { VERSION } = require('./version');
const WriteFile = require('broccoli-file-creator');
Expand Down Expand Up @@ -169,7 +170,6 @@ module.exports.routeRecognizerES = function _routeRecognizerES() {
});
}


module.exports.simpleHTMLTokenizerES = function _simpleHTMLTokenizerES() {
return new Rollup(findLib('simple-html-tokenizer', 'dist/es6'), {
annotation: 'simple-html-tokenizer es',
Expand Down Expand Up @@ -207,19 +207,64 @@ module.exports.emberPkgES = function _emberPkgES(name, rollup, externs) {
});
}

module.exports.glimmerPkgES = function _glimmerPkgES(name, externs = []) {
return new Rollup(findLib(name, 'dist/modules/es5'), {
annotation: `${name} es`,
rollup: {
input: 'index.js',
external: externs,
output: {
file: `${name}.js`,
format: 'es',
exports: 'named'
}
const glimmerTrees = new Map();

function rollupGlimmerPackage(pkg, deps) {
let name = pkg.name;
let tree = glimmerTrees.get(name);
if (tree === undefined) {
tree = new Rollup(pkg.module.dir, {
rollup: {
input: pkg.module.base,
external: pkg.dependencies,
output: {
file: name + '.js',
format: 'es'
},
},
annotation: name
});
glimmerTrees.set(name, tree);
}
return tree;
}

module.exports.glimmerPkgES = function glimmerPkgES(name) {
return rollupGlimmerPackage(findPackage(name));
}

module.exports.glimmerTrees = function glimmerTrees(entries) {
let seen = new Set();

// glimmer runtime has dependency on this even though it is only in tests
seen.add('@glimmer/object');
seen.add('@glimmer/object-reference');

let trees = [];
let queue = Array.isArray(entries) ? entries.slice() : [ entries ];
let name;
while ((name = queue.pop()) !== undefined) {
if (seen.has(name)) {
continue;
}
});
seen.add(name);

if (!name.startsWith('@glimmer/')) {
continue;
}

let pkg = findPackage(name);

if (pkg.module && existsSync(pkg.module.path)) {
trees.push(rollupGlimmerPackage(pkg));
}

let dependencies = pkg.dependencies;
if (dependencies) {
queue.push(...dependencies);
}
}
return trees;
}

module.exports.emberTestsES = function _emberTestES(name) {
Expand Down
34 changes: 5 additions & 29 deletions ember-cli-build.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ const {
dagES,
routeRecognizerES,
emberPkgES,
glimmerPkgES,
glimmerTrees,
emberTestsES,
nodeModuleUtils,
emberVersionES,
Expand All @@ -57,17 +57,7 @@ module.exports = function(options) {
let emberDebugES5 = toES5(emberDebug, { annotation: 'ember-debug' });
let emberTemplateCompiler = emberPkgES('ember-template-compiler');
let emberTemplateCompilerES5 = toES5(emberTemplateCompiler, { annotation: 'ember-template-compiler' });
let glimmerSyntax = toES5(
glimmerPkgES('@glimmer/syntax', ['@glimmer/util', 'handlebars', 'simple-html-tokenizer']),
{ annotation: '@glimmer/syntax' }
);
let glimmerCompiler = toES5(
glimmerPkgES('@glimmer/compiler', ['@glimmer/util', '@glimmer/wire-format', '@glimmer/syntax']),
{ annotation: '@glimmer/compiler' }
);
let glimmerReference = toES5(glimmerPkgES('@glimmer/reference', ['@glimmer/util']));
let glimmerUtil = toES5(glimmerPkgES('@glimmer/util'));
let glimmerWireFormat = toES5(glimmerPkgES('@glimmer/wire-format', ['@glimmer/util']));

let babelDebugHelpersES5 = toES5(babelHelpers('debug'), { annotation: 'babel helpers debug' });
let inlineParser = toES5(handlebarsES(), { annotation: 'handlebars' });
let tokenizer = toES5(simpleHTMLTokenizerES(), { annotation: 'tokenizer' });
Expand Down Expand Up @@ -136,9 +126,6 @@ module.exports = function(options) {
emberMetalES5,
emberConsoleES5,
emberDebugES5,
glimmerReference,
glimmerUtil,
glimmerWireFormat,
backburner,
version,
license,
Expand Down Expand Up @@ -195,11 +182,8 @@ module.exports = function(options) {
emberConsoleES5,
emberTemplateCompilerES5,
emberDebugES5,
glimmerSyntax,
glimmerCompiler,
glimmerReference,
glimmerUtil,
glimmerWireFormat,
// metal depends on @glimmer/reference
...glimmerTrees(['@glimmer/compiler', '@glimmer/reference']).map(toES5),
backburner,
debugFeatures,
tokenizer,
Expand Down Expand Up @@ -229,9 +213,6 @@ module.exports = function(options) {
});

let depsProd = [
glimmerReference,
glimmerUtil,
glimmerWireFormat,
backburner,
rsvp
].map(stripForProd);
Expand Down Expand Up @@ -342,12 +323,7 @@ function dependenciesES6() {
dagES(),
routerES(),
routeRecognizerES(),
glimmerPkgES('@glimmer/node', ['@glimmer/runtime']),
glimmerPkgES('@glimmer/runtime', [
'@glimmer/util',
'@glimmer/reference',
'@glimmer/wire-format'
])
...glimmerTrees(['@glimmer/node', '@glimmer/runtime']),
];
}

Expand Down

0 comments on commit 05b1ab4

Please sign in to comment.