Skip to content
This repository was archived by the owner on Mar 5, 2025. It is now read-only.

Commit 8114f0b

Browse files
authored
Merge pull request #18 from Polymer/dont-debug-log-by-default
Fix issue #17 with unsuppressable debug messages.
2 parents b4ac638 + 8fe4672 commit 8114f0b

8 files changed

+146
-95
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
1111
-->
1212

1313
## Unreleased
14-
14+
- Fixed issue where `nodeResolve()` did not properly effect the level of the provided `logger` where individual specifier transform logging was concerned.
1515
- Fix `Module '@babel/generator' resolves to an untyped module` error for TypeScript users.
1616
<!-- Add new unreleased items here -->
1717

src/koa-module-specifier-transform.ts

Lines changed: 81 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@ export type JSModuleSourceStrategy =
3737
export type JSParser = (js: string) => BabelNode;
3838
export type JSSerializer = (ast: BabelNode) => string;
3939

40-
export type SpecifierTransform = (baseURL: string, specifier: string) =>
41-
string|undefined;
40+
export type SpecifierTransform =
41+
(baseURL: string, specifier: string, logger: Logger) => string|undefined;
4242

4343
export type ModuleSpecifierTransformOptions = {
4444
logger?: Logger|false,
@@ -89,83 +89,87 @@ const defaultJSSerializer = (ast: BabelNode): string =>
8989
retainLines: true,
9090
}).code;
9191

