-
Notifications
You must be signed in to change notification settings - Fork 1.7k
solution #1748
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
base: master
Are you sure you want to change the base?
solution #1748
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,29 @@ | ||
| name: Test | ||
|
|
||
| on: | ||
| pull_request: | ||
| branches: [ master ] | ||
|
|
||
| jobs: | ||
| build: | ||
|
|
||
| runs-on: ubuntu-latest | ||
|
|
||
| strategy: | ||
| matrix: | ||
| node-version: [20.x] | ||
|
|
||
| steps: | ||
| - uses: actions/checkout@v2 | ||
| - name: Use Node.js ${{ matrix.node-version }} | ||
| uses: actions/setup-node@v1 | ||
| with: | ||
| node-version: ${{ matrix.node-version }} | ||
| - run: npm install | ||
| - run: npm start & sleep 5 && npm test | ||
| - name: Upload tests report(cypress mochaawesome merged HTML report) | ||
| if: ${{ always() }} | ||
| uses: actions/upload-artifact@v2 | ||
| with: | ||
| name: report | ||
| path: reports |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,5 +1,7 @@ | ||
| 'use strict'; | ||
|
|
||
| // const { createElement } = require('react'); | ||
|
|
||
| const food = { | ||
| Drink: { | ||
| Wine: {}, | ||
|
|
@@ -21,7 +23,31 @@ const food = { | |
| const tree = document.querySelector('#tree'); | ||
|
|
||
| function createTree(element, data) { | ||
| // WRITE YOUR CODE HERE | ||
| } | ||
| if (!element) { | ||
| throw new Error('Tree container not found'); | ||
| } | ||
|
|
||
| if (!data || typeof data !== 'object' || Object.keys(data).length === 0) { | ||
| return; | ||
|
Comment on lines
+30
to
+31
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The guard here prevents calling Object.keys on null/undefined and thus avoids runtime errors. Returning early for empty objects is acceptable, but be sure this behavior matches the tests' expectations (alternatively you could treat empty data as a no-op explicitly). |
||
| } | ||
|
|
||
| const newUl = document.createElement('ul'); | ||
|
|
||
| for (const key in data) { | ||
| if (Object.prototype.hasOwnProperty.call(data, key)) { | ||
| const newLi = document.createElement('li'); | ||
|
|
||
| newLi.textContent = key; | ||
|
|
||
| createTree(newLi, data[key]); | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The recursive tree-building looks correct, but the module still triggers a top-level side-effect on import (the file calls |
||
|
|
||
| newUl.append(newLi); | ||
| } | ||
| } | ||
|
|
||
| if (newUl.children.length > 0) { | ||
| element.append(newUl); | ||
| } | ||
| } | ||
| export { createTree }; | ||
| createTree(tree, food); | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This top-level invocation runs during module load and can cause runtime issues in tests if |
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good — this throws a clear Error when the container element is missing, matching the checklist requirement to fail loudly instead of silently returning.