feat: add react docgen - #111

Merged
KaiVandivier merged 39 commits into
masterfrom
feat-add-react-docgen
Aug 9, 2021
Merged

feat: add react docgen#111
KaiVandivier merged 39 commits into
masterfrom
feat-add-react-docgen

Conversation

@KaiVandivier

@KaiVandivierKaiVandivier commented Jul 29, 2021

Copy link
Copy Markdown
Contributor

Uses React Docgen to parse React components & comments to generate API documentation, which is part of consolidating documentation in the UI library: https://jira.dhis2.org/browse/LIBS-149

There are somethings in the branch currently to help test it out:

  1. There are two test build and serve scripts that parse docs from the UI library - if your ui and cli-utils-docsite directories are not siblings, you'll need to change the path
  2. There's a link 'React Docs Test' added in the sidebar to view the docs generated by react docgen if you use the serve command

To do before merging:

  • Remove test scripts
  • Remove React Docs Test in sidebar

@KaiVandivier
KaiVandivier requested a review from a teamJuly 29, 2021 09:31

@mediremimediremi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks really good 👍

This will probably have to be part of a separate PR since it'll mean changing how we render and style our docs significantly, but it'd be nice if we could set a minimum column width for the generated tables.

For example, here we can see the type column is too wide and description too thin:

image

Unfortunately markdown does allow specifying column widths, so we'd need to switch to using HTML for rendering these tables. Plus, being able to render shape props multi-line (so {key1: type1\n, key2: type2\n} would also help.

@KaiVandivier

Copy link
Copy Markdown
ContributorAuthor

Yeah it would be nice to have some formatting control over the tables!

I thought newlines weren't possibly inside of the markdown tables, but I just learned that <br/> tags work 👍 I'll see about formatting objects better

@Mohammer5

Copy link
Copy Markdown
Contributor

I think support for line breaks could be quite useful:
image
image

Or maybe we could render code in comments that's wrapped with backticks in a pre tag?
Some of the descriptions are not really readable as the nesting is not obvious.


There are some docs for internals being generated.
image

I'm wondering if there's a way to only generate react docs for the components exported by the UI library.
But I don't think it's going to be an easy task to keep that generic enough to be useful in other cases too?

@KaiVandivier

Copy link
Copy Markdown
ContributorAuthor

So due to the limitations of markdown tables, I don't think supporting newlines is going to work without being able to control the size of columns:
Screen Shot 2021-07-29 at 4 19 45 PM

I agree it would be nice to only document exported components, but I also agree that's tricky to do in a generalizable way. If you can think of a smart way to do it I'm open to it! I think this iteration is "good enough" though since it's searchable, and there might be some utility for developers to getting the internals' APIs too. Hopefully some other context cues will point to what's exported as well, like component and prop type descriptions.

Also, just a reminder that for the UI library, this will be supplement to the storybook, and the storybook should probably get more attention ultimately

Related to that, @Mohammer5 maybe that renderNodeLabel can use a function signature annotation? I think Storybook supports that

@KaiVandivier

KaiVandivier commented Jul 29, 2021

Copy link
Copy Markdown
ContributorAuthor

I agree it would be nice to only document exported components, but I also agree that's tricky to do in a generalizable way

Maybe the script takes a path/glob to one or more files that export components (index.js-type files), then only finds and parses the components that are exported from those? 🤔 That algorithm would need to be able to crawl through several files if components are reexported multiple times

@Mohammer5

Copy link
Copy Markdown
Contributor

think this iteration is "good enough" though since it's searchable

Agreed, you can merge it when you think this PR is ready


If you can think of a smart way to do it I'm open to it

