Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Angular stories creation: TypeError: Cannot read property 'getChildren' of undefined #2521

Closed
4 tasks done
Tom4U opened this issue Feb 20, 2020 · 1 comment · Fixed by #2527
Closed
4 tasks done

Angular stories creation: TypeError: Cannot read property 'getChildren' of undefined #2521

Tom4U opened this issue Feb 20, 2020 · 1 comment · Fixed by #2527
Labels
outdated scope: storybook Issues related to Storybook support in Nx type: bug

Comments

@Tom4U
Copy link

Tom4U commented Feb 20, 2020

  • I am running the latest version
  • I checked the documentation (nx.dev) and found no answer
  • I checked to make sure that this issue has not already been filed
  • I'm reporting the issue to the correct repository (not related to React, Angular or any dependency)

Expected Behavior

When running nx g storybook-configuration or nx stories stories should be created for components.

Current Behavior

An error is thrown: Could not generate a story for MyComponent. Error: TypeError: Cannot read property 'getChildren' of undefined

Failure Information (for bugs)

I could narrow it down to the file angular/src/schematics/stories.js inside the function createAllStories. Here you are using a getChildren / find chain without checking, if the previous find is returning anything.
In my case it happened with namedImports. find didn't return anything on a statement that seems to belong to my Ngrx-Facade and its import statement import * as fromHeader from './header.reducer';.
At the time where namedImports is undefined I have the following state for the variables:

statement