92-
export const moduleSpecifierTransform = (specifierTransform: SpecifierTransform,
93-
options:
94-
ModuleSpecifierTransformOptions =
95-
{}): Koa.Middleware => {
96-
const logLevel = options.logLevel || 'warn';
97-
const logger = options.logger === false ?
98-
{} :
99-
leveledLogger(options.logger || console, logLevel);
100-
const htmlParser = options.htmlParser || defaultHTMLParser;
101-
const htmlSerializer = options.htmlSerializer || defaultHTMLSerializer;
102-
const jsParser = options.jsParser || defaultJSParser;
103-
const jsSerializer = options.jsSerializer || defaultJSSerializer;
104-
105-
return async (ctx: Koa.Context, next: Function) => {
106-
await next();
107-
108-
// When the response is not HTML or JavaScript, we have nothing to
109-
// transform.
110-
if (!(ctx.response.is('html') || ctx.response.is('js'))) {
111-
return;
112-
}
113-
114-
const body = await getBodyAsString(ctx.body);
115-
// When there's no body to return, there's nothing to transform.
116-
if (!body) {
117-
return;
118-
}
119-
120-
const url = ctx.request.url;
121-
122-
const htmlSourceStrategy =
123-
(html: string, transform: HTMLASTTransform): string =>
124-
htmlSerializer(transform(htmlParser(html)));
125-
126-
const jsSourceStrategy =
127-
(js: string, transform: JSModuleASTTransform): string =>
128-
jsSerializer(transform(jsParser(js)));
129-
130-
let specifierTransformCount = 0;
131-
const countedSpecifierTransform =
132-
(baseURL: string, specifier: string): undefined|string => {
133-
const result = specifierTransform(baseURL, specifier);
134-
if (result && result !== specifier) {
135-
++specifierTransformCount;
136-
}
137-
return result;
138-
};
139-
140-
try {
141-
if (ctx.response.is('html')) {
142-
ctx.body = preserveSurroundingWhitespace(
143-
body,
144-
htmlSourceStrategy(
92+
export const moduleSpecifierTransform =
93+
(specifierTransform: SpecifierTransform,
94+
options: ModuleSpecifierTransformOptions = {}): Koa.Middleware => {
95+
const logLevel = options.logLevel || 'warn';
96+
const logger = options.logger === false ?
97+
{} :
98+
leveledLogger(options.logger || console, logLevel);
99+
const htmlParser = options.htmlParser || defaultHTMLParser;
100+
const htmlSerializer = options.htmlSerializer || defaultHTMLSerializer;
101+
const jsParser = options.jsParser || defaultJSParser;
102+
const jsSerializer = options.jsSerializer || defaultJSSerializer;
103+
104+
return async (ctx: Koa.Context, next: Function) => {
105+
await next();
106+
107+
// When the response is not HTML or JavaScript, we have nothing to
108+
// transform.
109+
if (!(ctx.response.is('html') || ctx.response.is('js'))) {
110+
return;
111+
}
112+
113+
const body = await getBodyAsString(ctx.body);
114+
// When there's no body to return, there's nothing to transform.
115+
if (!body) {
116+
return;
117+
}
118+
119+
const url = ctx.request.url;
120+
121+
const htmlSourceStrategy =
122+
(html: string, transform: HTMLASTTransform): string =>
123+
htmlSerializer(transform(htmlParser(html)));
124+
125+
const jsSourceStrategy =
126+
(js: string, transform: JSModuleASTTransform): string =>
127+
jsSerializer(transform(jsParser(js)));
128+
129+
let specifierTransformCount = 0;
130+
const countedSpecifierTransform =
131+
(baseURL: string, specifier: string, logger: Logger): undefined|
132+
string => {
133+
const result = specifierTransform(baseURL, specifier, logger);
134+
if (result && result !== specifier) {
135+
++specifierTransformCount;
136+
}
137+
return result;
138+
};
139+
140+
try {
141+
if (ctx.response.is('html')) {
142+
ctx.body = preserveSurroundingWhitespace(
145143
body,
146-
(ast) => transformHTML(
147-
ast, url, countedSpecifierTransform, jsSourceStrategy)));
148-
} else if (ctx.response.is('js')) {
149-
ctx.body = preserveSurroundingWhitespace(
150-
body,
151-
jsSourceStrategy(
144+
htmlSourceStrategy(
145+
body,
146+
(ast) => transformHTML(
147+
ast,
148+
url,
149+
countedSpecifierTransform,
150+
jsSourceStrategy,
151+
logger)));
152+
} else if (ctx.response.is('js')) {
153+
ctx.body = preserveSurroundingWhitespace(
152154
body,
153-
(ast) =>
154-
transformJSModule(ast, url, countedSpecifierTransform)));
155-
}
156-
if (specifierTransformCount > 0) {
157-
logger.info &&
158-
logger.info(`Transformed ${
159-
specifierTransformCount} module specifier(s) in "${url}"`);
160-
}
161-
} catch (error) {
162-
logger.error &&
163-
logger.error(
164-
`Unable to transform module specifiers in "${url}" due to`,
165-
error);
166-
}
167-
};
168-
};
155+
jsSourceStrategy(
156+
body,
157+
(ast) => transformJSModule(
158+
ast, url, countedSpecifierTransform, logger)));
159+
}
160+
if (specifierTransformCount > 0) {
161+
logger.info &&
162+
logger.info(`Transformed ${
163+
specifierTransformCount} module specifier(s) in "${url}"`);
164+
}
165+
} catch (error) {
166+
logger.error &&
167+
logger.error(
168+
`Unable to transform module specifiers in "${url}" due to`,
169+
error);
170+
}
171+
};
172+
};
169173

170174
// TODO(usergenic): This should probably be published as a separate npm package.
171175
const getBodyAsString = async(body: Buffer|Stream|string): Promise<string> => {

src/koa-node-resolve.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import {parse as parseURL} from 'url';
1717

1818
import {moduleSpecifierTransform, ModuleSpecifierTransformOptions} from './koa-module-specifier-transform';
1919
import {prefixedLogger} from './support/logger';
20+
import {Logger} from './support/logger';
2021
import {noLeadingSlash} from './support/path-utils';
2122
import {resolveNodeSpecifier} from './support/resolve-node-specifier';
2223

@@ -38,11 +39,12 @@ export const nodeResolve =
3839
{} :
3940
prefixedLogger('[koa-node-resolve]', options.logger || console);
4041
return moduleSpecifierTransform(
41-
(baseURL: string, specifier: string) => resolveNodeSpecifier(
42-
resolvePath(
43-
resolvePath(options.root || '.'),
44-
noLeadingSlash(parseURL(baseURL).pathname || '/')),
45-
specifier,
46-
logger),
42+
(baseURL: string, specifier: string, logger: Logger) =>
43+
resolveNodeSpecifier(
44+
resolvePath(
45+
resolvePath(options.root || '.'),
46+
noLeadingSlash(parseURL(baseURL).pathname || '/')),
47+
specifier,
48+
logger),
4749
Object.assign({}, options, {logger}));
4850
};