The command could expect a path / paths to javascript files and only generate the docs for the functions/components exported from these files (e. g. ./components/*/src/index.js). I guess the script would have to follow the imports until the component definition has been found, but that shouldn't be too hard

@Mohammer5

Copy link
Copy Markdown
Contributor

Related to that, @Mohammer5 maybe that renderNodeLabel can use a function signature annotation? I think Storybook supports that

Ah, that's quite neat! Will add

@KaiVandivier

Copy link
Copy Markdown
ContributorAuthor

@mediremi@Mohammer5 I switched the format to HTML tables which is a nice improvement, and parsing prop descriptions as multiline markdown is now supported: 🎉
Screen Shot 2021-07-31 at 12 18 37 AM

  • defaultValue items can also be multiline blocks too
  • The column widths are pretty good already without needing to specify widths, but there's one in the UI library that still has a slightly skinny 'description' column relative to the other columns in the table. It's still better than the screenshots you guys posted above though!
  • Formatting PropTypes.shape() types over multiple lines is pretty tricky and I haven't found a great way to do it without my own pretty printing logic. Luckily all the shape props in the UI library are pretty simple with no nesting and few properties, so hopefully single-line shapes are good enough

@mediremi

Copy link
Copy Markdown
Contributor

Nice that's already a big improvement 💪

On my screen + font combo things are still a bit squished so I've tried making some changes here: https://github.com/dhis2/cli-utils-docsite/compare/feat-add-react-docgen...feat-add-react-docgen-proposals?expand=1

The main difference is that the 'required' column has been removed and instead an asterisk is shown next to the property name, and custom prop types are rendered using their name if longer than 20 characters.

@Mohammer5

Copy link
Copy Markdown
Contributor

🎉 That looks a lot better!

Comment threadsrc/support/react-docs/react-docs.js Outdated
@KaiVandivier
KaiVandivier merged commit 99fdc48 into masterAug 9, 2021
@KaiVandivier
KaiVandivier deleted the feat-add-react-docgen branch August 9, 2021 16:44
dhis2-bot added a commit that referenced this pull request Aug 9, 2021
# [3.1.0](v3.0.0...v3.1.0) (2021-08-09)
### Features
* add react docgen ([#111](#111)) ([99fdc48](99fdc48))
@dhis2-bot

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 3.1.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@KaiVandivier@Mohammer5@mediremi@dhis2-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat: add react docgen - #111

Merged
KaiVandivier merged 39 commits into
masterfrom
feat-add-react-docgen
Aug 9, 2021
Merged

feat: add react docgen#111
KaiVandivier merged 39 commits into
masterfrom
feat-add-react-docgen

Conversation

@KaiVandivier

@KaiVandivierKaiVandivier commented Jul 29, 2021

Copy link
Copy Markdown
Contributor

Uses React Docgen to parse React components & comments to generate API documentation, which is part of consolidating documentation in the UI library: https://jira.dhis2.org/browse/LIBS-149

There are somethings in the branch currently to help test it out:

  1. There are two test build and serve scripts that parse docs from the UI library - if your ui and cli-utils-docsite directories are not siblings, you'll need to change the path
  2. There's a link 'React Docs Test' added in the sidebar to view the docs generated by react docgen if you use the serve command

To do before merging:

  • Remove test scripts
  • Remove React Docs Test in sidebar

@KaiVandivier
KaiVandivier requested a review from a teamJuly 29, 2021 09:31

@mediremimediremi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks really good 👍

This will probably have to be part of a separate PR since it'll mean changing how we render and style our docs significantly, but it'd be nice if we could set a minimum column width for the generated tables.

For example, here we can see the type column is too wide and description too thin:

image

Unfortunately markdown does allow specifying column widths, so we'd need to switch to using HTML for rendering these tables. Plus, being able to render shape props multi-line (so {key1: type1\n, key2: type2\n} would also help.

@KaiVandivier

Copy link
Copy Markdown
ContributorAuthor

Yeah it would be nice to have some formatting control over the tables!

I thought newlines weren't possibly inside of the markdown tables, but I just learned that <br/> tags work 👍 I'll see about formatting objects better

@Mohammer5

Copy link
Copy Markdown
Contributor

I think support for line breaks could be quite useful:
image
image

Or maybe we could render code in comments that's wrapped with backticks in a pre tag?
Some of the descriptions are not really readable as the nesting is not obvious.


There are some docs for internals being generated.
image

I'm wondering if there's a way to only generate react docs for the components exported by the UI library.
But I don't think it's going to be an easy task to keep that generic enough to be useful in other cases too?

@KaiVandivier

Copy link
Copy Markdown
ContributorAuthor

So due to the limitations of markdown tables, I don't think supporting newlines is going to work without being able to control the size of columns:
Screen Shot 2021-07-29 at 4 19 45 PM

I agree it would be nice to only document exported components, but I also agree that's tricky to do in a generalizable way. If you can think of a smart way to do it I'm open to it! I think this iteration is "good enough" though since it's searchable, and there might be some utility for developers to getting the internals' APIs too. Hopefully some other context cues will point to what's exported as well, like component and prop type descriptions.

Also, just a reminder that for the UI library, this will be supplement to the storybook, and the storybook should probably get more attention ultimately

Related to that, @Mohammer5 maybe that renderNodeLabel can use a function signature annotation? I think Storybook supports that

@KaiVandivier

KaiVandivier commented Jul 29, 2021

Copy link
Copy Markdown
ContributorAuthor

I agree it would be nice to only document exported components, but I also agree that's tricky to do in a generalizable way

Maybe the script takes a path/glob to one or more files that export components (index.js-type files), then only finds and parses the components that are exported from those? 🤔 That algorithm would need to be able to crawl through several files if components are reexported multiple times

@Mohammer5

Copy link
Copy Markdown
Contributor

think this iteration is "good enough" though since it's searchable

Agreed, you can merge it when you think this PR is ready


If you can think of a smart way to do it I'm open to it

The command could expect a path / paths to javascript files and only generate the docs for the functions/components exported from these files (e. g. ./components/*/src/index.js). I guess the script would have to follow the imports until the component definition has been found, but that shouldn't be too hard

@Mohammer5

Copy link
Copy Markdown
Contributor

Related to that, @Mohammer5 maybe that renderNodeLabel can use a function signature annotation? I think Storybook supports that

Ah, that's quite neat! Will add

@KaiVandivier

Copy link
Copy Markdown
ContributorAuthor

@mediremi@Mohammer5 I switched the format to HTML tables which is a nice improvement, and parsing prop descriptions as multiline markdown is now supported: 🎉
Screen Shot 2021-07-31 at 12 18 37 AM

  • defaultValue items can also be multiline blocks too
  • The column widths are pretty good already without needing to specify widths, but there's one in the UI library that still has a slightly skinny 'description' column relative to the other columns in the table. It's still better than the screenshots you guys posted above though!
  • Formatting PropTypes.shape() types over multiple lines is pretty tricky and I haven't found a great way to do it without my own pretty printing logic. Luckily all the shape props in the UI library are pretty simple with no nesting and few properties, so hopefully single-line shapes are good enough

@mediremi

Copy link
Copy Markdown
Contributor

Nice that's already a big improvement 💪

On my screen + font combo things are still a bit squished so I've tried making some changes here: https://github.com/dhis2/cli-utils-docsite/compare/feat-add-react-docgen...feat-add-react-docgen-proposals?expand=1

The main difference is that the 'required' column has been removed and instead an asterisk is shown next to the property name, and custom prop types are rendered using their name if longer than 20 characters.

@Mohammer5

Copy link
Copy Markdown
Contributor

🎉 That looks a lot better!