NodeObject {
  pos: 242,
  end: 304,
  flags: 0,
  modifierFlagsCache: 0,
  transformFlags: 0,
  parent: SourceFileObject {
    pos: 0,
    end: 653,
    flags: 0,
    modifierFlagsCache: 0,
    transformFlags: 0,
    parent: undefined,
    kind: 288,
    text: "import { CommonModule } from '@angular/common';\n" +
      "import { NgModule } from '@angular/core';\n" +
      "import { EffectsModule } from '@ngrx/effects';\n" +
      "import { StoreModule } from '@ngrx/store';\n" +
      '\n' +
      "import { HeaderFacade } from './+state/header/header.facade';\n" +
      "import * as fromHeader from './+state/header/header.reducer';\n" +
      "import { HeaderTitleComponent } from './header/header-title/header-title.component';\n" +
      '\n' +
      '@NgModule({\n' +
      '  imports: [\n' +
      '    CommonModule,\n' +
      '    StoreModule.forFeature(fromHeader.HEADER_FEATURE_KEY, fromHeader.reducer),\n' +
      '    EffectsModule.forFeature([])\n' +
      '  ],\n' +
      '  declarations: [HeaderTitleComponent],\n' +
      '  providers: [HeaderFacade]\n' +
      '})\n' +
      'export class UiCommonModule {}\n',
    bindDiagnostics: [],
    bindSuggestionDiagnostics: undefined,
    languageVersion: 99,
    fileName: 'libs/ui/common/src/lib/ui-common.module.ts',
    languageVariant: 0,
    isDeclarationFile: false,
    scriptKind: 3,
    pragmas: Map {},
    checkJsDirective: undefined,
    referencedFiles: [],
    typeReferenceDirectives: [],
    libReferenceDirectives: [],
    amdDependencies: [],
    hasNoDefaultLib: false,
    statements: [
      [NodeObject], [NodeObject],
      [NodeObject], [NodeObject],
      [NodeObject], [Circular],
      [NodeObject], [NodeObject],
      pos: 0,       end: 652
    ],
    endOfFileToken: TokenObject {
      pos: 652,
      end: 653,
      flags: 0,
      modifierFlagsCache: 0,
      transformFlags: 0,
      parent: [Circular],
      kind: 1
    },
    externalModuleIndicator: NodeObject {
      pos: 0,
      end: 47,
      flags: 0,
      modifierFlagsCache: 536870912,
      transformFlags: 0,
      parent: [Circular],
      kind: 253,
      decorators: undefined,
      modifiers: undefined,
      importClause: [NodeObject],
      moduleSpecifier: [TokenObject],
      _children: [Array]
    },
    nodeCount: 109,
    identifierCount: 38,
    identifiers: Map {
      'CommonModule' => 'CommonModule',
      '@angular/common' => '@angular/common',
      'NgModule' => 'NgModule',
      '@angular/core' => '@angular/core',
      'EffectsModule' => 'EffectsModule',
      '@ngrx/effects' => '@ngrx/effects',
      'StoreModule' => 'StoreModule',
      '@ngrx/store' => '@ngrx/store',
      'HeaderFacade' => 'HeaderFacade',
      './+state/header/header.facade' => './+state/header/header.facade',
      'fromHeader' => 'fromHeader',
      './+state/header/header.reducer' => './+state/header/header.reducer',
      'HeaderTitleComponent' => 'HeaderTitleComponent',
      './header/header-title/header-title.component' => './header/header-title/header-title.component',
      'imports' => 'imports',
      'forFeature' => 'forFeature',
      'HEADER_FEATURE_KEY' => 'HEADER_FEATURE_KEY',
      'reducer' => 'reducer',
      'declarations' => 'declarations',
      'providers' => 'providers',
      'UiCommonModule' => 'UiCommonModule'
    },
    parseDiagnostics: [],
    _children: [ [NodeObject], [TokenObject] ]
  },
  kind: 253,
  decorators: undefined,
  modifiers: undefined,
  importClause: NodeObject {
    pos: 249,
    end: 265,
    flags: 0,
    modifierFlagsCache: 0,
    transformFlags: 0,
    parent: [Circular],
    kind: 254,
    namedBindings: NodeObject {
      pos: 249,
      end: 265,
      flags: 0,
      modifierFlagsCache: 0,
      transformFlags: 0,
      parent: [Circular],
      kind: 255,
      name: [IdentifierObject],
      _children: [Array]
    },
    _children: [ [NodeObject] ]
  },
  moduleSpecifier: TokenObject {
    pos: 270,
    end: 303,
    flags: 0,
    modifierFlagsCache: 0,
    transformFlags: 0,
    parent: [Circular],
    kind: 10,
    text: './+state/header/header.reducer'
  },
  _children: [
    TokenObject {
      pos: 242,
      end: 249,
      flags: 0,
      modifierFlagsCache: 0,
      transformFlags: 0,
      parent: [Circular],
      kind: 95
    },
    NodeObject {
      pos: 249,
      end: 265,
      flags: 0,
      modifierFlagsCache: 0,
      transformFlags: 0,
      parent: [Circular],
      kind: 254,
      namedBindings: [NodeObject],
      _children: [Array]
    },
    TokenObject {
      pos: 265,
      end: 270,
      flags: 0,
      modifierFlagsCache: 0,
      transformFlags: 0,
      parent: [Circular],
      kind: 148
    },
    TokenObject {
      pos: 270,
      end: 303,
      flags: 0,
      modifierFlagsCache: 0,
      transformFlags: 0,
      parent: [Circular],
      kind: 10,
      text: './+state/header/header.reducer'
    },
    TokenObject {
      pos: 303,
      end: 304,
      flags: 0,
      modifierFlagsCache: 0,
      transformFlags: 0,
      parent: [Circular],
      kind: 26
    }
  ]
}

statement children

