@storybook/angular
Version:
Storybook for Angular: Develop Angular components in isolation with hot reloading.
155 lines (154 loc) • 7.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const common_1 = require("@angular/common");
const core_1 = require("@angular/core");
const platform_browser_1 = require("@angular/platform-browser");
const animations_1 = require("@angular/platform-browser/animations");
const PropertyExtractor_1 = require("./PropertyExtractor");
const test_module_1 = require("../__testfixtures__/test.module");
const TEST_TOKEN = new core_1.InjectionToken('testToken');
const TestTokenProvider = { provide: TEST_TOKEN, useValue: 123 };
const TestService = (0, core_1.Injectable)()(class {
});
const TestComponent1 = (0, core_1.Component)({})(class {
});
const TestComponent2 = (0, core_1.Component)({})(class {
});
const StandaloneTestComponent = (0, core_1.Component)({ standalone: true })(class {
});
const TestDirective = (0, core_1.Directive)({})(class {
});
const StandaloneTestDirective = (0, core_1.Directive)({ standalone: true })(class {
});
const TestModuleWithDeclarations = (0, core_1.NgModule)({ declarations: [TestComponent1] })(class {
});
const TestModuleWithImportsAndProviders = (0, core_1.NgModule)({
imports: [TestModuleWithDeclarations],
providers: [TestTokenProvider],
})(class {
});
const analyzeMetadata = (metadata, component) => {
return new PropertyExtractor_1.PropertyExtractor(metadata, component);
};
const extractImports = (metadata, component) => {
const { imports } = new PropertyExtractor_1.PropertyExtractor(metadata, component);
return imports;
};
const extractDeclarations = (metadata, component) => {
const { declarations } = new PropertyExtractor_1.PropertyExtractor(metadata, component);
return declarations;
};
const extractProviders = (metadata, component) => {
const { providers } = new PropertyExtractor_1.PropertyExtractor(metadata, component);
return providers;
};
const extractApplicationProviders = (metadata, component) => {
const { applicationProviders } = new PropertyExtractor_1.PropertyExtractor(metadata, component);
return applicationProviders;
};
describe('PropertyExtractor', () => {
jest.spyOn(console, 'warn').mockImplementation(() => { });
describe('analyzeMetadata', () => {
it('should remove BrowserModule', () => {
const metadata = {
imports: [platform_browser_1.BrowserModule],
};
const { imports, providers, applicationProviders } = analyzeMetadata(metadata);
expect(imports.flat(Number.MAX_VALUE)).toEqual([common_1.CommonModule]);
expect(providers.flat(Number.MAX_VALUE)).toEqual([]);
expect(applicationProviders.flat(Number.MAX_VALUE)).toEqual([]);
});
it('should remove BrowserAnimationsModule and use its providers instead', () => {
const metadata = {
imports: [animations_1.BrowserAnimationsModule],
};
const { imports, providers, applicationProviders } = analyzeMetadata(metadata);
expect(imports.flat(Number.MAX_VALUE)).toEqual([common_1.CommonModule]);
expect(providers.flat(Number.MAX_VALUE)).toEqual([]);
expect(applicationProviders.flat(Number.MAX_VALUE)).toEqual((0, animations_1.provideAnimations)());
});
it('should remove NoopAnimationsModule and use its providers instead', () => {
const metadata = {
imports: [animations_1.NoopAnimationsModule],
};
const { imports, providers, applicationProviders } = analyzeMetadata(metadata);
expect(imports.flat(Number.MAX_VALUE)).toEqual([common_1.CommonModule]);
expect(providers.flat(Number.MAX_VALUE)).toEqual([]);
expect(applicationProviders.flat(Number.MAX_VALUE)).toEqual((0, animations_1.provideNoopAnimations)());
});
it('should remove Browser/Animations modules recursively', () => {
const metadata = {
imports: [animations_1.BrowserAnimationsModule, platform_browser_1.BrowserModule],
};
const { imports, providers, applicationProviders } = analyzeMetadata(metadata);
expect(imports.flat(Number.MAX_VALUE)).toEqual([common_1.CommonModule]);
expect(providers.flat(Number.MAX_VALUE)).toEqual([]);
expect(applicationProviders.flat(Number.MAX_VALUE)).toEqual((0, animations_1.provideAnimations)());
});
it('should not destructure Angular official module', () => {
const metadata = {
imports: [test_module_1.WithOfficialModule],
};
const { imports, providers, applicationProviders } = analyzeMetadata(metadata);
expect(imports.flat(Number.MAX_VALUE)).toEqual([common_1.CommonModule, test_module_1.WithOfficialModule]);
expect(providers.flat(Number.MAX_VALUE)).toEqual([]);
expect(applicationProviders.flat(Number.MAX_VALUE)).toEqual([]);
});
});
describe('extractImports', () => {
it('should return Angular official modules', () => {
const imports = extractImports({ imports: [TestModuleWithImportsAndProviders] });
expect(imports).toEqual([common_1.CommonModule, TestModuleWithImportsAndProviders]);
});
it('should return standalone components', () => {
const imports = extractImports({
imports: [TestModuleWithImportsAndProviders],
}, StandaloneTestComponent);
expect(imports).toEqual([
common_1.CommonModule,
TestModuleWithImportsAndProviders,
StandaloneTestComponent,
]);
});
it('should return standalone directives', () => {
const imports = extractImports({
imports: [TestModuleWithImportsAndProviders],
}, StandaloneTestDirective);
expect(imports).toEqual([
common_1.CommonModule,
TestModuleWithImportsAndProviders,
StandaloneTestDirective,
]);
});
});
describe('extractDeclarations', () => {
it('should return an array of declarations that contains `storyComponent`', () => {
const declarations = extractDeclarations({ declarations: [TestComponent1] }, TestComponent2);
expect(declarations).toEqual([TestComponent1, TestComponent2]);
});
});
describe('analyzeDecorators', () => {
it('isStandalone should be false', () => {
const { isStandalone } = PropertyExtractor_1.PropertyExtractor.analyzeDecorators(TestComponent1);
expect(isStandalone).toBe(false);
});
it('isStandalone should be true', () => {
const { isStandalone } = PropertyExtractor_1.PropertyExtractor.analyzeDecorators(StandaloneTestComponent);
expect(isStandalone).toBe(true);
});
});
describe('extractProviders', () => {
it('should return an array of providers', () => {
const providers = extractProviders({
providers: [TestService],
});
expect(providers).toEqual([TestService]);
});
it('should return an array of singletons extracted', () => {
const singeltons = extractApplicationProviders({
imports: [animations_1.BrowserAnimationsModule],
});
expect(singeltons).toEqual((0, animations_1.provideAnimations)());
});
});
});