Comment threadsrc/support/react-docs/react-docs.js Outdated
@KaiVandivier
KaiVandivier merged commit 99fdc48 into masterAug 9, 2021
@KaiVandivier
KaiVandivier deleted the feat-add-react-docgen branch August 9, 2021 16:44
dhis2-bot added a commit that referenced this pull request Aug 9, 2021
# [3.1.0](v3.0.0...v3.1.0) (2021-08-09)
### Features
* add react docgen ([#111](#111)) ([99fdc48](99fdc48))
@dhis2-bot

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 3.1.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@KaiVandivier@Mohammer5@mediremi@dhis2-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add react docgen - #111

Merged
KaiVandivier merged 39 commits into
masterfrom
feat-add-react-docgen
Aug 9, 2021
Merged

feat: add react docgen#111
KaiVandivier merged 39 commits into
masterfrom
feat-add-react-docgen

Conversation

@KaiVandivier

@KaiVandivierKaiVandivier commented Jul 29, 2021

Copy link
Copy Markdown
Contributor

Uses React Docgen to parse React components & comments to generate API documentation, which is part of consolidating documentation in the UI library: https://jira.dhis2.org/browse/LIBS-149

There are somethings in the branch currently to help test it out:

  1. There are two test build and serve scripts that parse docs from the UI library - if your ui and cli-utils-docsite directories are not siblings, you'll need to change the path
  2. There's a link 'React Docs Test' added in the sidebar to view the docs generated by react docgen if you use the serve command

To do before merging:

  • Remove test scripts
  • Remove React Docs Test in sidebar

@KaiVandivier
KaiVandivier requested a review from a teamJuly 29, 2021 09:31

@mediremimediremi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks really good 👍

This will probably have to be part of a separate PR since it'll mean changing how we render and style our docs significantly, but it'd be nice if we could set a minimum column width for the generated tables.

For example, here we can see the type column is too wide and description too thin:

image

Unfortunately markdown does allow specifying column widths, so we'd need to switch to using HTML for rendering these tables. Plus, being able to render shape props multi-line (so {key1: type1\n, key2: type2\n} would also help.

@KaiVandivier

Copy link
Copy Markdown
ContributorAuthor

Yeah it would be nice to have some formatting control over the tables!

I thought newlines weren't possibly inside of the markdown tables, but I just learned that <br/> tags work 👍 I'll see about formatting objects better

@Mohammer5

Copy link
Copy Markdown
Contributor

I think support for line breaks could be quite useful:
image
image

Or maybe we could render code in comments that's wrapped with backticks in a pre tag?
Some of the descriptions are not really readable as the nesting is not obvious.


There are some docs for internals being generated.
image

I'm wondering if there's a way to only generate react docs for the components exported by the UI library.
But I don't think it's going to be an easy task to keep that generic enough to be useful in other cases too?

@KaiVandivier

Copy link
Copy Markdown
ContributorAuthor

So due to the limitations of markdown tables, I don't think supporting newlines is going to work without being able to control the size of columns:
Screen Shot 2021-07-29 at 4 19 45 PM

I agree it would be nice to only document exported components, but I also agree that's tricky to do in a generalizable way. If you can think of a smart way to do it I'm open to it! I think this iteration is "good enough" though since it's searchable, and there might be some utility for developers to getting the internals' APIs too. Hopefully some other context cues will point to what's exported as well, like component and prop type descriptions.

Also, just a reminder that for the UI library, this will be supplement to the storybook, and the storybook should probably get more attention ultimately

Related to that, @Mohammer5 maybe that renderNodeLabel can use a function signature annotation? I think Storybook supports that

@KaiVandivier

KaiVandivier commented Jul 29, 2021

Copy link
Copy Markdown
ContributorAuthor

I agree it would be nice to only document exported components, but I also agree that's tricky to do in a generalizable way

Maybe the script takes a path/glob to one or more files that export components (index.js-type files), then only finds and parses the components that are exported from those? 🤔 That algorithm would need to be able to crawl through several files if components are reexported multiple times

@Mohammer5

Copy link
Copy Markdown
Contributor

think this iteration is "good enough" though since it's searchable

Agreed, you can merge it when you think this PR is ready


If you can think of a smart way to do it I'm open to it

The command could expect a path / paths to javascript files and only generate the docs for the functions/components exported from these files (e. g. ./components/*/src/index.js). I guess the script would have to follow the imports until the component definition has been found, but that shouldn't be too hard

@Mohammer5

Copy link
Copy Markdown
Contributor

Related to that, @Mohammer5 maybe that renderNodeLabel can use a function signature annotation? I think Storybook supports that

Ah, that's quite neat! Will add

@KaiVandivier

Copy link
Copy Markdown
ContributorAuthor

@mediremi@Mohammer5 I switched the format to HTML tables which is a nice improvement, and parsing prop descriptions as multiline markdown is now supported: 🎉
Screen Shot 2021-07-31 at 12 18 37 AM

  • defaultValue items can also be multiline blocks too
  • The column widths are pretty good already without needing to specify widths, but there's one in the UI library that still has a slightly skinny 'description' column relative to the other columns in the table. It's still better than the screenshots you guys posted above though!
  • Formatting PropTypes.shape() types over multiple lines is pretty tricky and I haven't found a great way to do it without my own pretty printing logic. Luckily all the shape props in the UI library are pretty simple with no nesting and few properties, so hopefully single-line shapes are good enough

@mediremi

Copy link
Copy Markdown
Contributor

Nice that's already a big improvement 💪

On my screen + font combo things are still a bit squished so I've tried making some changes here: https://github.com/dhis2/cli-utils-docsite/compare/feat-add-react-docgen...feat-add-react-docgen-proposals?expand=1

The main difference is that the 'required' column has been removed and instead an asterisk is shown next to the property name, and custom prop types are rendered using their name if longer than 20 characters.

@Mohammer5

Copy link
Copy Markdown
Contributor

🎉 That looks a lot better!

Comment threadsrc/support/react-docs/react-docs.js Outdated
@KaiVandivier
KaiVandivier merged commit 99fdc48 into masterAug 9, 2021
@KaiVandivier
KaiVandivier deleted the feat-add-react-docgen branch August 9, 2021 16:44
dhis2-bot added a commit that referenced this pull request Aug 9, 2021
# [3.1.0](v3.0.0...v3.1.0) (2021-08-09)
### Features
* add react docgen ([#111](#111)) ([99fdc48](99fdc48))
@dhis2-bot

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 3.1.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@KaiVandivier@Mohammer5@mediremi@dhis2-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add react docgen - #111

Merged
KaiVandivier merged 39 commits into
masterfrom
feat-add-react-docgen
Aug 9, 2021
Merged

feat: add react docgen#111
KaiVandivier merged 39 commits into
masterfrom
feat-add-react-docgen

Conversation

@KaiVandivier

@KaiVandivierKaiVandivier commented Jul 29, 2021

Copy link
Copy Markdown
Contributor

Uses React Docgen to parse React components & comments to generate API documentation, which is part of consolidating documentation in the UI library: https://jira.dhis2.org/browse/LIBS-149

There are somethings in the branch currently to help test it out:

  1. There are two test build and serve scripts that parse docs from the UI library - if your ui and cli-utils-docsite directories are not siblings, you'll need to change the path
  2. There's a link 'React Docs Test' added in the sidebar to view the docs generated by react docgen if you use the serve command

To do before merging:

  • Remove test scripts
  • Remove React Docs Test in sidebar

@KaiVandivier
KaiVandivier requested a review from a teamJuly 29, 2021 09:31

@mediremimediremi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks really good 👍

This will probably have to be part of a separate PR since it'll mean changing how we render and style our docs significantly, but it'd be nice if we could set a minimum column width for the generated tables.

For example, here we can see the type column is too wide and description too thin:

image

Unfortunately markdown does allow specifying column widths, so we'd need to switch to using HTML for rendering these tables. Plus, being able to render shape props multi-line (so {key1: type1\n, key2: type2\n} would also help.

@KaiVandivier

Copy link
Copy Markdown
ContributorAuthor

Yeah it would be nice to have some formatting control over the tables!

I thought newlines weren't possibly inside of the markdown tables, but I just learned that <br/> tags work 👍 I'll see about formatting objects better

@Mohammer5

Copy link
Copy Markdown
Contributor

I think support for line breaks could be quite useful:
image
image

Or maybe we could render code in comments that's wrapped with backticks in a pre tag?
Some of the descriptions are not really readable as the nesting is not obvious.


There are some docs for internals being generated.
image

I'm wondering if there's a way to only generate react docs for the components exported by the UI library.
But I don't think it's going to be an easy task to keep that generic enough to be useful in other cases too?

@KaiVandivier

Copy link
Copy Markdown
ContributorAuthor

So due to the limitations of markdown tables, I don't think supporting newlines is going to work without being able to control the size of columns:
Screen Shot 2021-07-29 at 4 19 45 PM

I agree it would be nice to only document exported components, but I also agree that's tricky to do in a generalizable way. If you can think of a smart way to do it I'm open to it! I think this iteration is "good enough" though since it's searchable, and there might be some utility for developers to getting the internals' APIs too. Hopefully some other context cues will point to what's exported as well, like component and prop type descriptions.

Also, just a reminder that for the UI library, this will be supplement to the storybook, and the storybook should probably get more attention ultimately

Related to that, @Mohammer5 maybe that renderNodeLabel can use a function signature annotation? I think Storybook supports that

@KaiVandivier

KaiVandivier commented Jul 29, 2021

Copy link
Copy Markdown
ContributorAuthor

I agree it would be nice to only document exported components, but I also agree that's tricky to do in a generalizable way

Maybe the script takes a path/glob to one or more files that export components (index.js-type files), then only finds and parses the components that are exported from those? 🤔 That algorithm would need to be able to crawl through several files if components are reexported multiple times

@Mohammer5

Copy link
Copy Markdown
Contributor

think this iteration is "good enough" though since it's searchable

Agreed, you can merge it when you think this PR is ready


If you can think of a smart way to do it I'm open to it

The command could expect a path / paths to javascript files and only generate the docs for the functions/components exported from these files (e. g. ./components/*/src/index.js). I guess the script would have to follow the imports until the component definition has been found, but that shouldn't be too hard

@Mohammer5

Copy link
Copy Markdown
Contributor

Related to that, @Mohammer5 maybe that renderNodeLabel can use a function signature annotation? I think Storybook supports that

Ah, that's quite neat! Will add

@KaiVandivier

Copy link
Copy Markdown
ContributorAuthor

@mediremi@Mohammer5 I switched the format to HTML tables which is a nice improvement, and parsing prop descriptions as multiline markdown is now supported: 🎉
Screen Shot 2021-07-31 at 12 18 37 AM

  • defaultValue items can also be multiline blocks too
  • The column widths are pretty good already without needing to specify widths, but there's one in the UI library that still has a slightly skinny 'description' column relative to the other columns in the table. It's still better than the screenshots you guys posted above though!
  • Formatting PropTypes.shape() types over multiple lines is pretty tricky and I haven't found a great way to do it without my own pretty printing logic. Luckily all the shape props in the UI library are pretty simple with no nesting and few properties, so hopefully single-line shapes are good enough

@mediremi

Copy link
Copy Markdown
Contributor

Nice that's already a big improvement 💪

On my screen + font combo things are still a bit squished so I've tried making some changes here: https://github.com/dhis2/cli-utils-docsite/compare/feat-add-react-docgen...feat-add-react-docgen-proposals?expand=1

The main difference is that the 'required' column has been removed and instead an asterisk is shown next to the property name, and custom prop types are rendered using their name if longer than 20 characters.

@Mohammer5

Copy link
Copy Markdown
Contributor

🎉 That looks a lot better!

Comment threadsrc/support/react-docs/react-docs.js Outdated
@KaiVandivier
KaiVandivier merged commit 99fdc48 into masterAug 9, 2021
@KaiVandivier
KaiVandivier deleted the feat-add-react-docgen branch August 9, 2021 16:44
dhis2-bot added a commit that referenced this pull request Aug 9, 2021
# [3.1.0](v3.0.0...v3.1.0) (2021-08-09)
### Features
* add react docgen ([#111](#111)) ([99fdc48](99fdc48))
@dhis2-bot

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 3.1.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@KaiVandivier@Mohammer5@mediremi@dhis2-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat: add react docgen - #111

Merged
KaiVandivier merged 39 commits into
masterfrom
feat-add-react-docgen
Aug 9, 2021
Merged

feat: add react docgen#111
KaiVandivier merged 39 commits into
masterfrom
feat-add-react-docgen

Conversation

@KaiVandivier

@KaiVandivierKaiVandivier commented Jul 29, 2021

Copy link
Copy Markdown
Contributor

Uses React Docgen to parse React components & comments to generate API documentation, which is part of consolidating documentation in the UI library: https://jira.dhis2.org/browse/LIBS-149

There are somethings in the branch currently to help test it out:

  1. There are two test build and serve scripts that parse docs from the UI library - if your ui and cli-utils-docsite directories are not siblings, you'll need to change the path
  2. There's a link 'React Docs Test' added in the sidebar to view the docs generated by react docgen if you use the serve command

To do before merging:

  • Remove test scripts
  • Remove React Docs Test in sidebar

@KaiVandivier
KaiVandivier requested a review from a teamJuly 29, 2021 09:31

@mediremimediremi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks really good 👍

This will probably have to be part of a separate PR since it'll mean changing how we render and style our docs significantly, but it'd be nice if we could set a minimum column width for the generated tables.

For example, here we can see the type column is too wide and description too thin:

image

Unfortunately markdown does allow specifying column widths, so we'd need to switch to using HTML for rendering these tables. Plus, being able to render shape props multi-line (so {key1: type1\n, key2: type2\n} would also help.

@KaiVandivier

Copy link
Copy Markdown
ContributorAuthor

Yeah it would be nice to have some formatting control over the tables!

I thought newlines weren't possibly inside of the markdown tables, but I just learned that <br/> tags work 👍 I'll see about formatting objects better

@Mohammer5

Copy link
Copy Markdown
Contributor

I think support for line breaks could be quite useful:
image
image

Or maybe we could render code in comments that's wrapped with backticks in a pre tag?
Some of the descriptions are not really readable as the nesting is not obvious.


There are some docs for internals being generated.
image

I'm wondering if there's a way to only generate react docs for the components exported by the UI library.
But I don't think it's going to be an easy task to keep that generic enough to be useful in other cases too?

@KaiVandivier

Copy link
Copy Markdown
ContributorAuthor

So due to the limitations of markdown tables, I don't think supporting newlines is going to work without being able to control the size of columns:
Screen Shot 2021-07-29 at 4 19 45 PM

I agree it would be nice to only document exported components, but I also agree that's tricky to do in a generalizable way. If you can think of a smart way to do it I'm open to it! I think this iteration is "good enough" though since it's searchable, and there might be some utility for developers to getting the internals' APIs too. Hopefully some other context cues will point to what's exported as well, like component and prop type descriptions.

Also, just a reminder that for the UI library, this will be supplement to the storybook, and the storybook should probably get more attention ultimately

Related to that, @Mohammer5 maybe that renderNodeLabel can use a function signature annotation? I think Storybook supports that

@KaiVandivier

KaiVandivier commented Jul 29, 2021

Copy link
Copy Markdown
ContributorAuthor

I agree it would be nice to only document exported components, but I also agree that's tricky to do in a generalizable way

Maybe the script takes a path/glob to one or more files that export components (index.js-type files), then only finds and parses the components that are exported from those? 🤔 That algorithm would need to be able to crawl through several files if components are reexported multiple times

@Mohammer5

Copy link
Copy Markdown
Contributor

think this iteration is "good enough" though since it's searchable

Agreed, you can merge it when you think this PR is ready


If you can think of a smart way to do it I'm open to it

The command could expect a path / paths to javascript files and only generate the docs for the functions/components exported from these files (e. g. ./components/*/src/index.js). I guess the script would have to follow the imports until the component definition has been found, but that shouldn't be too hard

@Mohammer5

Copy link
Copy Markdown
Contributor

Related to that, @Mohammer5 maybe that renderNodeLabel can use a function signature annotation? I think Storybook supports that

Ah, that's quite neat! Will add

@KaiVandivier

Copy link
Copy Markdown
ContributorAuthor

@mediremi@Mohammer5 I switched the format to HTML tables which is a nice improvement, and parsing prop descriptions as multiline markdown is now supported: 🎉
Screen Shot 2021-07-31 at 12 18 37 AM

  • defaultValue items can also be multiline blocks too
  • The column widths are pretty good already without needing to specify widths, but there's one in the UI library that still has a slightly skinny 'description' column relative to the other columns in the table. It's still better than the screenshots you guys posted above though!
  • Formatting PropTypes.shape() types over multiple lines is pretty tricky and I haven't found a great way to do it without my own pretty printing logic. Luckily all the shape props in the UI library are pretty simple with no nesting and few properties, so hopefully single-line shapes are good enough

@mediremi

Copy link
Copy Markdown
Contributor

Nice that's already a big improvement 💪

On my screen + font combo things are still a bit squished so I've tried making some changes here: https://github.com/dhis2/cli-utils-docsite/compare/feat-add-react-docgen...feat-add-react-docgen-proposals?expand=1

The main difference is that the 'required' column has been removed and instead an asterisk is shown next to the property name, and custom prop types are rendered using their name if longer than 20 characters.

@Mohammer5

Copy link
Copy Markdown
Contributor

🎉 That looks a lot better!

Comment threadsrc/support/react-docs/react-docs.js Outdated
@KaiVandivier
KaiVandivier merged commit 99fdc48 into masterAug 9, 2021
@KaiVandivier
KaiVandivier deleted the feat-add-react-docgen branch August 9, 2021 16:44
dhis2-bot added a commit that referenced this pull request Aug 9, 2021
# [3.1.0](v3.0.0...v3.1.0) (2021-08-09)
### Features
* add react docgen ([#111](#111)) ([99fdc48](99fdc48))
@dhis2-bot

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 3.1.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@KaiVandivier@Mohammer5@mediremi@dhis2-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add react docgen - #111

Merged
KaiVandivier merged 39 commits into
masterfrom
feat-add-react-docgen
Aug 9, 2021
Merged

feat: add react docgen#111
KaiVandivier merged 39 commits into
masterfrom
feat-add-react-docgen

Conversation

@KaiVandivier

@KaiVandivierKaiVandivier commented Jul 29, 2021

Copy link
Copy Markdown
Contributor

Uses React Docgen to parse React components & comments to generate API documentation, which is part of consolidating documentation in the UI library: https://jira.dhis2.org/browse/LIBS-149

There are somethings in the branch currently to help test it out:

  1. There are two test build and serve scripts that parse docs from the UI library - if your ui and cli-utils-docsite directories are not siblings, you'll need to change the path
  2. There's a link 'React Docs Test' added in the sidebar to view the docs generated by react docgen if you use the serve command

To do before merging:

  • Remove test scripts
  • Remove React Docs Test in sidebar

@KaiVandivier
KaiVandivier requested a review from a teamJuly 29, 2021 09:31

@mediremimediremi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks really good 👍

This will probably have to be part of a separate PR since it'll mean changing how we render and style our docs significantly, but it'd be nice if we could set a minimum column width for the generated tables.

For example, here we can see the type column is too wide and description too thin:

image

Unfortunately markdown does allow specifying column widths, so we'd need to switch to using HTML for rendering these tables. Plus, being able to render shape props multi-line (so {key1: type1\n, key2: type2\n} would also help.

@KaiVandivier

Copy link
Copy Markdown
ContributorAuthor

Yeah it would be nice to have some formatting control over the tables!

I thought newlines weren't possibly inside of the markdown tables, but I just learned that <br/> tags work 👍 I'll see about formatting objects better

@Mohammer5

Copy link
Copy Markdown
Contributor

I think support for line breaks could be quite useful:
image
image

Or maybe we could render code in comments that's wrapped with backticks in a pre tag?
Some of the descriptions are not really readable as the nesting is not obvious.


There are some docs for internals being generated.
image

I'm wondering if there's a way to only generate react docs for the components exported by the UI library.
But I don't think it's going to be an easy task to keep that generic enough to be useful in other cases too?

@KaiVandivier

Copy link
Copy Markdown
ContributorAuthor

So due to the limitations of markdown tables, I don't think supporting newlines is going to work without being able to control the size of columns:
Screen Shot 2021-07-29 at 4 19 45 PM

I agree it would be nice to only document exported components, but I also agree that's tricky to do in a generalizable way. If you can think of a smart way to do it I'm open to it! I think this iteration is "good enough" though since it's searchable, and there might be some utility for developers to getting the internals' APIs too. Hopefully some other context cues will point to what's exported as well, like component and prop type descriptions.

Also, just a reminder that for the UI library, this will be supplement to the storybook, and the storybook should probably get more attention ultimately

Related to that, @Mohammer5 maybe that renderNodeLabel can use a function signature annotation? I think Storybook supports that

@KaiVandivier

KaiVandivier commented Jul 29, 2021

Copy link
Copy Markdown
ContributorAuthor

I agree it would be nice to only document exported components, but I also agree that's tricky to do in a generalizable way

Maybe the script takes a path/glob to one or more files that export components (index.js-type files), then only finds and parses the components that are exported from those? 🤔 That algorithm would need to be able to crawl through several files if components are reexported multiple times

@Mohammer5

Copy link
Copy Markdown
Contributor

think this iteration is "good enough" though since it's searchable

Agreed, you can merge it when you think this PR is ready


If you can think of a smart way to do it I'm open to it

The command could expect a path / paths to javascript files and only generate the docs for the functions/components exported from these files (e. g. ./components/*/src/index.js). I guess the script would have to follow the imports until the component definition has been found, but that shouldn't be too hard

@Mohammer5

Copy link
Copy Markdown
Contributor

Related to that, @Mohammer5 maybe that renderNodeLabel can use a function signature annotation? I think Storybook supports that

Ah, that's quite neat! Will add

@KaiVandivier

Copy link
Copy Markdown
ContributorAuthor

@mediremi@Mohammer5 I switched the format to HTML tables which is a nice improvement, and parsing prop descriptions as multiline markdown is now supported: 🎉
Screen Shot 2021-07-31 at 12 18 37 AM

  • defaultValue items can also be multiline blocks too
  • The column widths are pretty good already without needing to specify widths, but there's one in the UI library that still has a slightly skinny 'description' column relative to the other columns in the table. It's still better than the screenshots you guys posted above though!
  • Formatting PropTypes.shape() types over multiple lines is pretty tricky and I haven't found a great way to do it without my own pretty printing logic. Luckily all the shape props in the UI library are pretty simple with no nesting and few properties, so hopefully single-line shapes are good enough

@mediremi

Copy link
Copy Markdown
Contributor

Nice that's already a big improvement 💪

On my screen + font combo things are still a bit squished so I've tried making some changes here: https://github.com/dhis2/cli-utils-docsite/compare/feat-add-react-docgen...feat-add-react-docgen-proposals?expand=1

The main difference is that the 'required' column has been removed and instead an asterisk is shown next to the property name, and custom prop types are rendered using their name if longer than 20 characters.

@Mohammer5

Copy link
Copy Markdown
Contributor

🎉 That looks a lot better!

Comment threadsrc/support/react-docs/react-docs.js Outdated
@KaiVandivier
KaiVandivier merged commit 99fdc48 into masterAug 9, 2021
@KaiVandivier
KaiVandivier deleted the feat-add-react-docgen branch August 9, 2021 16:44
dhis2-bot added a commit that referenced this pull request Aug 9, 2021
# [3.1.0](v3.0.0...v3.1.0) (2021-08-09)
### Features
* add react docgen ([#111](#111)) ([99fdc48](99fdc48))
@dhis2-bot

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 3.1.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@KaiVandivier@Mohammer5@mediremi@dhis2-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: add react docgen - #111

Merged
KaiVandivier merged 39 commits into
masterfrom
feat-add-react-docgen
Aug 9, 2021
Merged

feat: add react docgen#111
KaiVandivier merged 39 commits into
masterfrom
feat-add-react-docgen

Conversation

@KaiVandivier

@KaiVandivierKaiVandivier commented Jul 29, 2021

Copy link
Copy Markdown
Contributor

Uses React Docgen to parse React components & comments to generate API documentation, which is part of consolidating documentation in the UI library: https://jira.dhis2.org/browse/LIBS-149

There are somethings in the branch currently to help test it out:

  1. There are two test build and serve scripts that parse docs from the UI library - if your ui and cli-utils-docsite directories are not siblings, you'll need to change the path
  2. There's a link 'React Docs Test' added in the sidebar to view the docs generated by react docgen if you use the serve command

To do before merging:

  • Remove test scripts
  • Remove React Docs Test in sidebar

@KaiVandivier
KaiVandivier requested a review from a teamJuly 29, 2021 09:31

@mediremimediremi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks really good 👍

This will probably have to be part of a separate PR since it'll mean changing how we render and style our docs significantly, but it'd be nice if we could set a minimum column width for the generated tables.

For example, here we can see the type column is too wide and description too thin:

image

Unfortunately markdown does allow specifying column widths, so we'd need to switch to using HTML for rendering these tables. Plus, being able to render shape props multi-line (so {key1: type1\n, key2: type2\n} would also help.

@KaiVandivier

Copy link
Copy Markdown
ContributorAuthor

Yeah it would be nice to have some formatting control over the tables!

I thought newlines weren't possibly inside of the markdown tables, but I just learned that <br/> tags work 👍 I'll see about formatting objects better

@Mohammer5

Copy link
Copy Markdown
Contributor

I think support for line breaks could be quite useful:
image
image

Or maybe we could render code in comments that's wrapped with backticks in a pre tag?
Some of the descriptions are not really readable as the nesting is not obvious.


There are some docs for internals being generated.
image

I'm wondering if there's a way to only generate react docs for the components exported by the UI library.
But I don't think it's going to be an easy task to keep that generic enough to be useful in other cases too?

@KaiVandivier

Copy link
Copy Markdown
ContributorAuthor

So due to the limitations of markdown tables, I don't think supporting newlines is going to work without being able to control the size of columns:
Screen Shot 2021-07-29 at 4 19 45 PM

I agree it would be nice to only document exported components, but I also agree that's tricky to do in a generalizable way. If you can think of a smart way to do it I'm open to it! I think this iteration is "good enough" though since it's searchable, and there might be some utility for developers to getting the internals' APIs too. Hopefully some other context cues will point to what's exported as well, like component and prop type descriptions.

Also, just a reminder that for the UI library, this will be supplement to the storybook, and the storybook should probably get more attention ultimately

Related to that, @Mohammer5 maybe that renderNodeLabel can use a function signature annotation? I think Storybook supports that

@KaiVandivier

KaiVandivier commented Jul 29, 2021

Copy link
Copy Markdown
ContributorAuthor

I agree it would be nice to only document exported components, but I also agree that's tricky to do in a generalizable way

Maybe the script takes a path/glob to one or more files that export components (index.js-type files), then only finds and parses the components that are exported from those? 🤔 That algorithm would need to be able to crawl through several files if components are reexported multiple times

@Mohammer5

Copy link
Copy Markdown
Contributor

think this iteration is "good enough" though since it's searchable

Agreed, you can merge it when you think this PR is ready


If you can think of a smart way to do it I'm open to it

The command could expect a path / paths to javascript files and only generate the docs for the functions/components exported from these files (e. g. ./components/*/src/index.js). I guess the script would have to follow the imports until the component definition has been found, but that shouldn't be too hard

@Mohammer5

Copy link
Copy Markdown
Contributor

Related to that, @Mohammer5 maybe that renderNodeLabel can use a function signature annotation? I think Storybook supports that

Ah, that's quite neat! Will add

@KaiVandivier

Copy link
Copy Markdown
ContributorAuthor

@mediremi@Mohammer5 I switched the format to HTML tables which is a nice improvement, and parsing prop descriptions as multiline markdown is now supported: 🎉
Screen Shot 2021-07-31 at 12 18 37 AM

  • defaultValue items can also be multiline blocks too
  • The column widths are pretty good already without needing to specify widths, but there's one in the UI library that still has a slightly skinny 'description' column relative to the other columns in the table. It's still better than the screenshots you guys posted above though!
  • Formatting PropTypes.shape() types over multiple lines is pretty tricky and I haven't found a great way to do it without my own pretty printing logic. Luckily all the shape props in the UI library are pretty simple with no nesting and few properties, so hopefully single-line shapes are good enough

@mediremi

Copy link
Copy Markdown
Contributor

Nice that's already a big improvement 💪

On my screen + font combo things are still a bit squished so I've tried making some changes here: https://github.com/dhis2/cli-utils-docsite/compare/feat-add-react-docgen...feat-add-react-docgen-proposals?expand=1

The main difference is that the 'required' column has been removed and instead an asterisk is shown next to the property name, and custom prop types are rendered using their name if longer than 20 characters.

@Mohammer5

Copy link
Copy Markdown
Contributor

🎉 That looks a lot better!

Comment threadsrc/support/react-docs/react-docs.js Outdated
@KaiVandivier
KaiVandivier merged commit 99fdc48 into masterAug 9, 2021
@KaiVandivier
KaiVandivier deleted the feat-add-react-docgen branch August 9, 2021 16:44
dhis2-bot added a commit that referenced this pull request Aug 9, 2021
# [3.1.0](v3.0.0...v3.1.0) (2021-08-09)
### Features
* add react docgen ([#111](#111)) ([99fdc48](99fdc48))
@dhis2-bot

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 3.1.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@KaiVandivier@Mohammer5@mediremi@dhis2-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat: add react docgen - #111

Merged
KaiVandivier merged 39 commits into
masterfrom
feat-add-react-docgen
Aug 9, 2021
Merged

feat: add react docgen#111
KaiVandivier merged 39 commits into
masterfrom
feat-add-react-docgen

Conversation

@KaiVandivier

@KaiVandivierKaiVandivier commented Jul 29, 2021

Copy link
Copy Markdown
Contributor

Uses React Docgen to parse React components & comments to generate API documentation, which is part of consolidating documentation in the UI library: https://jira.dhis2.org/browse/LIBS-149

There are somethings in the branch currently to help test it out:

  1. There are two test build and serve scripts that parse docs from the UI library - if your ui and cli-utils-docsite directories are not siblings, you'll need to change the path
  2. There's a link 'React Docs Test' added in the sidebar to view the docs generated by react docgen if you use the serve command

To do before merging:

  • Remove test scripts
  • Remove React Docs Test in sidebar

@KaiVandivier
KaiVandivier requested a review from a teamJuly 29, 2021 09:31

@mediremimediremi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks really good 👍

This will probably have to be part of a separate PR since it'll mean changing how we render and style our docs significantly, but it'd be nice if we could set a minimum column width for the generated tables.

For example, here we can see the type column is too wide and description too thin:

image

Unfortunately markdown does allow specifying column widths, so we'd need to switch to using HTML for rendering these tables. Plus, being able to render shape props multi-line (so {key1: type1\n, key2: type2\n} would also help.

@KaiVandivier

Copy link
Copy Markdown
ContributorAuthor

Yeah it would be nice to have some formatting control over the tables!

I thought newlines weren't possibly inside of the markdown tables, but I just learned that <br/> tags work 👍 I'll see about formatting objects better

@Mohammer5

Copy link
Copy Markdown
Contributor

I think support for line breaks could be quite useful:
image
image

Or maybe we could render code in comments that's wrapped with backticks in a pre tag?
Some of the descriptions are not really readable as the nesting is not obvious.


There are some docs for internals being generated.
image

I'm wondering if there's a way to only generate react docs for the components exported by the UI library.
But I don't think it's going to be an easy task to keep that generic enough to be useful in other cases too?

@KaiVandivier

Copy link
Copy Markdown
ContributorAuthor

So due to the limitations of markdown tables, I don't think supporting newlines is going to work without being able to control the size of columns:
Screen Shot 2021-07-29 at 4 19 45 PM

I agree it would be nice to only document exported components, but I also agree that's tricky to do in a generalizable way. If you can think of a smart way to do it I'm open to it! I think this iteration is "good enough" though since it's searchable, and there might be some utility for developers to getting the internals' APIs too. Hopefully some other context cues will point to what's exported as well, like component and prop type descriptions.

Also, just a reminder that for the UI library, this will be supplement to the storybook, and the storybook should probably get more attention ultimately

Related to that, @Mohammer5 maybe that renderNodeLabel can use a function signature annotation? I think Storybook supports that

@KaiVandivier

KaiVandivier commented Jul 29, 2021

Copy link
Copy Markdown
ContributorAuthor

I agree it would be nice to only document exported components, but I also agree that's tricky to do in a generalizable way

Maybe the script takes a path/glob to one or more files that export components (index.js-type files), then only finds and parses the components that are exported from those? 🤔 That algorithm would need to be able to crawl through several files if components are reexported multiple times

@Mohammer5

Copy link
Copy Markdown
Contributor

think this iteration is "good enough" though since it's searchable

Agreed, you can merge it when you think this PR is ready


If you can think of a smart way to do it I'm open to it

The command could expect a path / paths to javascript files and only generate the docs for the functions/components exported from these files (e. g. ./components/*/src/index.js). I guess the script would have to follow the imports until the component definition has been found, but that shouldn't be too hard

@Mohammer5

Copy link
Copy Markdown
Contributor

Related to that, @Mohammer5 maybe that renderNodeLabel can use a function signature annotation? I think Storybook supports that

Ah, that's quite neat! Will add

@KaiVandivier

Copy link
Copy Markdown
ContributorAuthor

@mediremi@Mohammer5 I switched the format to HTML tables which is a nice improvement, and parsing prop descriptions as multiline markdown is now supported: 🎉
Screen Shot 2021-07-31 at 12 18 37 AM

  • defaultValue items can also be multiline blocks too
  • The column widths are pretty good already without needing to specify widths, but there's one in the UI library that still has a slightly skinny 'description' column relative to the other columns in the table. It's still better than the screenshots you guys posted above though!
  • Formatting PropTypes.shape() types over multiple lines is pretty tricky and I haven't found a great way to do it without my own pretty printing logic. Luckily all the shape props in the UI library are pretty simple with no nesting and few properties, so hopefully single-line shapes are good enough

@mediremi

Copy link
Copy Markdown
Contributor

Nice that's already a big improvement 💪

On my screen + font combo things are still a bit squished so I've tried making some changes here: https://github.com/dhis2/cli-utils-docsite/compare/feat-add-react-docgen...feat-add-react-docgen-proposals?expand=1

The main difference is that the 'required' column has been removed and instead an asterisk is shown next to the property name, and custom prop types are rendered using their name if longer than 20 characters.

@Mohammer5

Copy link
Copy Markdown
Contributor

🎉 That looks a lot better!

Comment threadsrc/support/react-docs/react-docs.js Outdated
@KaiVandivier
KaiVandivier merged commit 99fdc48 into masterAug 9, 2021
@KaiVandivier
KaiVandivier deleted the feat-add-react-docgen branch August 9, 2021 16:44
dhis2-bot added a commit that referenced this pull request Aug 9, 2021
# [3.1.0](v3.0.0...v3.1.0) (2021-08-09)
### Features
* add react docgen ([#111](#111)) ([99fdc48](99fdc48))
@dhis2-bot

Copy link
Copy Markdown
Contributor

🎉 This PR is included in version 3.1.0 🎉

The release is available on:

Your semantic-release bot 📦🚀

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@KaiVandivier@Mohammer5@mediremi@dhis2-bot