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

feat: legacy json generator #142

Merged
merged 10 commits into from
Nov 25, 2024
Merged

feat: legacy json generator #142

merged 10 commits into from
Nov 25, 2024

Conversation

avivkeller
Copy link
Member

@avivkeller avivkeller commented Nov 10, 2024

Closes #57
Closes #141
Closes #92


This is an extension of #92. This is a seperate PR due to a rebase that caused merge conflicts.

Description

See #92 for a description

Validation

# Variables
FILENAME="$1"
NODE="path/to/node/repo"
API_DOCS_TOOLING="path/to/api-docs/tooling/repo"
DOC="$NODE/doc/api/$FILENAME.md"
OUTPUT_DIR="output"
NEW_DIR="$OUTPUT_DIR/new"
OLD_DIR="$OUTPUT_DIR/old"
SORT_JSON=$(cat <<EOF
def sorted_walk(f):
  . as \$in
  | if type == "object" then
      reduce keys[] as \$key
        ( {}; . + { (\$key):  (\$in[\$key] | sorted_walk(f)) } ) | f
  elif type == "array" then map( sorted_walk(f) ) | f
  else f
  end;

def normalize: sorted_walk(if type == "array" then sort else . end);

normalize
EOF
)

# Functions
initialize_output() {
  rm -rf "$OUTPUT_DIR" && mkdir -p "$NEW_DIR" "$OLD_DIR"
}

generate_new() {
  node "$API_DOCS_TOOLING/bin/cli.mjs" -i "$DOC" -t legacy-json -o "$NEW_DIR"
}

generate_old() {
  node "$NODE/tools/doc/generate.mjs" "$DOC" --output-directory="$OLD_DIR"
}

compare_outputs() {
  git diff --no-index <(jq --sort-keys -f <(echo $SORT_JSON) "$OLD_DIR/$FILENAME.json") <(jq --sort-keys -f <(echo $SORT_JSON) "$NEW_DIR/$FILENAME.json")
}

# Main logic
initialize_output
generate_new
generate_old
compare_outputs

Validate with bash ./file.sh addons, bash ./file.sh fs, etc.

Differences

These are the small differences, and likely do not need to be fixed.

  1. Highlighting is done by Shiki instead of Highlight.js
  2. The old parser had issues parsing optional parameters in some cases (IIUC)
  3. The old parser mistook return-ed Objects for additional parameters
  4. The old parser pre-parsed the source_code YAML comments, ours does not.
  5. The old parser would use the filename as the displayName for the root node, this one uses the actual display name. (E.X. fs (old) vs File System (new))
  6. Links are not preserved in textRaw (I.E. [`something`][] in the old parser is `something` in the new one)
  7. meta is always a property.

Check List

  • I have read the Contributing Guidelines and made commit messages that follow the guideline.
  • I've covered new added functionality with unit tests if necessary.

@avivkeller avivkeller requested a review from a team as a code owner November 10, 2024 17:56
@avivkeller
Copy link
Member Author

@flakey5 PTAL

@avivkeller avivkeller force-pushed the legacy-json branch 2 times, most recently from 6e80d01 to e2c8fdd Compare November 10, 2024 18:09
@avivkeller avivkeller mentioned this pull request Nov 10, 2024
4 tasks
@avivkeller
Copy link
Member Author

avivkeller commented Nov 10, 2024

Currently, this PR is 1:1 with the original JSON (AFAIK), except for the following differences, which probably don't need to be fixed:

  1. Highlighting is done by Shiki instead of Highlight.js
  2. The old parser had issues parsing optional parameters in some cases (IIUC)
  3. The old parser mistook return-ed Objects for additional parameters
  4. The old parser pre-parsed the source_code YAML comments, ours does not.
  5. The old parser would use the filename as the displayName for the root node, this one uses the actual display name. (E.X. fs (old) vs File System (new))

@ovflowd
Copy link
Member

ovflowd commented Nov 11, 2024

So, is it correct to assume that this is PR supersedes @flakey5's PR? Was this communicated with @flakey5? Are they fine with the continuation on this PR?

Note that you could also have pushed your work on their PR if they were fine :) -- or at least you can once you join the team on GitHub I believe.

I will review this once I get time 🙏

@avivkeller
Copy link
Member Author

I would wait until we get the go-ahead from the other PR. My plan was to open this PR into that branch, but there was merge conflicts. If we don't get the go ahead, I suggest that @flakey5 use git apply to semi-manually apply some of these changes.

