diff --git a/build/generateExterns.js b/build/generateExterns.js index 136914bdec..322768b4cc 100755 --- a/build/generateExterns.js +++ b/build/generateExterns.js @@ -853,6 +853,50 @@ function generateExterns(names, inputPath) { }; } +/** + * Generate a typedef for the root shaka namespace based on exported symbols. + * + * @param {!Set} names + * @return {string} + */ +function generateShakaNamespaceTypedef(names) { + // Collect first-level members under shaka.* + const members = new Map(); + + for (const name of names) { + if (!name.startsWith('shaka.')) { + continue; + } + + const parts = name.split('.'); + if (parts.length < 2) { + continue; + } + + const member = parts[1]; + if (!members.has(member)) { + members.set(member, `shaka.${member}`); + } + } + + if (!members.size) { + return ''; + } + + const lines = Array.from(members.entries()) + .sort(([a], [b]) => a.localeCompare(b)) + .map(([key, value]) => ` * ${key}: typeof ${value},`); + + return ( + '/**\n' + + ' * @typedef {{\n' + + lines.join('\n') + '\n' + + ' * }}\n' + + ' * @suppress {duplicate}\n' + + ' */\n' + + 'var shaka;\n\n' + ); +} /** * Generate externs from exported code. @@ -930,6 +974,9 @@ function main(args) { // Get license header. const licenseHeader = fs.readFileSync(__dirname + '/license-header', 'utf-8'); + // Shaka type definition + const shakaTypedef = generateShakaNamespaceTypedef(names); + // Output generated externs, with an appropriate header. fs.writeFileSync(outputPath, licenseHeader + @@ -940,7 +987,7 @@ function main(args) { ' * errors with the namespace being declared both here and by\n' + ' * goog.provide in the library.\n' + ' */\n\n' + - namespaceDeclarations.join('') + '\n' + externs); + namespaceDeclarations.join('') + '\n' + shakaTypedef + externs); } diff --git a/demo/main.js b/demo/main.js index 409ff2bb1d..e9d1955fa8 100644 --- a/demo/main.js +++ b/demo/main.js @@ -1099,15 +1099,17 @@ shakaDemo.Main = class { uncompiledLink.title = 'requires a newer browser'; } - if (shaka.log) { + // shaka.log only exists in debug/uncompiled builds. + const log = shaka['log']; + if (log) { if (params.has('vv')) { - shaka.log.setLevel(shaka.log.Level.V2); + log.setLevel(log.Level.V2); } else if (params.has('v')) { - shaka.log.setLevel(shaka.log.Level.V1); + log.setLevel(log.Level.V1); } else if (params.has('debug')) { - shaka.log.setLevel(shaka.log.Level.DEBUG); + log.setLevel(log.Level.DEBUG); } else if (params.has('info')) { - shaka.log.setLevel(shaka.log.Level.INFO); + log.setLevel(log.Level.INFO); } } } @@ -1649,18 +1651,20 @@ shakaDemo.Main = class { // MAX_LOG_LEVEL is the default starting log level. Only save the log level // if it's different from this default. - if (shaka.log && shaka.log.currentLevel != shaka.log.MAX_LOG_LEVEL) { - switch (shaka.log.currentLevel) { - case shaka.log.Level.INFO: + // shaka.log only exists in debug/uncompiled builds. + const log = shaka['log']; + if (log && log.currentLevel != log.MAX_LOG_LEVEL) { + switch (log.currentLevel) { + case log.Level.INFO: params.push('info'); break; - case shaka.log.Level.DEBUG: + case log.Level.DEBUG: params.push('debug'); break; - case shaka.log.Level.V2: + case log.Level.V2: params.push('vv'); break; - case shaka.log.Level.V1: + case log.Level.V1: params.push('v'); break; }