[
  TokenObject {
    pos: 242,
    end: 249,
    flags: 0,
    modifierFlagsCache: 0,
    transformFlags: 0,
    parent: NodeObject {
      pos: 242,
      end: 304,
      flags: 0,
      modifierFlagsCache: 0,
      transformFlags: 0,
      parent: [SourceFileObject],
      kind: 253,
      decorators: undefined,
      modifiers: undefined,
      importClause: [NodeObject],
      moduleSpecifier: [TokenObject],
      _children: [Circular]
    },
    kind: 95
  },
  NodeObject {
    pos: 249,
    end: 265,
    flags: 0,
    modifierFlagsCache: 0,
    transformFlags: 0,
    parent: NodeObject {
      pos: 242,
      end: 304,
      flags: 0,
      modifierFlagsCache: 0,
      transformFlags: 0,
      parent: [SourceFileObject],
      kind: 253,
      decorators: undefined,
      modifiers: undefined,
      importClause: [Circular],
      moduleSpecifier: [TokenObject],
      _children: [Circular]
    },
    kind: 254,
    namedBindings: NodeObject {
      pos: 249,
      end: 265,
      flags: 0,
      modifierFlagsCache: 0,
      transformFlags: 0,
      parent: [Circular],
      kind: 255,
      name: [IdentifierObject],
      _children: [Array]
    },
    _children: [ [NodeObject] ]
  },
  TokenObject {
    pos: 265,
    end: 270,
    flags: 0,
    modifierFlagsCache: 0,
    transformFlags: 0,
    parent: NodeObject {
      pos: 242,
      end: 304,
      flags: 0,
      modifierFlagsCache: 0,
      transformFlags: 0,
      parent: [SourceFileObject],
      kind: 253,
      decorators: undefined,
      modifiers: undefined,
      importClause: [NodeObject],
      moduleSpecifier: [TokenObject],
      _children: [Circular]
    },
    kind: 148
  },
  TokenObject {
    pos: 270,
    end: 303,
    flags: 0,
    modifierFlagsCache: 0,
    transformFlags: 0,
    parent: NodeObject {
      pos: 242,
      end: 304,
      flags: 0,
      modifierFlagsCache: 0,
      transformFlags: 0,
      parent: [SourceFileObject],
      kind: 253,
      decorators: undefined,
      modifiers: undefined,
      importClause: [NodeObject],
      moduleSpecifier: [Circular],
      _children: [Circular]
    },
    kind: 10,
    text: './+state/header/header.reducer'
  },
  TokenObject {
    pos: 303,
    end: 304,
    flags: 0,
    modifierFlagsCache: 0,
    transformFlags: 0,
    parent: NodeObject {
      pos: 242,
      end: 304,
      flags: 0,
      modifierFlagsCache: 0,
      transformFlags: 0,
      parent: [SourceFileObject],
      kind: 253,
      decorators: undefined,
      modifiers: undefined,
      importClause: [NodeObject],
      moduleSpecifier: [TokenObject],
      _children: [Circular]
    },
    kind: 26
  }
]

import clauses