(I obviously don't want to take away from the other PR / cut off @flakey5's amazing work, and if we'd rather keep the discussion there, I am fine with that)

@ovflowd
Copy link
Member

ovflowd commented Nov 11, 2024

BTW @redyetidev CodeQL complained about your code, that it might have a security vuln; Mind giving an eye? 👀

README.md Show resolved Hide resolved
@avivkeller
Copy link
Member Author

BTW @redyetidev CodeQL complained about your code, that it might have a security vuln; Mind giving an eye? 👀

#142 (comment)

src/constants.mjs Outdated Show resolved Hide resolved
@flakey5
Copy link
Member

flakey5 commented Nov 11, 2024

I was either traveling or getting over jet lag this weekend so I wasn't able to respond much to the comments made on #92, I would've appreciated a little more time to respond to the comments made but it's water under the bridge.

Imo it makes sense to continue with this one since the commits are already here and it's pretty much done, still need to make sure the unresolved comments in #92 are addressed here however

@avivkeller
Copy link
Member Author

I would've appreciated a little more time to respond to the comments made but it's water under the bridge.

Sorry!! Thank you for understanding. Again, I'm happy to instead have this merged into your PR, I really don't want to take over your amazing work

@avivkeller
Copy link
Member Author

I’ve attempted to resolve the review comments, when you get a chance, let me know if there are any other concerns.

Copy link
Member

@ovflowd ovflowd left a comment

Choose a reason for hiding this comment

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

I think we're almost there. Left a final round of comments. I'd also like to have some benchmarks, how long does the tooling take to run with all the doc files for only the legacy-json generator, and if long enough would you be able to attach a debugger and find slow paths?

@ovflowd
Copy link
Member

ovflowd commented Nov 20, 2024

(BTW, I wanted to clarify that this is fantastic work! I enormously appreciate your effort here!)

@avivkeller
Copy link
Member Author

(BTW, I wanted to clarify that this is fantastic work! I enormously appreciate your effort here!)

And I appreciate your reviews! And @flakey5's initial PR!

@avivkeller
Copy link
Member Author

avivkeller commented Nov 20, 2024

I think we're almost there. Left a final round of comments. I'd also like to have some benchmarks, how long does the tooling take to run with all the doc files for only the legacy-json generator, and if long enough would you be able to attach a debugger and find slow paths?

I'll look for slow paths. Right now (for fs):

real    0m1.765s
user    0m2.718s
sys     0m0.260s

@avivkeller
Copy link
Member Author

there really aren't too many slow paths, I think we are good:
image

The really long "on ignore list" at the beginning is Remark.

@ovflowd
Copy link
Member

ovflowd commented Nov 23, 2024

I see, how long does it take for running this with all current doc files? Just wanted a number of how long it takes to run locally. I unfortunately didn't have time yet to test this locally 🙈

Copy link
Member

@ovflowd ovflowd left a comment

Choose a reason for hiding this comment

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

LGTM! I think we are good to merge this 🤷

Technically speaking, this was the last blocker for replacing the current API doc tooling on nodejs/node.

@ovflowd
Copy link
Member

ovflowd commented Nov 23, 2024

cc @nodejs/web-infra for 2nd reviews :)

Copy link
Member

@AugustinMauroy AugustinMauroy left a comment

Choose a reason for hiding this comment

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

SGTM ! There's just no unit testing, I suspect because it's legacy?

src/generators/legacy-json/constants.mjs Outdated Show resolved Hide resolved
src/generators/legacy-json/utils/buildSection.mjs Outdated Show resolved Hide resolved
src/generators/legacy-json/utils/buildSection.mjs Outdated Show resolved Hide resolved
@ovflowd
Copy link
Member

ovflowd commented Nov 25, 2024

Bump @redyetidev :)

@avivkeller
Copy link
Member Author

avivkeller commented Nov 25, 2024

Ack! I missed your last comment, thanks for the bump. I'm currently on vacation, so this benchmark was run on a much slower device, but:

All

61.65s user
2.59s system
59.438 total

FS (for reference)

8.43s user
0.64s system
6.272 total

Assuming that this was run on the same device as last time, there would be a 380.73% decrease in execution time, leaving us with around 16 seconds.

Still, the majority of the time was just the time it took to parse the markdown.

@avivkeller avivkeller added the enhancement New feature or request label Nov 25, 2024
@ovflowd
Copy link
Member

ovflowd commented Nov 25, 2024

LGTM!

@ovflowd ovflowd merged commit 8f40d5c into nodejs:main Nov 25, 2024
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

transformTypeToReferenceLink is executed after the AST is parsed. Add json generator
5 participants