src/test/koa-module-specifier-transform.test.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ test('moduleSpecifierTransform callback returns undefined to noop', async (t) =>
2424
createAndServe(
2525
{
2626
middleware: [moduleSpecifierTransform(
27-
(_baseURL, specifier) =>
27+
(_baseURL, specifier, _logger) =>
2828
specifier === 'y' ? './node_modules/y/index.js' : undefined,
2929
{logger, logLevel: 'info'})],
3030
routes: {
@@ -70,7 +70,8 @@ test('moduleSpecifierTransform will convert dynamic imports', async (t) => {
7070
createAndServe(
7171
{
7272
middleware: [moduleSpecifierTransform(
73-
(_baseURL, specifier) => `./node_modules/${specifier}/index.js`,
73+
(_baseURL, specifier, _logger) =>
74+
`./node_modules/${specifier}/index.js`,
7475
{logger, logLevel: 'info'})],
7576
routes: {
7677
'/my-module.js': `
@@ -114,7 +115,8 @@ test('moduleSpecifierTransform default parser configuration', async (t) => {
114115
createAndServe(
115116
{
116117
middleware: [moduleSpecifierTransform(
117-
(_baseURL, specifier) => `./node_modules/${specifier}/index.js`,
118+
(_baseURL, specifier, _logger) =>
119+
`./node_modules/${specifier}/index.js`,
118120
{logger})],
119121
routes: {
120122
'/my-module.js': `
@@ -150,7 +152,7 @@ test('moduleSpecifierTransform middleware logs errors', async (t) => {
150152
createAndServe(
151153
{
152154
middleware: [moduleSpecifierTransform(
153-
(_baseURL, _specifier) => undefined, {logger})],
155+
(_baseURL, _specifier, _logger) => undefined, {logger})],
154156
routes: {
155157
'/my-module.js': `
156158
this is a syntax error;
@@ -193,7 +195,7 @@ test('moduleSpecifierTransform middleware logs callback error', async (t) => {
193195
createAndServe(
194196
{
195197
middleware: [moduleSpecifierTransform(
196-
(_baseURL, _specifier) => {
198+
(_baseURL, _specifier, _logger) => {
197199
throw new Error('whoopsie daisy');
198200
},
199201
{logger})],

src/test/koa-node-resolve.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ test('nodeResolve middleware transforms resolvable specifiers', async (t) => {
2727
createAndServe(
2828
{
2929
middleware:
30-
[nodeResolve({root: fixturesPath, logger, logLevel: 'info'})],
30+
[nodeResolve({root: fixturesPath, logger, logLevel: 'debug'})],
3131
routes: {
3232
'/my-module.js': `import * as x from 'x';`,
3333
'/my-page.html': `

src/test/logger.test.ts

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
import test from 'tape';
2+
3+
import {leveledLogger, prefixedLogger} from '../support/logger';
4+
5+
import {testLogger} from './test-utils';
6+
7+
test('leveledLogger', (t) => {
8+
t.plan(4);
9+
const logger = testLogger();
10+
const wrappedLogger = leveledLogger(logger, 'warn');
11+
wrappedLogger.debug && wrappedLogger.debug('test debug');
12+
wrappedLogger.info && wrappedLogger.info('test info');
13+
wrappedLogger.warn && wrappedLogger.warn('test warn');
14+
wrappedLogger.error && wrappedLogger.error('test error');
15+
t.deepEqual(logger.debugs, []);
16+
t.deepEqual(logger.infos, []);
17+
t.deepEqual(logger.warns, [['test warn']]);
18+
t.deepEqual(logger.errors, [['test error']]);
19+
});
20+
21+
test('prefixedLogger', (t) => {
22+
t.plan(4);
23+
const logger = testLogger();
24+
const wrappedLogger = prefixedLogger('[yo]', logger);
25+
wrappedLogger.debug && wrappedLogger.debug('test debug');
26+
wrappedLogger.info && wrappedLogger.info('test info');
27+
wrappedLogger.warn && wrappedLogger.warn('test warn');
28+
wrappedLogger.error && wrappedLogger.error('test error');
29+
t.deepEqual(logger.debugs, [['[yo]', 'test debug']]);
30+
t.deepEqual(logger.infos, [['[yo]', 'test info']]);
31+
t.deepEqual(logger.warns, [['[yo]', 'test warn']]);
32+
t.deepEqual(logger.errors, [['[yo]', 'test error']]);
33+
});

src/transform-html.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {DefaultTreeNode} from 'parse5';
1515
import {resolve as resolveURL} from 'url';
1616

1717
import {JSModuleSourceStrategy, SpecifierTransform} from './koa-module-specifier-transform';
18+
import {Logger} from './support/logger';
1819
import {getAttr, getTextContent, nodeWalkAll, setTextContent} from './support/parse5-utils';
1920
import {preserveSurroundingWhitespace} from './support/string-utils';
2021
import {transformJSModule} from './transform-js-module';
@@ -23,15 +24,17 @@ export const transformHTML =
2324
(ast: DefaultTreeNode,
2425
url: string,
2526
specifierTransform: SpecifierTransform,
26-
jsModuleTransform: JSModuleSourceStrategy): DefaultTreeNode => {
27+
jsModuleTransform: JSModuleSourceStrategy,
28+
logger: Logger): DefaultTreeNode => {
2729
const baseURL = getBaseURL(ast, url);
2830
getInlineModuleScripts(ast).forEach((scriptTag) => {
2931
const originalJS = getTextContent(scriptTag);
3032
const transformedJS = preserveSurroundingWhitespace(
3133
originalJS,
3234
jsModuleTransform(
3335
originalJS,
34-
(ast) => transformJSModule(ast, baseURL, specifierTransform)));
36+
(ast) => transformJSModule(
37+
ast, baseURL, specifierTransform, logger)));
3538
setTextContent(scriptTag, transformedJS);
3639
});
3740
return ast;

src/transform-js-module.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,17 +14,23 @@
1414
import traverse from '@babel/traverse';
1515
import {NodePath} from '@babel/traverse';
1616
import {CallExpression, ExportAllDeclaration, ExportNamedDeclaration, ImportDeclaration, isImport, isStringLiteral, Node, StringLiteral} from '@babel/types';
17+
1718
import {SpecifierTransform} from './koa-module-specifier-transform';
19+
import {Logger} from './support/logger';
1820

1921
export const transformJSModule =
20-
(ast: Node, url: string, specifierTransform: SpecifierTransform): Node => {
22+
(ast: Node,
23+
url: string,
24+
specifierTransform: SpecifierTransform,
25+
logger: Logger): Node => {
2126
const importExportDeclaration = {
2227
enter(path: NodePath<ImportDeclaration|ExportAllDeclaration|
2328
ExportNamedDeclaration>) {
2429
if (path.node && path.node.source &&
2530
isStringLiteral(path.node.source)) {
2631
const specifier = path.node.source.value;
27-
const transformedSpecifier = specifierTransform(url, specifier);
32+
const transformedSpecifier =
33+
specifierTransform(url, specifier, logger);
2834
if (typeof transformedSpecifier === 'undefined') {
2935
return;
3036
}
@@ -43,7 +49,8 @@ export const transformJSModule =
4349
isStringLiteral(path.node.arguments[0])) {
4450
const argument = path.node.arguments[0] as StringLiteral;
4551
const specifier = argument.value;
46-
const transformedSpecifier = specifierTransform(url, specifier);
52+
const transformedSpecifier =
53+
specifierTransform(url, specifier, logger);
4754
if (typeof transformedSpecifier === 'undefined') {
4855
return;
4956
}

0 commit comments

Comments
 (0)