NodeObject {
  pos: 249,
  end: 265,
  flags: 0,
  modifierFlagsCache: 0,
  transformFlags: 0,
  parent: NodeObject {
    pos: 242,
    end: 304,
    flags: 0,
    modifierFlagsCache: 0,
    transformFlags: 0,
    parent: SourceFileObject {
      pos: 0,
      end: 653,
      flags: 0,
      modifierFlagsCache: 0,
      transformFlags: 0,
      parent: undefined,
      kind: 288,
      text: "import { CommonModule } from '@angular/common';\n" +
        "import { NgModule } from '@angular/core';\n" +
        "import { EffectsModule } from '@ngrx/effects';\n" +
        "import { StoreModule } from '@ngrx/store';\n" +
        '\n' +
        "import { HeaderFacade } from './+state/header/header.facade';\n" +
        "import * as fromHeader from './+state/header/header.reducer';\n" +
        "import { HeaderTitleComponent } from './header/header-title/header-title.component';\n" +
        '\n' +
        '@NgModule({\n' +
        '  imports: [\n' +
        '    CommonModule,\n' +
        '    StoreModule.forFeature(fromHeader.HEADER_FEATURE_KEY, fromHeader.reducer),\n' +
        '    EffectsModule.forFeature([])\n' +
        '  ],\n' +
        '  declarations: [HeaderTitleComponent],\n' +
        '  providers: [HeaderFacade]\n' +
        '})\n' +
        'export class UiCommonModule {}\n',
      bindDiagnostics: [],
      bindSuggestionDiagnostics: undefined,
      languageVersion: 99,
      fileName: 'libs/ui/common/src/lib/ui-common.module.ts',
      languageVariant: 0,
      isDeclarationFile: false,
      scriptKind: 3,
      pragmas: Map {},
      checkJsDirective: undefined,
      referencedFiles: [],
      typeReferenceDirectives: [],
      libReferenceDirectives: [],
      amdDependencies: [],
      hasNoDefaultLib: false,
      statements: [Array],
      endOfFileToken: [TokenObject],
      externalModuleIndicator: [NodeObject],
      nodeCount: 109,
      identifierCount: 38,
      identifiers: [Map],
      parseDiagnostics: [],
      _children: [Array]
    },
    kind: 253,
    decorators: undefined,
    modifiers: undefined,
    importClause: [Circular],
    moduleSpecifier: TokenObject {
      pos: 270,
      end: 303,
      flags: 0,
      modifierFlagsCache: 0,
      transformFlags: 0,
      parent: [Circular],
      kind: 10,
      text: './+state/header/header.reducer'
    },
    _children: [
      [TokenObject],
      [Circular],
      [TokenObject],
      [TokenObject],
      [TokenObject]
    ]
  },
  kind: 254,
  namedBindings: NodeObject {
    pos: 249,
    end: 265,
    flags: 0,
    modifierFlagsCache: 0,
    transformFlags: 0,
    parent: [Circular],
    kind: 255,
    name: IdentifierObject {
      pos: 254,
      end: 265,
      flags: 0,
      modifierFlagsCache: 0,
      transformFlags: 0,
      parent: [Circular],
      kind: 75,
      escapedText: 'fromHeader'
    },
    _children: [ [TokenObject], [TokenObject], [IdentifierObject] ]
  },
  _children: [
    NodeObject {
      pos: 249,
      end: 265,
      flags: 0,
      modifierFlagsCache: 0,
      transformFlags: 0,
      parent: [Circular],
      kind: 255,
      name: [IdentifierObject],
      _children: [Array]
    }
  ]
}

import clauses children

[
  NodeObject {
    pos: 249,
    end: 265,
    flags: 0,
    modifierFlagsCache: 0,
    transformFlags: 0,
    parent: NodeObject {
      pos: 249,
      end: 265,
      flags: 0,
      modifierFlagsCache: 0,
      transformFlags: 0,
      parent: [NodeObject],
      kind: 254,
      namedBindings: [Circular],
      _children: [Circular]
    },
    kind: 255,
    name: IdentifierObject {
      pos: 254,
      end: 265,
      flags: 0,
      modifierFlagsCache: 0,
      transformFlags: 0,
      parent: [Circular],
      kind: 75,
      escapedText: 'fromHeader'
    },
    _children: [ [TokenObject], [TokenObject], [IdentifierObject] ]
  }
]

Steps to Reproduce

You can find the code used here

Other

A workaround or even solution could look like the following:

const importStatement = imports.find(statement => {
                        const statementChildren = statement.getChildren();
                        const importClauses = statementChildren.find(node => node.kind === typescript_1.SyntaxKind.ImportClause)
                        const importClausesChildren = importClauses.getChildren();
                        
                        const namedImports = importClausesChildren.find(node => node.kind === typescript_1.SyntaxKind.NamedImports);
                        
                        if (namedImports === undefined) return false;
                        const namedImportsChildren = namedImports.getChildren();

                        const syntaxList = namedImportsChildren.find(node => node.kind === typescript_1.SyntaxKind.SyntaxList);
                        const syntaxListChildren = syntaxList.getChildren();

                        const importSpecifiers = syntaxListChildren.filter(node => node.kind === typescript_1.SyntaxKind.ImportSpecifier);
                        const importedIdentifiers = importSpecifiers.map(node => node.getText());
                        return importedIdentifiers.includes(componentName);
                    });
@github-actions
Copy link

This issue has been closed for more than 30 days. If this issue is still occuring, please open a new issue with more recent context.

@github-actions github-actions bot locked as resolved and limited conversation to collaborators Mar 25, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
outdated scope: storybook Issues related to Storybook support in Nx type: bug
Projects
None yet
Development

Successfully merging a pull request may close this issue.

2 participants