diff --git a/packages/bazel/src/ng_module.bzl b/packages/bazel/src/ng_module.bzl index bcc9533c87..99c5b79dae 100644 --- a/packages/bazel/src/ng_module.bzl +++ b/packages/bazel/src/ng_module.bzl @@ -312,8 +312,11 @@ def ng_module_impl(ctx, ts_compile_actions): # and only under Bazel if hasattr(ctx.executable, "_index_bundler"): bundle_index_metadata = _write_bundle_index(ctx) - # note, not recursive - providers["angular"]["flat_module_metadata"] = depset(bundle_index_metadata) + providers["angular"]["flat_module_metadata"] = depset(bundle_index_metadata, + transitive = [ + d.angular.flat_module_metadata + for d in ctx.attr.deps + if hasattr(d, "angular")]) return providers diff --git a/packages/bazel/src/ng_package/ng_package.bzl b/packages/bazel/src/ng_package/ng_package.bzl index 9c2d89809b..83f6fff158 100644 --- a/packages/bazel/src/ng_package/ng_package.bzl +++ b/packages/bazel/src/ng_package/ng_package.bzl @@ -172,7 +172,9 @@ def _ng_package_impl(ctx): progress_message = "Angular Packaging: building npm package for %s" % ctx.label.name, mnemonic = "AngularPackage", inputs = esm5_sources.to_list() + - ctx.files.deps + + depset(transitive = [d.typescript.transitive_declarations + for d in ctx.attr.deps + if hasattr(d, "typescript")]).to_list() + ctx.files.srcs + other_inputs, outputs = [npm_package_directory], diff --git a/packages/bazel/src/ng_package/packager.ts b/packages/bazel/src/ng_package/packager.ts index 2b0ec0cd8a..4c5a3c89b6 100644 --- a/packages/bazel/src/ng_package/packager.ts +++ b/packages/bazel/src/ng_package/packager.ts @@ -45,23 +45,20 @@ function main(args: string[]): number { * @param content current file content */ function amendPackageJson(filePath: string, content: string) { - if (path.basename(filePath) === 'package.json') { - const parsedPackage = JSON.parse(content); - let nameParts = parsedPackage['name'].split('/'); - // for scoped packages, we don't care about the scope segment of the path - if (nameParts[0].startsWith('@')) nameParts = nameParts.splice(1); - let rel = Array(nameParts.length - 1).fill('..').join('/'); - if (!rel) { - rel = '.'; - } - const indexFile = nameParts[nameParts.length - 1]; - parsedPackage['main'] = `${rel}/bundles/${nameParts.join('-')}.umd.js`; - parsedPackage['module'] = `${rel}/esm5/${indexFile}.js`; - parsedPackage['es2015'] = `${rel}/esm2015/${indexFile}.js`; - parsedPackage['typings'] = `./${indexFile}.d.ts`; - return JSON.stringify(parsedPackage, null, 2); + const parsedPackage = JSON.parse(content); + let nameParts = parsedPackage['name'].split('/'); + // for scoped packages, we don't care about the scope segment of the path + if (nameParts[0].startsWith('@')) nameParts = nameParts.splice(1); + let rel = Array(nameParts.length - 1).fill('..').join('/'); + if (!rel) { + rel = '.'; } - return content; + const indexFile = nameParts[nameParts.length - 1]; + parsedPackage['main'] = `${rel}/bundles/${nameParts.join('-')}.umd.js`; + parsedPackage['module'] = `${rel}/esm5/${indexFile}.js`; + parsedPackage['es2015'] = `${rel}/esm2015/${indexFile}.js`; + parsedPackage['typings'] = `./${indexFile}.d.ts`; + return JSON.stringify(parsedPackage, null, 2); } function writeFesm(file: string, baseDir: string) { @@ -132,8 +129,12 @@ function main(args: string[]): number { for (const src of srcs) { let content = fs.readFileSync(src, {encoding: 'utf-8'}); content = replaceVersionPlaceholders(src, content); - content = amendPackageJson(src, content); - fs.writeFileSync(path.join(out, path.relative(srcDir, src)), content); + if (path.basename(src) === 'package.json') { + content = amendPackageJson(src, content); + } + const outputPath = path.join(out, path.relative(srcDir, src)); + shx.mkdir('-p', path.dirname(outputPath)); + fs.writeFileSync(outputPath, content); } allsrcs.filter(filter('.bundle_index.metadata.json')).forEach((f: string) => { diff --git a/packages/bazel/test/ng_package/example/BUILD.bazel b/packages/bazel/test/ng_package/example/BUILD.bazel index 0123582051..73b26c1562 100644 --- a/packages/bazel/test/ng_package/example/BUILD.bazel +++ b/packages/bazel/test/ng_package/example/BUILD.bazel @@ -17,9 +17,5 @@ ng_package( ], entry_point = "packages/bazel/test/ng_package/example/index.js", secondary_entry_points = ["secondary"], - deps = [ - ":example", - # FIXME(#22419) - "//packages/bazel/test/ng_package/example/secondary", - ], + deps = [":example"], ) diff --git a/packages/bazel/test/ng_package/example/index.ts b/packages/bazel/test/ng_package/example/index.ts index 397c6d1b9b..374f4edd11 100644 --- a/packages/bazel/test/ng_package/example/index.ts +++ b/packages/bazel/test/ng_package/example/index.ts @@ -1 +1,9 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + export * from './mymodule'; \ No newline at end of file diff --git a/packages/bazel/test/ng_package/example/mymodule.ts b/packages/bazel/test/ng_package/example/mymodule.ts index 5934a259f4..a34eb53014 100644 --- a/packages/bazel/test/ng_package/example/mymodule.ts +++ b/packages/bazel/test/ng_package/example/mymodule.ts @@ -1,4 +1,13 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + import {NgModule} from '@angular/core'; +import {a} from './secondary/secondarymodule'; @NgModule({}) export class MyModule { diff --git a/packages/bazel/test/ng_package/example/secondary/index.ts b/packages/bazel/test/ng_package/example/secondary/index.ts index 7f7c05e9f8..768e94c8b0 100644 --- a/packages/bazel/test/ng_package/example/secondary/index.ts +++ b/packages/bazel/test/ng_package/example/secondary/index.ts @@ -1 +1,9 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + export * from './secondarymodule'; diff --git a/packages/bazel/test/ng_package/example/secondary/secondarymodule.ts b/packages/bazel/test/ng_package/example/secondary/secondarymodule.ts index 66e03758cc..17e4c1a7ae 100644 --- a/packages/bazel/test/ng_package/example/secondary/secondarymodule.ts +++ b/packages/bazel/test/ng_package/example/secondary/secondarymodule.ts @@ -1,5 +1,15 @@ +/** + * @license + * Copyright Google Inc. All Rights Reserved. + * + * Use of this source code is governed by an MIT-style license that can be + * found in the LICENSE file at https://angular.io/license + */ + import {NgModule} from '@angular/core'; @NgModule({}) export class SecondaryModule { } + +export const a = 1; diff --git a/packages/bazel/test/ng_package/example_package.spec.ts b/packages/bazel/test/ng_package/example_package.spec.ts index c0233ce472..8692c1c7e9 100644 --- a/packages/bazel/test/ng_package/example_package.spec.ts +++ b/packages/bazel/test/ng_package/example_package.spec.ts @@ -41,6 +41,16 @@ describe('ng_package', () => { expect(shx.ls('-R', 'esm5').stdout.split('\n').filter(n => !!n).sort()).toEqual(expected); expect(shx.ls('-R', 'esm2015').stdout.split('\n').filter(n => !!n).sort()).toEqual(expected); }); + it('should have right secondary sources', () => { + const expected = [ + 'index.d.ts', + 'package.json', + 'secondary.d.ts', + 'secondary.metadata.json', + 'secondarymodule.d.ts', + ]; + expect(shx.ls('-R', 'secondary').stdout.split('\n').filter(n => !!n).sort()).toEqual(expected); + }); it('should have main entry point package.json properties set', () => { const packageJson = JSON.parse(fs.readFileSync('package.json', UTF8)); expect(packageJson['main']).toBe('./bundles/example.umd.js');