Skip to content

Commit

Permalink
refactor: use parseDependencyFile() of closure-deps@20190325
Browse files Browse the repository at this point in the history
  • Loading branch information
teppeis committed Mar 28, 2019
1 parent c25adb5 commit b465f7f
Show file tree
Hide file tree
Showing 3 changed files with 26 additions and 108 deletions.
42 changes: 11 additions & 31 deletions src/gendeps.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,8 @@ import {depFile, depGraph, parser} from 'google-closure-deps';
import path from 'path';
import recursive from 'recursive-readdir';
import util from 'util';
import vm from 'vm';
import {EntryConfig} from './entryconfig';
import {inputsUrlPath, googBaseUrlPath} from './urls';
import {googBaseUrlPath, inputsUrlPath} from './urls';

const depFileTextCache: Map<string, string> = new Map();
const dependenciesCache: Map<string, depGraph.Dependency[]> = new Map();
Expand Down Expand Up @@ -83,9 +82,7 @@ export async function getDependencies(
);
});
const results = flat(await Promise.all(parseResultPromises));
const errors = flat(results.map(r => r.errors));
const hasFatalError = errors.some(err => !!err.fatal);
if (hasFatalError) {
if (results.some(result => result.hasFatalError)) {
// TODO: create an custom error and send `errors`
throw new Error('Fatal parse error');
}
Expand All @@ -100,32 +97,15 @@ export async function getDependencies(
export async function getClosureLibraryDependencies(
closureLibraryDir: string
): Promise<depGraph.Dependency[]> {
const depsContent = await util.promisify(fs.readFile)(
path.join(closureLibraryDir, 'closure', 'goog', 'deps.js'),
'utf8'
);
const results: depGraph.Dependency[] = [];

vm.runInNewContext(depsContent, {
goog: {
addDependency(
relPath: string,
provides: string[],
requires: string[],
opt_loadFlags: boolean | {module?: string; lang?: string}
) {
const dep = addClosureDependency(
relPath,
provides,
requires,
opt_loadFlags,
closureLibraryDir
);
results.push(dep);
},
},
});
return results;
const googBasePath = path.join(closureLibraryDir, 'closure', 'goog', 'deps.js');
const depsContent = await util.promisify(fs.readFile)(googBasePath, 'utf8');
const result = parser.parseDependencyFile(depsContent, googBasePath);
if (result.errors.length > 0) {
throw new Error(`Fail to parse deps.js of Closure Library: ${result.errors.join(', ')}`);
}
const googBaseDir = path.dirname(googBasePath);
result.dependencies.forEach(dep => dep.setClosurePath(googBaseDir));
return result.dependencies;
}

/**
Expand Down
82 changes: 5 additions & 77 deletions test/gendeps.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,9 @@
import assert = require('assert');
import {depGraph} from 'google-closure-deps';
import path from 'path';
import {
generateDepFileText,
addClosureDependency,
getClosureLibraryDependencies,
getDependencies,
} from '../src/gendeps';
import {EntryConfig, PlovrMode} from '../src/entryconfig';
import {generateDepFileText, getClosureLibraryDependencies, getDependencies} from '../src/gendeps';

const closureLibraryDir = '/closure-library-test';
const fixturesBaseDir = path.join(__dirname, 'fixtures');

describe('gendeps', () => {
Expand Down Expand Up @@ -103,89 +97,23 @@ describe('gendeps', () => {
);
});
});
describe('addDependency()', () => {
it('closure module', () => {
const dep = addClosureDependency(
'async/animationdelay_test.js',
['goog.async.AnimationDelayTest'],
['goog.Promise', 'goog.Timer'],
{module: 'goog'},
closureLibraryDir
);
assert.deepEqual(dep, {
type: depGraph.DependencyType.CLOSURE_MODULE,
path: `${closureLibraryDir}/closure/goog/async/animationdelay_test.js`,
closureSymbols: ['goog.async.AnimationDelayTest'],
imports: [{symOrPath: 'goog.Promise', from: dep}, {symOrPath: 'goog.Timer', from: dep}],
language: 'es3',
});
});
it('closure script', () => {
const dep = addClosureDependency(
'dom/textrange.js',
['goog.dom.TextRange'],
['goog.array', 'goog.dom'],
{},
closureLibraryDir
);
assert.deepEqual(dep, {
type: depGraph.DependencyType.CLOSURE_PROVIDE,
path: `${closureLibraryDir}/closure/goog/dom/textrange.js`,
closureSymbols: ['goog.dom.TextRange'],
imports: [{symOrPath: 'goog.array', from: dep}, {symOrPath: 'goog.dom', from: dep}],
language: 'es3',
});
});
it('lang', () => {
const dep = addClosureDependency(
'events/keys.js',
['goog.events.Keys'],
[],
{
lang: 'es5',
},
closureLibraryDir
);
assert.deepEqual(dep, {
type: depGraph.DependencyType.CLOSURE_PROVIDE,
path: `${closureLibraryDir}/closure/goog/events/keys.js`,
closureSymbols: ['goog.events.Keys'],
imports: [],
language: 'es5',
});
});
it('third_party', () => {
const dep = addClosureDependency(
'../../third_party/closure/goog/dojo/dom/query.js',
['goog.dom.query'],
[],
{},
closureLibraryDir
);
assert.deepEqual(dep, {
type: depGraph.DependencyType.CLOSURE_PROVIDE,
path: `${closureLibraryDir}/third_party/closure/goog/dojo/dom/query.js`,
closureSymbols: ['goog.dom.query'],
imports: [],
language: 'es3',
});
});
});
describe('getClosureLibraryDependencies()', () => {
it('loads deps of closure-library from the deps.js', async () => {
const closureLib1 = path.resolve(fixturesBaseDir, 'closure-lib1');
const deps = await getClosureLibraryDependencies(closureLib1);
assert.deepEqual(deps, [
{
type: depGraph.DependencyType.CLOSURE_PROVIDE,
path: `${closureLib1}/closure/goog/a11y/aria/aria.js`,
closureRelativePath: 'a11y/aria/aria.js',
path_: `${closureLib1}/closure/goog/a11y/aria/aria.js`,
closureSymbols: ['goog.a11y.aria'],
imports: [{symOrPath: 'goog.a11y.aria.Role', from: deps[0]}],
language: 'es3',
},
{
type: depGraph.DependencyType.CLOSURE_MODULE,
path: `${closureLib1}/closure/goog/collections/sets.js`,
closureRelativePath: 'collections/sets.js',
path_: `${closureLib1}/closure/goog/collections/sets.js`,
closureSymbols: ['goog.collections.sets'],
imports: [],
language: 'es6',
Expand Down
10 changes: 10 additions & 0 deletions types/google-closure-deps.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,16 @@ export namespace depGraph {
imports: Import[],
language?: string
);

/**
* Updates the path to Closure Library for this file. This is useful for
* ParsedDependency, which cannot know the full path of a file on until it
* knows the path to Closure Library, as the path in the goog.addDependency
* call is relative from Closure Library.
*/
setClosurePath(path: string): void;

isParsedFromDepsFile(): boolean;
}

/**
Expand Down

0 comments on commit b465f7f

Please sign in to comment.