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

build(log-viewer-webui-client): Switch from Webpack to Vite for bundling; Convert the codebase to TypeScript. #645

Open
wants to merge 38 commits into
base: main
Choose a base branch
from

Conversation

junhaoliao
Copy link
Member

@junhaoliao junhaoliao commented Dec 26, 2024

⚠️ This PR depends on y-scope/eslint-config-yscope#3 . Do not merge this PR till that PR is merged.

Description

  1. Switch from Webpack to Vite for bundling. Note: changes in this PR are based on the official template at https://github.com/vitejs/vite/tree/8639538e6498d1109da583ad942c1472098b5919/packages/create-vite/template-react-ts
  2. Convert the codebase to TypeScript.
  3. Update dependencies.

Validation performed

  1. Built the package: https://docs.yscope.com/clp/main/dev-guide/building-package
  2. Started the package: https://docs.yscope.com/clp/main/user-guide/quick-start-cluster-setup/single-node.html
  3. Compressed sample files: clp-package/sbin/compress.sh ~/samples/hive-24hr.
  4. Loaded the webui http://localhost:4000 in a Microsoft Edge browser.
  5. Performed a search with query string "1".
  6. On the first result, clicked the "View log event in context" button which brought up the log-viewer-webui-client page in a new tab. Later, the log viewer loaded up the log viewer which displayed the log in the context. Comparing the query result from the CLP webui and the one at the log viewer cursor and confirmed they match which should suggest the logEventNum parameter is also correctly passed.

Debug mode

  1. clp-package/sbin/stop-clp.sh log_viewer_webui.
  2. cd clp/component/log-viewer-webui; npm i; npm start
  3. Repeat step 7, in the "log-viewer-webui-client page in the new tab", change the port in the address bar to 8080 and observed successful extraction job completion. The redirection to yscope-log-viewer would not work because the viewer app is not served at the same address.

Summary by CodeRabbit

  • New Features

    • Introduced an enhanced query interface with improved progress indicators and error feedback for a smoother log retrieval experience.
    • Added a new QueryStatus component for better management of query submissions and states.
  • Refactor

    • Transitioned to a statically typed codebase using TypeScript and updated the build process to Vite for improved performance and maintainability.
  • Chores

    • Upgraded dependencies, revised project metadata, and refreshed configuration to align with modern standards.

Copy link
Contributor

coderabbitai bot commented Dec 26, 2024

Warning

Rate limit exceeded

@junhaoliao has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 23 minutes and 4 seconds before requesting another review.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

📥 Commits

Reviewing files that changed from the base of the PR and between 595f3ea and 4e35ab8.

📒 Files selected for processing (1)
  • components/log-viewer-webui/client/src/ui/QueryStatus.tsx (1 hunks)

Walkthrough

This pull request transitions the log viewer web UI from JavaScript to TypeScript and updates the build process from Webpack to Vite. Key changes include a modified package.json with updated dependencies and scripts, the removal of outdated Webpack configuration, and the introduction of new TypeScript configuration files. API functions have been migrated from JavaScript to TypeScript with added type definitions, and several UI components have been updated for improved type safety and import consistency. Additionally, the ESLint setup and task commands have been adjusted to better reflect the new toolchain.

Changes

Files Change Summary
components/log-viewer-webui/client/package.json Updated main entry from src/index.jsx to src/main.tsx; build scripts now run TypeScript compilation and Vite build; dependency revisions include new packages (e.g., @emotion/react, axios, react, etc.) and removal of Webpack-related packages.
components/log-viewer-webui/client/src/App.tsx Updated import statements: simplified MUI import, changed local storage key import, and removed file extensions from component imports; modified JSDoc comment syntax.
components/log-viewer-webui/client/src/api/query.js
components/log-viewer-webui/client/src/api/query.ts
Removed legacy query.js; added new query.ts featuring the submitExtractStreamJob function with TypeScript types and the ExtractStreamResp interface.
components/log-viewer-webui/client/src/typings/common.ts
components/log-viewer-webui/client/src/typings/config.ts
components/log-viewer-webui/client/src/typings/query.ts
Added a new Nullable<T> type alias; introduced new enums (QUERY_LOADING_STATE, QUERY_JOB_TYPE), constants, and interfaces for query management; added a new enum LOCAL_STORAGE_KEY for configuration.
components/log-viewer-webui/client/src/ui/Loading.tsx Introduced TypeScript interfaces for component props (LoadingStepProps and LoadingProps); updated component signatures and logic to utilise new loading state constants.
components/log-viewer-webui/client/src/ui/QueryStatus.tsx Added a new component to manage query submission, URL parameter parsing, error handling, and state updates leading to redirection.
components/log-viewer-webui/client/tsconfig.json Added a new TypeScript configuration file referencing both app and node-specific configurations.
components/log-viewer-webui/client/webpack.config.js Removed the legacy Webpack configuration file.
Taskfile.yml Updated task definitions to include new source files (HTML, TSConfig files) and modified file patterns to use TypeScript (.ts, .tsx) instead of JavaScript (.jsx); explicit build commands for different components.
components/log-viewer-webui/client/index.html Modified the HTML title and meta tags; added a module script tag to load the new src/main.tsx file.
components/log-viewer-webui/client/src/main.tsx Introduced a new entry point for the React app using TypeScript, initializing the application with StrictMode.
components/log-viewer-webui/client/src/vite-env.d.ts Added a reference to Vite client types to enable proper TypeScript autocompletion and type checking.
components/log-viewer-webui/client/vite.config.ts Added a new Vite configuration file with the React plugin, server settings (port 8080), and a proxy for /query requests.
components/log-viewer-webui/client/eslint.config.mjs Introduced a new ESLint configuration file that aggregates common, React, stylistic, and TypeScript-specific rules with overrides for project-specific files.
components/log-viewer-webui/client/tsconfig/tsconfig.app.json
components/log-viewer-webui/client/tsconfig/tsconfig.base.json
components/log-viewer-webui/client/tsconfig/tsconfig.node.json
Introduced additional TypeScript configuration files to manage app, base, and node-specific settings, ensuring strict type-checking and updated module handling.

Sequence Diagram(s)

sequenceDiagram
    participant U as User
    participant QS as QueryStatus Component
    participant API as API Layer (submitExtractStreamJob)
    participant AX as Axios
    participant LV as Log Viewer

    U->>QS: Load page and render component
    QS->>QS: Parse & validate URL parameters
    QS->>API: Call submitExtractStreamJob with parameters
    API->>AX: POST request to /query/extract-stream
    AX-->>API: Response with stream data
    API-->>QS: Return response data
    QS->>QS: Update query state (LOADING/Error)
    alt On Success
      QS->>LV: Redirect to log viewer with query parameters
    else On Error
      QS->>QS: Display error via Loading component
    end
Loading

Suggested reviewers

  • kirkrodrigues

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@junhaoliao junhaoliao marked this pull request as ready for review December 26, 2024 10:39
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (4)
components/log-viewer-webui/client/src/index.tsx (1)

9-10: Consider gracefully handling potential null references.

While the non-null assertion operator (!) informs TypeScript that the element will never be null, it could still lead to runtime errors if the element does not actually exist. It might be safer to throw an error or provide a fallback to handle this scenario more robustly.

Below is a sample approach:

-const root = createRoot(document.getElementById("root")!);
+const rootElement = document.getElementById("root");
+if (false == rootElement) {
+    throw new Error("Root element not found in DOM");
+}
+const root = createRoot(rootElement);
components/log-viewer-webui/client/src/App.tsx (1)

10-10: Confirm JSDoc return annotation.

Removing the explicit return type is often fine in TypeScript since return types can be inferred. However, please ensure that your documentation accurately reflects the function’s intended return structure.

components/log-viewer-webui/client/src/api/query.ts (1)

29-44: Enhance error handling and request cancellation.

While submitExtractStreamJob is straightforward, consider adding optional request cancellation (via Axios.cancelToken) or error handling to avoid unhandled promise rejections if the server or network fails.

components/log-viewer-webui/client/src/ui/QueryStatus.tsx (1)

29-29: Document return values more explicitly.
Please clarify the returned type or structure to help future readers understand the component’s outcome.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 329edf6 and 3444981.

⛔ Files ignored due to path filters (1)
  • components/log-viewer-webui/client/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (12)
  • components/log-viewer-webui/client/package.json (2 hunks)
  • components/log-viewer-webui/client/src/App.tsx (1 hunks)
  • components/log-viewer-webui/client/src/api/query.js (0 hunks)
  • components/log-viewer-webui/client/src/api/query.ts (1 hunks)
  • components/log-viewer-webui/client/src/index.tsx (1 hunks)
  • components/log-viewer-webui/client/src/typings/common.ts (1 hunks)
  • components/log-viewer-webui/client/src/typings/query.js (0 hunks)
  • components/log-viewer-webui/client/src/typings/query.ts (1 hunks)
  • components/log-viewer-webui/client/src/ui/Loading.tsx (3 hunks)
  • components/log-viewer-webui/client/src/ui/QueryStatus.tsx (3 hunks)
  • components/log-viewer-webui/client/tsconfig.json (1 hunks)
  • components/log-viewer-webui/client/webpack.config.js (4 hunks)
💤 Files with no reviewable changes (2)
  • components/log-viewer-webui/client/src/api/query.js
  • components/log-viewer-webui/client/src/typings/query.js
✅ Files skipped from review due to trivial changes (1)
  • components/log-viewer-webui/client/src/typings/common.ts
🧰 Additional context used
📓 Path-based instructions (7)
components/log-viewer-webui/client/src/index.tsx (1)

Pattern **/*.{cpp,hpp,java,js,jsx,ts,tsx}: - Prefer false == <expression> rather than !<expression>.

components/log-viewer-webui/client/webpack.config.js (1)

Pattern **/*.{cpp,hpp,java,js,jsx,ts,tsx}: - Prefer false == <expression> rather than !<expression>.

components/log-viewer-webui/client/src/App.tsx (1)

Pattern **/*.{cpp,hpp,java,js,jsx,ts,tsx}: - Prefer false == <expression> rather than !<expression>.

components/log-viewer-webui/client/src/api/query.ts (1)

Pattern **/*.{cpp,hpp,java,js,jsx,ts,tsx}: - Prefer false == <expression> rather than !<expression>.

components/log-viewer-webui/client/src/ui/Loading.tsx (1)

Pattern **/*.{cpp,hpp,java,js,jsx,ts,tsx}: - Prefer false == <expression> rather than !<expression>.

components/log-viewer-webui/client/src/typings/query.ts (1)

Pattern **/*.{cpp,hpp,java,js,jsx,ts,tsx}: - Prefer false == <expression> rather than !<expression>.

components/log-viewer-webui/client/src/ui/QueryStatus.tsx (1)

Pattern **/*.{cpp,hpp,java,js,jsx,ts,tsx}: - Prefer false == <expression> rather than !<expression>.

🔇 Additional comments (48)
components/log-viewer-webui/client/src/App.tsx (2)

1-1: Confirm updated import path for CssVarsProvider.

The new import path @mui/joy is correct for the current version of MUI Joy. Please confirm that this is aligned with your package.json dependencies.


3-4: Ensure consistent usage of TypeScript imports.

Dropping the file extensions is appropriate given your tsconfig settings. Double-check that all references to these imports have been updated accordingly in the rest of the project.

components/log-viewer-webui/client/src/api/query.ts (4)

1-4: Validate Axios import for TypeScript usage.

Your imports from Axios are compatible with TypeScript. Ensure that your tsconfig includes the necessary type definitions for Axios to avoid runtime or type definition issues.


6-16: Enum usage for QUERY_JOB_TYPE.

Leveraging QUERY_JOB_TYPE in TypeScript helps prevent invalid job-type values. Confirm that calling code passes valid enum members.


9-16: Check interface fields align with backend schema.

The fields in ExtractStreamResp appear to match typical streaming extraction responses. Confirm with backend docs that the field names (begin_msg_ix, is_last_chunk, etc.) remain stable or forward-compatible.


46-46: Export structure is consistent with TypeScript norms.

Exporting submitExtractStreamJob from this file provides a clean API surface for your data-fetching logic. Good work keeping it readable and modular.

components/log-viewer-webui/client/src/typings/query.ts (6)

1-5: Numeric enum usage is valid.

Using numeric enums for QUERY_LOADING_STATE is fine. If you ever need more explicit debugging or logging, consider string enums or an equivalent mapping for greater clarity.


7-12: Filtering enum values to numeric types.

The approach of filtering out string enum keys from the Object.values(QUERY_LOADING_STATE) array is efficient. This logic is correct for numeric enums.


14-18: QUERY_JOB_TYPE validity.

Ensure these job types don’t overlap with existing or potential future ones. Numeric enums can inadvertently overlap if not carefully tracked, so consider a stable numbering scheme.


20-23: Interface definitions match usage.

QueryLoadingStateDescription is clearly structured. Nicely done on using a separate interface for clarity.


28-43: Providing descriptive labels is helpful.

QUERY_LOADING_STATE_DESCRIPTIONS nicely documents each enum’s purpose. This improves maintainability. Great usage of Object.freeze for immutability.


45-50: Exports are well-organized.

All relevant symbols are exported for external usage. This aligns with a neat and modular TypeScript codebase.

components/log-viewer-webui/client/webpack.config.js (7)

36-36: Entry point switched to TypeScript index.

Switching from index.jsx to index.tsx is consistent with the migration to TypeScript. Verify that your scripts and references in package.json also reflect this change.


37-39: Mode configuration is correct.

Using environment-based modes is standard practice. Ensure that your build process sets NODE_ENV correctly.


43-43: Refined test pattern for TS/TSX.

Updating the regex ensures proper handling of .ts/.tsx files. Confirm that .js or .jsx is no longer needed if you’ve fully migrated.


56-56: Added TypeScript Babel preset.

Including @babel/preset-typescript is crucial for transpiling TypeScript. Looks good.


73-87: SplitChunks for better performance.

Your splitChunks configuration ensures proper vendor chunking to boost caching and reduce bundle sizes. Good practice.


103-104: Extended resolve with TS/TSX.

Adding .ts/.tsx to resolve.extensions is correct for a TypeScript codebase. Confirm that any .jsx references are not needed.


109-109: Exporting config object.

Exporting the Webpack config object is a clean approach that simplifies usage. Nice move.

components/log-viewer-webui/client/src/ui/QueryStatus.tsx (8)

7-7: Implementation of isAxiosError is beneficial.
This import helps refine error handling for Axios requests, ensuring more accurate detection of Axios-related issues.


9-15: Imports for new type definitions appear streamlined.
Bringing in submitExtractStreamJob, Nullable, and the QUERY_LOADING_STATE constants from separate files fosters modularity and clarity.


32-35: Adoption of strong state typing looks solid.
Using generic types for useState clarifies the permissible values, reducing unintended usage.


57-57: Confirm logical intention of false === streamType in EXTRACT_JOB_TYPE.
While this meets the style preference for false == expression, the operator precedence may be confusing. Consider adding parentheses or using an explicit check (e.g. false == (streamType in EXTRACT_JOB_TYPE)) to convey your intent more clearly.


64-65: Sanitizing user input is prudent.
Using Number() ensures logEventIdx is converted to a numeric type. This helps avoid injection issues and fosters type consistency.


70-72: Updating state on job submission is accurate.
Transitioning to the WAITING state upon submission clarifies the user that a process is in progress.


76-79: Smooth transition to LOADING with correct offset usage.
Calculating innerLogEventNum ensures the log event index aligns with the server’s base offset. Redirection is correct, and usage of window.location.href is consistent with the new approach.


82-84: Comprehensive error handling.
Distinguishing Axios errors from general exceptions helps provide more accurate feedback to the user. Good approach.

components/log-viewer-webui/client/src/ui/Loading.tsx (9)

1-1: Neat import of React.
Explicitly importing React ensures consistent usage of JSX transformations under the TypeScript environment.


12-12: DefaultColorPalette usage is consistent.
Allows for a typed palette configuration, reducing the risk of undefined colour usage.


14-14: Nullable type fosters clarity for optional fields.
This approach clearly conveys which properties can be null, enhancing reliability.


16-19: Use of enumerated states simplifies logic.
Referencing QUERY_LOADING_STATE and related constants reduces magic strings.


24-31: LoadingStepProps interface definitions are straightforward.
These type annotations provide clarity for each required prop, reducing guesswork for future contributors.


49-50: Conditional colour assignment is intuitive.
The code clearly differentiates active and error states, enhancing readability.


84-87: LoadingProps interface is well-defined.
Specifying these types ensures consistent usage of currentState and errorMsg throughout the component.


97-100: Structured destructuring of props.
Explicitly typed parameters help TypeScript detect possible misuses at compile time.


101-103: Building steps array based on states improves maintainability.
Looping through known state values in QUERY_LOADING_STATE_VALUES helps ensure all defined states are handled.

components/log-viewer-webui/client/package.json (4)

5-5: Switching main entry to src/index.tsx is appropriate.
Reflects the recent TypeScript migration, ensuring the build references the correct entry point.


7-7: Upgrading the build script.
Using --config-node-env production aligns with the updated webpack CLI usage, which resolves deprecation in older versions.


16-35: Dependency updates facilitate TypeScript support.
Including @babel/preset-typescript plus updated Babel/webpack dependencies is crucial for the TypeScript build pipeline.


36-86: Dependencies reorganized for clarity and usage.
Promoting relevant libraries (e.g. react, axios) into dependencies ensures they are accessible in production. ESlint configuration is robust, with coverage for TypeScript files.

components/log-viewer-webui/client/tsconfig.json (8)

1-7: Inclusion/exclusion paths are clearly defined.
This separation ensures extraneous files such as node_modules do not affect compilation time or produce unnecessary errors.


8-35: Targeting ES2022 with DOM library is appropriate.
Allows usage of next-gen JavaScript features while supporting browser-based functionalities.


39-44: ESNext module system with bundler resolution is modern.
Harmonizes well with contemporary bundlers and ensures top-level await or other ESNext features can be leveraged.


50-58: Permitting JSON imports is beneficial.
This functionality can consolidate certain config or data definitions directly into the TypeScript code.


63-67: allowJs and checkJs help unify JS and TS.
This configuration is valuable during transitional phases, ensuring JS still gets type-checked where possible.


74-83: sourceMap and noEmit are well-chosen.
Emitting source maps aids debugging, while noEmit clarifies that compiled output is handled by the bundler.


100-106: Enabling isolated modules and ES module interop is standard.
Helps ensure each file is self-sufficient during transpilation, plus broadens import compatibility for third-party modules.


108-143: Strict type checking is thoroughly configured.
Enabling strict mode and measures such as noImplicitAny, strictNullChecks, and noUnusedLocals fosters maintainable, predictable code.

Copy link
Member Author

Choose a reason for hiding this comment

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

Copy link
Member Author

Choose a reason for hiding this comment

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

This comment no longer applies.

The linting rules are indeed ported to tsconfig.node.ts and tsconfig.app.ts though.

@@ -0,0 +1,152 @@
{
"include": [
"src",
Copy link
Member Author

Choose a reason for hiding this comment

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

compared to the one in yscope-log-viewer, removed

    "jest.config.ts",
    "test",

/* Specify a set of bundled library declaration files that describe the target runtime environment. */
"lib": [
"ES2022",
"DOM",
Copy link
Member Author

Choose a reason for hiding this comment

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

compared to the one in yscope-log-viewer, removed

      "DOM.Iterable",
      "WebWorker",

],
},
};

export default () => {
Copy link
Member Author

Choose a reason for hiding this comment

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

@kirkrodrigues I don't recall if we discussed this for #468 - Did we have to export a function and change the config.mode dynamically? Can we simply define the mode in the above config object and return the object directly?

Copy link
Member

Choose a reason for hiding this comment

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

Yeah, that's my understanding based on this: https://webpack.js.org/configuration/configuration-types/#exporting-a-function

I think the old code was wrong since it should've been using the env argument to determine whether it was prod/dev rather than isProduction. Based on a glance at this, I guess we shouldn't be using process.env.NODE_ENV in a webpack config.

Copy link
Member Author

Choose a reason for hiding this comment

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

Gotcha. Let me defer this after investigating the viability of turning the app into a Vite-React app.

Copy link
Member Author

Choose a reason for hiding this comment

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

The attempt to migrate to Vite was effortless and they provide all what we need with very simple configuration interfaces. I think we can stick with Vite in this project.

@@ -33,11 +33,14 @@ const config = {
devtool: isProduction ?
"source-map" :
"eval-source-map",
entry: path.resolve(dirname, "src", "index.jsx"),
entry: path.resolve(dirname, "src", "index.tsx"),
mode: isProduction ?
Copy link
Member Author

Choose a reason for hiding this comment

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

Note this was moved from the default-exported function.

@junhaoliao
Copy link
Member Author

Alternatively, shall we look into turning this into a Vite-React app? That way we don't have to manage the build configs on our own with webpack.

@kirkrodrigues
Copy link
Member

Alternatively, shall we look into turning this into a Vite-React app? That way we don't have to manage the build configs on our own with webpack.

We could, I guess.

@junhaoliao junhaoliao changed the title chore(log-viewer-webui-client): Convert the codebase to TypeScript; Update dependencies. chore(log-viewer-webui-client): Convert the codebase to TypeScript; Switch from Webpack to Vite for bundling. Dec 29, 2024
@junhaoliao junhaoliao changed the title chore(log-viewer-webui-client): Convert the codebase to TypeScript; Switch from Webpack to Vite for bundling. chore(log-viewer-webui-client): Switch from Webpack to Vite for bundling; Convert the codebase to TypeScript. Dec 29, 2024
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (7)
components/log-viewer-webui/client/tsconfig.node.json (2)

3-7: Consider relocating tsBuildInfo and reviewing skipLibCheck setting

Two suggestions for improvement:

  1. Consider moving tsBuildInfoFile outside of node_modules to avoid CI/CD caching issues. A better location would be .ts-cache or similar.
  2. The skipLibCheck: true setting might hide type issues in dependencies. Consider setting it to false if build time permits.
-    "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
+    "tsBuildInfoFile": "./.ts-cache/tsconfig.node.tsbuildinfo",

16-21: Consider enabling additional strict checks

The current strict checks are good, but consider enabling these additional TypeScript checks for better type safety:

  • noImplicitReturns: Ensure all code paths return a value
  • exactOptionalPropertyTypes: More precise optional property types
  • noPropertyAccessFromIndexSignature: Prevent typos in property access
     "strict": true,
     "noUnusedLocals": true,
     "noUnusedParameters": true,
     "noFallthroughCasesInSwitch": true,
-    "noUncheckedSideEffectImports": true
+    "noUncheckedSideEffectImports": true,
+    "noImplicitReturns": true,
+    "exactOptionalPropertyTypes": true,
+    "noPropertyAccessFromIndexSignature": true
🧰 Tools
🪛 Biome (1.9.4)

[error] 16-16: JSON standard does not allow comments.

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)

components/log-viewer-webui/client/tsconfig.app.json (2)

18-23: Consider additional type-checking options

The current linting configuration is good, but could be enhanced with these additional checks:

 {
   "compilerOptions": {
     /* Linting */
     "strict": true,
     "noUnusedLocals": true,
     "noUnusedParameters": true,
     "noFallthroughCasesInSwitch": true,
-    "noUncheckedSideEffectImports": true
+    "noUncheckedSideEffectImports": true,
+    "noImplicitReturns": true,
+    "exactOptionalPropertyTypes": true,
+    "noPropertyAccessFromIndexSignature": true
   }
 }
🧰 Tools
🪛 Biome (1.9.4)

[error] 18-18: JSON standard does not allow comments.

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


25-25: Consider more specific include/exclude paths

The current configuration includes all files under src. Consider adding an exclude array to filter out test files and other non-app code:

 {
   "compilerOptions": {
     // ... existing options ...
   },
-  "include": ["src"]
+  "include": ["src"],
+  "exclude": ["src/**/*.test.ts", "src/**/*.test.tsx", "src/**/*.spec.ts", "src/**/*.spec.tsx"]
 }
🧰 Tools
🪛 Biome (1.9.4)

[error] 25-25: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 25-25: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 25-25: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 25-26: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)

components/log-viewer-webui/client/vite.config.ts (1)

1-18: Consider environment variables for development and production differences.

Currently, the server proxy is hard-coded to http://localhost:3000/query. You may want to employ environment variables (e.g., process.env.NODE_ENV for dev or production) or a .env file to manage different URLs. This would enhance deploy-time flexibility.

components/log-viewer-webui/client/package.json (2)

5-5: Use a more descriptive entry name if desired.

While "main": "src/main.tsx" is valid, you could consider using a more descriptive name to indicate the application’s entry point. This is purely a stylistic choice that might help distinguish from other modules.


15-22: Document newly introduced dependencies.

The new dependencies (@emotion/*, axios, etc.) should be noted in the project’s documentation to inform future maintainers of their usage. This is especially important when adopting UI libraries like MUI Joy.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3444981 and 8b03576.

⛔ Files ignored due to path filters (1)
  • components/log-viewer-webui/client/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (10)
  • Taskfile.yml (2 hunks)
  • components/log-viewer-webui/client/index.html (1 hunks)
  • components/log-viewer-webui/client/package.json (1 hunks)
  • components/log-viewer-webui/client/src/main.tsx (1 hunks)
  • components/log-viewer-webui/client/src/vite-env.d.ts (1 hunks)
  • components/log-viewer-webui/client/tsconfig.app.json (1 hunks)
  • components/log-viewer-webui/client/tsconfig.json (1 hunks)
  • components/log-viewer-webui/client/tsconfig.node.json (1 hunks)
  • components/log-viewer-webui/client/vite.config.ts (1 hunks)
  • components/log-viewer-webui/client/webpack.config.js (0 hunks)
💤 Files with no reviewable changes (1)
  • components/log-viewer-webui/client/webpack.config.js
✅ Files skipped from review due to trivial changes (1)
  • components/log-viewer-webui/client/src/vite-env.d.ts
🚧 Files skipped from review as they are similar to previous changes (1)
  • components/log-viewer-webui/client/tsconfig.json
🧰 Additional context used
📓 Path-based instructions (2)
components/log-viewer-webui/client/vite.config.ts (1)

Pattern **/*.{cpp,hpp,java,js,jsx,ts,tsx}: - Prefer false == <expression> rather than !<expression>.

components/log-viewer-webui/client/src/main.tsx (1)

Pattern **/*.{cpp,hpp,java,js,jsx,ts,tsx}: - Prefer false == <expression> rather than !<expression>.

🪛 Biome (1.9.4)
components/log-viewer-webui/client/tsconfig.node.json

[error] 9-9: JSON standard does not allow comments.

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: JSON standard does not allow comments.

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-24: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)

components/log-viewer-webui/client/tsconfig.app.json

[error] 10-10: JSON standard does not allow comments.

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: JSON standard does not allow comments.

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 24-24: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 25-25: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 25-25: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 25-25: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 25-26: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)

🔇 Additional comments (9)
components/log-viewer-webui/client/tsconfig.node.json (2)

9-14: Bundler configuration is well-suited for Vite

The bundler settings are appropriately configured for a Vite-based TypeScript project. The combination of moduleResolution: "bundler" with allowImportingTsExtensions and isolatedModules ensures compatibility with Vite's development and build processes.

🧰 Tools
🪛 Biome (1.9.4)

[error] 9-9: JSON standard does not allow comments.

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


23-23: Include pattern is appropriate

The include pattern correctly targets only the Vite configuration file, which is appropriate for a Node-specific TypeScript configuration.

🧰 Tools
🪛 Biome (1.9.4)

[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-24: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)

components/log-viewer-webui/client/tsconfig.app.json (2)

10-16: LGTM! Bundler configuration is well-suited for Vite

The bundler mode settings are appropriately configured for a Vite-React application, with proper module resolution and JSX handling.

🧰 Tools
🪛 Biome (1.9.4)

[error] 10-10: JSON standard does not allow comments.

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


3-8: Consider the implications of skipLibCheck

The skipLibCheck option is enabled, which skips type-checking of declaration files. While this speeds up compilation, it might hide type errors from dependencies.

Run this script to check if any declaration files have known issues:

✅ Verification successful

skipLibCheck is appropriate for this configuration

Based on the analysis of the project structure and dependencies:

  • The project has minimal TypeScript declaration files (only vite-env.d.ts)
  • Uses modern dependencies with well-maintained type definitions
  • Is a Vite-based React application with TypeScript configuration
  • Has proper ESLint configuration for type checking

The skipLibCheck setting is justified here as:

  1. It speeds up the build process
  2. The project relies on well-tested npm packages
  3. Type checking is still performed on the project's source code
  4. The development setup includes ESLint for additional type safety
🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Check for potential type issues in declaration files
# Look for .d.ts files with @ts-ignore or @ts-nocheck
rg -t ts "(@ts-ignore|@ts-nocheck)" --glob "*.d.ts"

Length of output: 53


Script:

#!/bin/bash
# Let's check for declaration files first to understand the scope
fd "\.d\.ts$"

# Also check package.json to understand dependencies that might need type checking
fd "package.json$" --exec cat {}

Length of output: 5294

components/log-viewer-webui/client/src/main.tsx (1)

9-10: Acknowledge use of non-null assertion.

The non-null assertion operator here, although acceptable, may hide potential null reference errors. An alternative approach could include a conditional check for the element’s existence, or an optional chaining with a fallback. Evaluate whether you want to rely on a strict assertion or implement a more defensive pattern.

components/log-viewer-webui/client/index.html (1)

1-18: Good choice of updated metadata and script handling.

The newly introduced script tag for TypeScript is properly defined, and the updated meta tags consistently reflect best practices for responsive design. This is a clear step towards a well-structured client application.

components/log-viewer-webui/client/package.json (2)

7-10: Confirm linting best practices.

With "lint:check": "eslint" and "lint:fix": "eslint --fix", ensure that the correct lint configurations (including TypeScript rules) are loaded. Otherwise, some TypeScript-specific issues may be overlooked.


24-29: Ensure TypeScript configuration is consistent.

You are referencing "typescript": "~5.6.2". Confirm that your tsconfig files align with the intended TS version. Also, maintain consistent TS practices across your devDependencies and build scripts.

Taskfile.yml (1)

227-232: Source files properly updated for TypeScript migration!

The changes correctly reflect the transition to TypeScript by:

  • Adding TypeScript configuration files
  • Including .ts and .tsx source files
  • Adding index.html for the client entry point

Taskfile.yml Outdated
Comment on lines 250 to 257
- |-
cd "client"
PATH="{{.G_NODEJS_22_BIN_DIR}}":$PATH npm run build -- \
--outDir "{{.OUTPUT_DIR}}/client"
- |-
cd "yscope-log-viewer"
PATH="{{.G_NODEJS_22_BIN_DIR}}":$PATH npm run build -- \
--output-path "{{.OUTPUT_DIR}}/yscope-log-viewer"
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue

Fix indentation in build commands

The build commands have inconsistent indentation which could cause YAML parsing issues.

Apply this diff to fix the indentation:

      - |-
        cd "client"
        PATH="{{.G_NODEJS_22_BIN_DIR}}":$PATH npm run build -- \
-        --outDir "{{.OUTPUT_DIR}}/client"
+          --outDir "{{.OUTPUT_DIR}}/client"
      - |-
        cd "yscope-log-viewer"
        PATH="{{.G_NODEJS_22_BIN_DIR}}":$PATH npm run build -- \
-        --output-path "{{.OUTPUT_DIR}}/yscope-log-viewer"
+          --output-path "{{.OUTPUT_DIR}}/yscope-log-viewer"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- |-
cd "client"
PATH="{{.G_NODEJS_22_BIN_DIR}}":$PATH npm run build -- \
--outDir "{{.OUTPUT_DIR}}/client"
- |-
cd "yscope-log-viewer"
PATH="{{.G_NODEJS_22_BIN_DIR}}":$PATH npm run build -- \
--output-path "{{.OUTPUT_DIR}}/yscope-log-viewer"
- |-
cd "client"
PATH="{{.G_NODEJS_22_BIN_DIR}}":$PATH npm run build -- \
--outDir "{{.OUTPUT_DIR}}/client"
- |-
cd "yscope-log-viewer"
PATH="{{.G_NODEJS_22_BIN_DIR}}":$PATH npm run build -- \
--output-path "{{.OUTPUT_DIR}}/yscope-log-viewer"

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (8)
Taskfile.yml (1)

250-257: Add comments to clarify the build tools in use.

While the build commands are well-structured, it would be helpful to add comments indicating that these are Vite and webpack builds respectively.

Apply this diff to improve clarity:

      - |-
        cd "client"
+       # Build the client using Vite
        PATH="{{.G_NODEJS_22_BIN_DIR}}":$PATH npm run build -- \
          --outDir "{{.OUTPUT_DIR}}/client"
      - |-
        cd "yscope-log-viewer"
+       # Build the log viewer using webpack
        PATH="{{.G_NODEJS_22_BIN_DIR}}":$PATH npm run build -- \
          --output-path "{{.OUTPUT_DIR}}/yscope-log-viewer"
components/log-viewer-webui/client/src/api/query.ts (2)

9-16: Consider adding JSDoc comments to interface fields.

While the interface is well-structured, adding documentation for each field would improve code maintainability and make the purpose of each field clearer to other developers.

 interface ExtractStreamResp {
+    /** Unique identifier for the extraction job */
     _id: string;
+    /** Starting message index in the stream */
     begin_msg_ix: number;
+    /** Ending message index in the stream */
     end_msg_ix: number;
+    /** Indicates if this is the final chunk of the stream */
     is_last_chunk: boolean;
+    /** File path to the extracted stream */
     path: string;
+    /** Identifier of the stream being extracted */
     stream_id: string;
 }

19-44: Consider enhancing error handling and configuration.

Two suggestions for improvement:

  1. Add explicit error handling with typed error responses
  2. Consider making the API endpoint URL configurable

Example implementation:

interface ExtractStreamError {
    code: string;
    message: string;
}

const API_ENDPOINTS = {
    extractStream: '/query/extract-stream'
} as const;

const submitExtractStreamJob = async (
    extractJobType: QUERY_JOB_TYPE,
    streamId: string,
    logEventIdx: number,
    onUploadProgress: (progressEvent: AxiosProgressEvent) => void,
): Promise<AxiosResponse<ExtractStreamResp>> => {
    try {
        return await axios.post(
            API_ENDPOINTS.extractStream,
            {
                extractJobType,
                streamId,
                logEventIdx,
            },
            {onUploadProgress}
        );
    } catch (error) {
        if (axios.isAxiosError<ExtractStreamError>(error)) {
            // Handle specific API errors
            throw new Error(`Extract stream failed: ${error.response?.data.message}`);
        }
        throw error;
    }
};
components/log-viewer-webui/client/src/ui/Loading.tsx (5)

24-30: LGTM! Well-structured TypeScript interfaces.

The type definitions are clear and comprehensive. The use of the Nullable type for errorMsg shows good type reuse practices.

Consider making the props interfaces readonly to prevent accidental mutations:

-interface LoadingStepProps {
+interface LoadingStepProps {
+    readonly description: string;
+    readonly isActive: boolean;
+    readonly isError: boolean;
+    readonly label: string;
+    readonly stepIndicatorText: number | string;
 }

-interface LoadingProps {
+interface LoadingProps {
+    readonly currentState: QUERY_LOADING_STATE;
+    readonly errorMsg: Nullable<string>;
 }

Also applies to: 84-87


33-41: Enhance JSDoc documentation.

The JSDoc comments could be more descriptive and include return type information.

Consider updating the documentation:

 /**
- * Renders a step with a label and description.
+ * Renders a loading step with a label, description, and customizable indicator.
  *
  * @param props
  * @param props.description - Description text for the loading step
  * @param props.isActive - Whether this step is currently active
  * @param props.isError - Whether this step is in an error state
  * @param props.label - Label text for the loading step
  * @param props.stepIndicatorText - Text or number to display in the step indicator
- * @return
+ * @returns {JSX.Element} A styled step component
  */

Line range hint 50-57: Simplify color logic using ternary operator.

The color logic can be more concise while maintaining readability.

Consider this refactor:

-    let color: DefaultColorPalette = isActive ?
-        "primary" :
-        "neutral";
-
-    if (isError) {
-        color = "danger";
-    }
+    const color: DefaultColorPalette = isError ? "danger" : (isActive ? "primary" : "neutral");

131-134: Use TypeScript nullish checks.

Replace explicit null comparisons with TypeScript's nullish checking operator for better idiomatic TypeScript code.

Consider this refactor:

-                    determinate={null !== errorMsg}
-                    color={null === errorMsg ?
+                    determinate={!!errorMsg}
+                    color={errorMsg === null ?

101-102: Optimize steps array generation with useMemo.

The steps array is recreated on every render. Consider memoizing it to improve performance.

Consider this refactor:

-    const steps: React.ReactNode[] = [];
-    QUERY_LOADING_STATE_VALUES.forEach((state) => {
+    const steps = React.useMemo(() => {
+        const stepsArray: React.ReactNode[] = [];
+        QUERY_LOADING_STATE_VALUES.forEach((state) => {

Then wrap the entire steps generation logic in the useMemo hook with appropriate dependencies:

    }, [currentState, errorMsg]);
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8b03576 and 7ac39ee.

⛔ Files ignored due to path filters (1)
  • components/log-viewer-webui/client/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (7)
  • Taskfile.yml (2 hunks)
  • components/log-viewer-webui/client/eslint.config.mjs (1 hunks)
  • components/log-viewer-webui/client/src/api/query.ts (1 hunks)
  • components/log-viewer-webui/client/src/typings/LOCAL_STORAGE_KEY.ts (1 hunks)
  • components/log-viewer-webui/client/src/typings/query.ts (1 hunks)
  • components/log-viewer-webui/client/src/ui/Loading.tsx (4 hunks)
  • components/log-viewer-webui/client/vite.config.ts (1 hunks)
✅ Files skipped from review due to trivial changes (1)
  • components/log-viewer-webui/client/src/typings/LOCAL_STORAGE_KEY.ts
🚧 Files skipped from review as they are similar to previous changes (2)
  • components/log-viewer-webui/client/vite.config.ts
  • components/log-viewer-webui/client/src/typings/query.ts
🧰 Additional context used
📓 Path-based instructions (2)
components/log-viewer-webui/client/src/api/query.ts (1)

Pattern **/*.{cpp,hpp,java,js,jsx,ts,tsx}: - Prefer false == <expression> rather than !<expression>.

components/log-viewer-webui/client/src/ui/Loading.tsx (1)

Pattern **/*.{cpp,hpp,java,js,jsx,ts,tsx}: - Prefer false == <expression> rather than !<expression>.

🔇 Additional comments (9)
Taskfile.yml (1)

227-232: LGTM! Source file patterns updated for TypeScript.

The changes correctly reflect the migration from JSX to TypeScript by:

  • Adding TypeScript configuration files
  • Including the Vite entry point (index.html)
  • Updating source patterns from .jsx to .ts and .tsx
components/log-viewer-webui/client/src/api/query.ts (2)

1-7: LGTM! Well-structured imports.

The imports are properly organized with specific type imports from axios and a clear separation between external and local imports.


46-46: LGTM! Clear and explicit export.

The named export is appropriate and follows TypeScript best practices.

components/log-viewer-webui/client/eslint.config.mjs (6)

1-4: Configuration imports look consistent and aligned with best practices.

Importing the CommonConfig, ReactConfigArray, StylisticConfigArray, and TsConfigArray modules in this manner is idiomatic and helps ensure that these configurations remain modular and comprehendible.


7-13: Folder ignore patterns are appropriate.

Excluding the dist/ and node_modules/ folders from linting is a standard practice, preventing unnecessary checks on distribution builds and third-party packages.


14-23: Effective integration of TsConfigArray.

Aggregating multiple TypeScript configurations using a map function keeps your ESLint rules DRY while extending coverage to both .ts and .tsx files. This approach aligns well with TypeScript-based React projects.


24-34: Targeted overrides for different TypeScript configurations.

Using createTsConfigOverride to specify distinct tsconfig.app.json versus tsconfig.node.json is beneficial for large repositories with diverse environments, as it offers clarity and maintainability. These overrides help ensure TypeScript is correctly configured for client (app) and build-tool (node) code.


35-37: Stylistic and React rules are seamlessly merged.

Adding StylisticConfigArray and ReactConfigArray ensures consistent style enforcement and React-specific linting, promoting maintainable and uniform code across the project.


40-40: Export statement follows modern ECMAScript standards.

Exporting EslintConfig as the default helps with discoverability and import clarity in other parts of the build setup. No issues identified.

<title>Log Viewer Web UI</title>
<meta charset="utf-8"/>
<meta name="description" content="YScope Log Viewer Web UI">
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
Copy link
Member Author

Choose a reason for hiding this comment

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

This is copied from the Vite react-ts tempalte.

</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.tsx"></script>
Copy link
Member Author

Choose a reason for hiding this comment

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

This is copied from the Vite react-ts tempalte.

<!doctype html>
<html lang="en">
<head>
<title>Log Viewer Web UI</title>
Copy link
Member Author

Choose a reason for hiding this comment

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

Added " Web UI"

<head>
<title>Log Viewer Web UI</title>
<meta charset="utf-8"/>
<meta name="description" content="YScope Log Viewer Web UI">
Copy link
Member Author

Choose a reason for hiding this comment

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

Added " Web UI"

Copy link
Member Author

Choose a reason for hiding this comment

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

This needs to be updated once y-scope/eslint-config-yscope#3 is merged and a new version is published.

Copy link
Member Author

Choose a reason for hiding this comment

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

This comment no longer applies.

The linting rules are indeed ported to tsconfig.node.ts and tsconfig.app.ts though.

],
},
};

export default () => {
Copy link
Member Author

Choose a reason for hiding this comment

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

The attempt to migrate to Vite was effortless and they provide all what we need with very simple configuration interfaces. I think we can stick with Vite in this project.

@junhaoliao junhaoliao changed the title chore(log-viewer-webui-client): Switch from Webpack to Vite for bundling; Convert the codebase to TypeScript. build(log-viewer-webui-client): Switch from Webpack to Vite for bundling; Convert the codebase to TypeScript. Dec 29, 2024
@junhaoliao junhaoliao requested review from haiqi96 and davemarco and removed request for kirkrodrigues January 3, 2025 17:22
@junhaoliao
Copy link
Member Author

hey
@haiqi96 : can you help take a look at the Taskfile.yml and see if the changes make sense?
@davemarco : can you review the rest?

@davemarco
Copy link
Contributor

davemarco commented Jan 6, 2025

@davemarco : can you review the rest?

Sure I will review everything except task file.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 1116797 and 580b215.

📒 Files selected for processing (2)
  • components/log-viewer-webui/client/eslint.config.mjs (1 hunks)
  • components/log-viewer-webui/package.json (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • components/log-viewer-webui/client/eslint.config.mjs
⏰ Context from checks skipped due to timeout of 90000ms (3)
  • GitHub Check: lint-check (ubuntu-latest)
  • GitHub Check: build (macos-latest)
  • GitHub Check: lint-check (macos-latest)

@@ -6,7 +6,7 @@
"client:lint:check": "cd client && npm run lint:check",
"client:lint:fix": "cd client && npm run lint:fix",
"client:start": "cd client && npm start",
"init": "npm i && (cd client && npm i) && (cd server && npm i)",
"init": "npm ci && (cd client && npm ci) && (cd server && npm ci)",
Copy link
Contributor

Choose a reason for hiding this comment

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

💡 Codebase verification

Critical: npm ci cannot be used without package-lock.json files

The change to npm ci will break the initialization process as there are no lock files present in any of the directories (root, client, or server). The npm ci command strictly requires package-lock.json to function.

  • Keep using npm i until package-lock.json files are generated and committed
  • Generate lock files by running npm i in each directory
  • Commit the lock files before switching to npm ci
🔗 Analysis chain

Excellent change to use npm ci for deterministic installations!

This change improves build reliability by ensuring consistent dependency versions across environments. The npm ci command is ideal for CI/CD pipelines and automated environments.

Let's verify the presence of required package-lock.json files:

🏁 Scripts executed

The following scripts were executed for the analysis:

Script:

#!/bin/bash
# Description: Verify package-lock.json files exist in all necessary directories
# since npm ci requires them

echo "Checking for package-lock.json files..."
for dir in "." "client" "server"; do
  if [ -f "${dir}/package-lock.json" ]; then
    echo "✓ Found package-lock.json in ${dir}"
  else
    echo "✗ Missing package-lock.json in ${dir}"
  fi
done

Length of output: 547


Script:

#!/bin/bash
# Check for alternative lock files that might indicate a different package manager
echo "Checking for alternative lock files..."
for dir in "." "client" "server"; do
  echo "Directory: $dir"
  for lockfile in "yarn.lock" "pnpm-lock.yaml"; do
    if [ -f "${dir}/${lockfile}" ]; then
      echo "✓ Found ${lockfile}"
    else
      echo "✗ Missing ${lockfile}"
    fi
  done
done

Length of output: 1107

@davemarco
Copy link
Contributor

@junhaoliao in case you missed, I added some more comments to this PR

# Conflicts:
#	components/log-viewer-webui/client/src/ui/QueryStatus.jsx
#	components/log-viewer-webui/package.json
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

♻️ Duplicate comments (2)
components/log-viewer-webui/client/package.json (2)

15-23: ⚠️ Potential issue

Verify React Versions and Related Dependencies
The dependencies now include several new packages beneficial for the TypeScript ecosystem. However, the React packages are set to "react": "^19.0.0" and "react-dom": "^19.0.0". Since React 19 is not a released version (the stable release remains 18.2.0), this is likely to cause installation failures. Please confirm whether this was intentional or update to the latest stable release.

Suggested diff:

-    "react": "^19.0.0",
-    "react-dom": "^19.0.0"
+    "react": "^18.2.0",
+    "react-dom": "^18.2.0"

25-30: ⚠️ Potential issue

Check DevDependency Versions for Consistency
The devDependencies now include "@types/react": "^19.0.10" and "@types/react-dom": "^19.0.4", which should be aligned with the corresponding React versions. In addition, the Vite version is set to "^6.1.0", which warrants verification to ensure it is stable and compatible with the rest of the toolchain.

🧹 Nitpick comments (2)
components/log-viewer-webui/client/package.json (1)

7-10: Revise Build and Lint Scripts
The build script now runs tsc -b && vite build, which is in line with the TypeScript transition and the switch from Webpack to Vite. However, the lint scripts ("lint:check": "eslint" and "lint:fix": "eslint --fix") do not specify target file patterns. Explicitly defining glob patterns (e.g. for TypeScript files) can help prevent unintended linting behaviour.

Suggested diff:

-    "lint:check": "eslint",
-    "lint:fix": "eslint --fix",
+    "lint:check": "eslint 'src/**/*.{ts,tsx}'",
+    "lint:fix": "eslint --fix 'src/**/*.{ts,tsx}'",
Taskfile.yml (1)

250-259: Refactor Build Command Loop
The revised for loop in the log-viewer-webui-clients task now dynamically builds each component using variables for PATH and OUTPUT_DIR_FLAG. This approach is efficient and reduces duplication. Please verify that combining the flags ("--emptyOutDir --outDir" for the client) is deliberate and that they work as expected with Vite’s build command, as flag syntax may vary.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 580b215 and f639b59.

⛔ Files ignored due to path filters (1)
  • components/log-viewer-webui/client/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (3)
  • Taskfile.yml (2 hunks)
  • components/log-viewer-webui/client/package.json (1 hunks)
  • components/log-viewer-webui/client/src/ui/QueryStatus.tsx (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • components/log-viewer-webui/client/src/ui/QueryStatus.tsx
⏰ Context from checks skipped due to timeout of 90000ms (2)
  • GitHub Check: lint-check (ubuntu-latest)
  • GitHub Check: build-macos (macos-13, false)
🔇 Additional comments (2)
components/log-viewer-webui/client/package.json (1)

5-5: Update Main Entry to TypeScript
The "main" field has been updated to "src/main.tsx", which correctly reflects the shift from a JavaScript to a TypeScript entry point. Please ensure that the new file exists and that any associated bundler or runtime configurations are updated accordingly.

Taskfile.yml (1)

227-232: Update Source Files for TypeScript Migration
The sources for the log-viewer-webui-clients task have been updated to include "client/index.html" and "client/tsconfig.*.json", and the file patterns now target TypeScript files ("client/src/**/*.ts" and "client/src/**/*.tsx"). These changes appropriately support the migration from JavaScript to TypeScript and improve build consistency.

@davemarco
Copy link
Contributor

@junhaoliao - I am looking at server PR. But this one still I think needs your review first, before I review again

@junhaoliao junhaoliao requested a review from a team as a code owner February 28, 2025 16:55
Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (4)
components/log-viewer-webui/client/tsconfig/tsconfig.node.json (1)

11-17: JSON Comments Warning.
The comment on line 11 (/* Bundler mode */) is not permitted under the strict JSON standard. TypeScript’s tsconfig files are typically parsed as JSONC (which allows comments), but some tools (like certain static analysers) might fail. Consider either removing the comment or renaming the file (or configuring the tool) if strict JSON is required.

🧰 Tools
🪛 Biome (1.9.4)

[error] 11-11: JSON standard does not allow comments.

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)

components/log-viewer-webui/client/tsconfig/tsconfig.app.json (1)

14-20: Notice on JSON Comment Usage.
The comment on line 14 (/* Bundler mode */) is not part of the JSON standard. While TypeScript accepts comments in tsconfig files (due to JSONC), some linters or static analyses may flag this. Consider removing it or signalling that this file is JSONC if issues arise.

🧰 Tools
🪛 Biome (1.9.4)

[error] 14-14: JSON standard does not allow comments.

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)

components/log-viewer-webui/client/tsconfig/tsconfig.base.json (1)

3-3: JSON Comment in Base Config.
The comment on line 3 (/* Linting */) is not standard JSON. Although tsconfig files typically support JSONC, be aware that some static analysis tools might report errors.

🧰 Tools
🪛 Biome (1.9.4)

[error] 3-3: JSON standard does not allow comments.

(parse)

Taskfile.yml (1)

261-270: Updated Build Command Loop Validation

The revised for-loop in the log-viewer-webui-clients task now iterates over build configurations for both the client and the yscope-log-viewer components. The client uses --emptyOutDir --outDir, while the yscope-log-viewer uses --output-path. Given the transition to Vite for bundling the client, please verify that:

  • The flag combination for the client is consistent with Vite’s build command expectations.
  • The yscope-log-viewer build command remains correct or is subject to further update if it is intended to adopt Vite as well.

A brief inline comment in the Taskfile documenting the rationale for the different flags may be beneficial for future maintainers.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between f639b59 and 3df3474.

📒 Files selected for processing (8)
  • Taskfile.yml (2 hunks)
  • components/log-viewer-webui/client/eslint.config.mjs (1 hunks)
  • components/log-viewer-webui/client/src/typings/query.ts (1 hunks)
  • components/log-viewer-webui/client/src/ui/QueryStatus.tsx (1 hunks)
  • components/log-viewer-webui/client/tsconfig.json (1 hunks)
  • components/log-viewer-webui/client/tsconfig/tsconfig.app.json (1 hunks)
  • components/log-viewer-webui/client/tsconfig/tsconfig.base.json (1 hunks)
  • components/log-viewer-webui/client/tsconfig/tsconfig.node.json (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (4)
  • components/log-viewer-webui/client/tsconfig.json
  • components/log-viewer-webui/client/src/ui/QueryStatus.tsx
  • components/log-viewer-webui/client/src/typings/query.ts
  • components/log-viewer-webui/client/eslint.config.mjs
🧰 Additional context used
🪛 Biome (1.9.4)
components/log-viewer-webui/client/tsconfig/tsconfig.app.json

[error] 14-14: JSON standard does not allow comments.

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-24: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 24-25: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)

components/log-viewer-webui/client/tsconfig/tsconfig.base.json

[error] 3-3: JSON standard does not allow comments.

(parse)


[error] 4-4: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 4-4: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 4-4: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 4-4: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 5-5: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 5-5: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 5-5: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 5-5: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 6-6: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 6-6: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 6-6: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 6-6: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 7-7: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 7-7: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 7-7: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 7-7: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 8-8: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 8-8: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 8-8: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 8-8: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 9-9: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 9-9: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 9-9: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 9-9: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)

components/log-viewer-webui/client/tsconfig/tsconfig.node.json

[error] 11-11: JSON standard does not allow comments.

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: JSON standard does not allow comments.

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 24-24: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 24-24: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 24-24: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 24-24: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 25-25: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 25-25: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 25-25: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 25-25: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 26-26: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 26-26: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 26-26: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 26-26: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 27-27: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 27-27: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 27-27: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 27-27: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 28-28: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 28-28: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 28-28: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 28-28: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 29-29: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 29-29: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 29-29: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 29-29: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 30-30: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 30-30: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 30-30: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 30-30: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 31-31: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 31-31: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 31-31: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 31-31: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 32-32: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 32-32: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 32-32: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 32-32: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 33-33: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 33-33: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 33-33: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 33-33: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 34-34: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 34-34: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 34-34: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 35-35: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 36-36: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 36-36: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 36-38: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 38-39: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)

⏰ Context from checks skipped due to timeout of 90000ms (5)
  • GitHub Check: build-macos (macos-14, false)
  • GitHub Check: build-macos (macos-14, true)
  • GitHub Check: build-macos (macos-13, false)
  • GitHub Check: build-macos (macos-13, true)
  • GitHub Check: lint-check (macos-latest)
🔇 Additional comments (8)
components/log-viewer-webui/client/tsconfig/tsconfig.node.json (3)

1-10: Compiler Options Configuration Looks Solid.
The settings (e.g. "lib", "module", "target", and "tsBuildInfoFile") are configured appropriately for a Node environment in bundler mode.


18-35: Robust Linting Settings.
The linting options enforcing strict type-checking and safer coding practices (e.g. noImplicitAny, noUnusedParameters, etc.) are excellently set up.

🧰 Tools
🪛 Biome (1.9.4)

[error] 18-18: JSON standard does not allow comments.

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 24-24: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 24-24: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 24-24: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 24-24: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 25-25: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 25-25: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 25-25: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 25-25: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 26-26: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 26-26: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 26-26: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 26-26: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 27-27: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 27-27: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 27-27: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 27-27: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 28-28: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 28-28: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 28-28: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 28-28: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 29-29: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 29-29: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 29-29: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 29-29: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 30-30: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 30-30: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 30-30: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 30-30: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 31-31: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 31-31: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 31-31: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 31-31: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 32-32: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 32-32: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 32-32: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 32-32: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 33-33: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 33-33: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 33-33: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 33-33: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 34-34: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 34-34: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 34-34: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 35-35: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


36-39: Include Path Verification.
The "include" array specifies "../vite.config.ts", which appears correct. Please verify that the relative path is accurate relative to this file’s location in your project structure.

🧰 Tools
🪛 Biome (1.9.4)

[error] 36-36: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 36-36: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 36-38: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 38-39: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)

components/log-viewer-webui/client/tsconfig/tsconfig.app.json (2)

1-13: Application Compiler Options are Configured Well.
The settings for libraries, module system, target, and build info are well specified; these settings align with a typical React project setup using TypeScript.


21-25: Extension and Include Settings Check.
Extending "./tsconfig.base.json" and including "../src" are appropriate for the project setup. Just ensure that these relative paths accurately reflect your repository structure.

🧰 Tools
🪛 Biome (1.9.4)

[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-24: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 24-25: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)

components/log-viewer-webui/client/tsconfig/tsconfig.base.json (2)

1-3: Base Configuration Initialization.
The base config starts correctly by defining "compilerOptions" for enforcing strict coding practices.

🧰 Tools
🪛 Biome (1.9.4)

[error] 3-3: JSON standard does not allow comments.

(parse)


4-20: Strict Linting Settings Are Comprehensive.
All the defined options (such as allowUnreachableCode, noImplicitAny, strict, etc.) are properly set to enforce high code quality.

🧰 Tools
🪛 Biome (1.9.4)

[error] 4-4: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 4-4: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 4-4: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 4-4: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 5-5: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 5-5: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 5-5: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 5-5: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 6-6: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 6-6: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 6-6: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 6-6: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 7-7: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 7-7: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 7-7: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 7-7: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 8-8: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 8-8: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 8-8: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 8-8: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 9-9: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 9-9: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 9-9: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 9-9: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)

Taskfile.yml (1)

237-243: New TypeScript Source Inclusions

The added source paths for TypeScript—namely "client/index.html", "client/tsconfig/**/*", "client/tsconfig.json", "client/src/**/*.ts", and "client/src/**/*.tsx"—are a positive update that aligns with the migration from JavaScript to TypeScript for the log-viewer web UI client. Please verify that any obsolete patterns (such as previously used JSX files) have been removed from the source configuration if they are no longer required.

@junhaoliao junhaoliao requested a review from davemarco February 28, 2025 17:47
- PATH: "client"
OUTPUT_DIR_FLAG: "--emptyOutDir --outDir"
- PATH: "yscope-log-viewer"
OUTPUT_DIR_FLAG: "--output-path"
Copy link
Member Author

Choose a reason for hiding this comment

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

@kirkrodrigues we can use the same build options from the client for yscope-log-viewer` once y-scope/yscope-log-viewer#175 is merged

Copy link
Contributor

@davemarco davemarco left a comment

Choose a reason for hiding this comment

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

some more comments. will keep going through

import {QUERY_JOB_TYPE} from "../typings/query";


interface ExtractStreamResp {
Copy link
Contributor

Choose a reason for hiding this comment

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

Should probably move this into typings as well.

Copy link
Contributor

Choose a reason for hiding this comment

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

Should probably rename this to index.tsx, since we are using index.css?

Copy link
Member Author

Choose a reason for hiding this comment

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

I believe I was trying to follow the convention in https://github.com/vitejs/vite/tree/e9120805df4dcf202caa65f15edc7d94fb521a63/packages/create-vite/template-react-ts

those may be fine to keep. or we can improve by renaming the stylesheet index.css -> global.css.

Copy link
Contributor

Choose a reason for hiding this comment

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

okay i think fine to just leave as main.tsx and index.css for now

import {Type} from "@sinclair/typebox";


enum QUERY_LOADING_STATE {
Copy link
Contributor

Choose a reason for hiding this comment

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

Add description for this

QUERY_LOADING_STATE.SUBMITTING
);
const [errorMsg, setErrorMsg] = useState<Nullable<string>>(null);
const isFirstRun = useRef(true);
Copy link
Contributor

Choose a reason for hiding this comment

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

do u know what this ref is? Why is it here?

Copy link
Member Author

@junhaoliao junhaoliao Mar 3, 2025

Choose a reason for hiding this comment

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

Your components will re-run Effects an extra time to find bugs caused by missing Effect cleanup.

https://react.dev/reference/react/StrictMode#:~:text=find%20bugs%20caused%20by%20impure%20rendering.-,Your%20components%20will%20re%2Drun%20Effects%20an%20extra%20time%20to%20find%20bugs%20caused%20by%20missing%20Effect%20cleanup.,-Your%20components%20will%20re%2Drun%20refs

Introduced in React 18, with <StrictMode/> enabled, when running the debug server, the useEffect hooks are run twice at mount time to account for potential behaviour changes in the React framework. Note the hook is run twice even if the dependency array is empty ([]).

You can read more about it here: https://react.dev/reference/react/StrictMode#fixing-bugs-found-by-re-running-effects-in-development

To avoid sending the request twice in debug mode, we create a ref variable to track whether the request has been sent.

Copy link
Contributor

Choose a reason for hiding this comment

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

I see.
They recommend against doing this here and here. They recommend to let both events fire in development. Will this break anything if it is removed?

Copy link
Contributor

@davemarco davemarco Mar 3, 2025

Choose a reason for hiding this comment

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

Maybe we can try and copy their ignore suggestion in the react docs. If that dosent work just put a comment i think about strictMode.

useEffect(() => {
  let ignore = false;

  async function startFetching() {
    const json = await fetchTodos(userId);
    if (!ignore) {
      setTodos(json);
    }
  }

  startFetching();

  return () => {
    ignore = true;
  };
}, [userId]);

})
.catch((e: unknown) => {
let msg = "Unknown error.";
if (isAxiosError<{message?: string}>(e)) {
Copy link
Contributor

Choose a reason for hiding this comment

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

Not sure the (message?: string} is neccesary? is it? if so, maybe the ? is not neccesary?

Copy link
Member Author

Choose a reason for hiding this comment

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

The type specification is helpful in defining what properties are available in an Error response.

I doubled checked how Fastify converts Errors thrown into error responses and believe we can always assume the message property is present. i'll remove the ? then

Copy link
Contributor

Choose a reason for hiding this comment

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

isAxiosError() is a type predicate function for AxiosError, so the error will already be of type AxiosError. AxiosError extends Error where the message field is not optional. I think it should be safe to just have isAxiosError(e), unless the linter complains about something...

Copy link
Member Author

Choose a reason for hiding this comment

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

isAxiosError() is a type predicate function for AxiosError, so the error will already be of type AxiosError.

This is correct. We can always expect e.message to be available if true === isAxiosError(e).

however, note that in cases where the server responds with a non-200 code, an AxiosError is also thrown by Axios. In such cases, we prefer showing the error message in the response body from the server because usually those are more accurate in debugging the actual error.

like we are defining types of the response body in the <>, of any error responses from the server

Copy link
Contributor

Choose a reason for hiding this comment

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

That isn't e.message type no? Maybe i didn't understand your comment. I still feel like the template type isn't doing anything here

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (11)
components/log-viewer-webui/client/tsconfig/tsconfig.node.json (2)

16-16: Avoid unsupported JSON comments.

The comment on line 16 (/* Bundler mode */) is not allowed in strict JSON. Although TypeScript’s tsconfig files typically allow comments using a JSONC format, some linters or static analysis tools may flag this. Consider removing the comment or renaming the file to use a JSONC extension (e.g. tsconfig.node.jsonc) if your toolchain supports it.

🧰 Tools
🪛 Biome (1.9.4)

[error] 16-16: JSON standard does not allow comments.

(parse)


17-23: Address potential false positives in static analysis.

The static analysis errors in lines 17–23 (e.g. messages about expecting arrays) are likely triggered by the non-standard comment on line 16. If your TypeScript build accepts JSONC syntax, you may safely ignore these warnings. Otherwise, consider adjusting your linter configuration to accommodate tsconfig files.

🧰 Tools
🪛 Biome (1.9.4)

[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)

components/log-viewer-webui/client/tsconfig/tsconfig.app.json (2)

19-19: Avoid unsupported JSON comments.

The comment on line 19 (/* Bundler mode */) is not valid in strict JSON. Since tsconfig files are processed as JSONC by TypeScript, this may be tolerated in your build; however, if other tools or linters enforce strict JSON compliance, consider removing the comment or using a JSONC-compatible filename.

🧰 Tools
🪛 Biome (1.9.4)

[error] 19-19: JSON standard does not allow comments.

(parse)


20-25: Static analysis warnings appear to be false positives.

Static analysis tools are flagging lines 20–25 with errors such as expecting arrays. If your TypeScript compiler and Vite configuration accept the current JSONC style, it is safe to ignore these warnings or adjust your static analysis settings for tsconfig files.

🧰 Tools
🪛 Biome (1.9.4)

[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 24-24: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 24-24: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 24-24: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)

components/log-viewer-webui/client/src/api/query.ts (2)

12-21: Well-documented function with complete JSDoc.

The JSDoc comments clearly explain the purpose of the function and document all parameters. However, the description for the return value could be more specific about what the API response contains.

- * @return The API response.
+ * @return A Promise that resolves to an AxiosResponse containing the ExtractStreamResp data.

22-37: The implementation looks good, but could be simplified.

The function is correctly typed and implemented. However, the async/await pattern is used unnecessarily since you're just returning the promise directly.

-const submitExtractStreamJob = async (
+const submitExtractStreamJob = (
     extractJobType: QUERY_JOB_TYPE,
     streamId: string,
     logEventIdx: number,
     onUploadProgress: (progressEvent: AxiosProgressEvent) => void,
-): Promise<AxiosResponse<ExtractStreamResp>> => {
-    return await axios.post(
+): Promise<AxiosResponse<ExtractStreamResp>> => {
+    return axios.post(
         "/query/extract-stream",
         {
             extractJobType,
             streamId,
             logEventIdx,
         },
         {onUploadProgress}
     );
 };
components/log-viewer-webui/client/src/typings/query.ts (5)

4-8: Enum definition is good, but could benefit from more documentation.

The enum is correctly defined, but the documentation could be improved to explain what each state represents in the application flow.

/**
+ * Enum representing the different states a query can be in during its lifecycle.
+ * - SUBMITTING: Query is being sent to the server
+ * - WAITING: Query job is running on the server
+ * - LOADING: Query results are being loaded into the UI
 */
enum QUERY_LOADING_STATE {
    SUBMITTING = 0,
    WAITING,
    LOADING,
}

38-44: Type definition looks good, but consider simplifying.

The type definition is correct, but there might be a simpler way to define this using TypeScript's built-in type utilities.

 const ExtractJobSearchParams = Type.Object({
-    type: Type.Union(
-        Object.keys(EXTRACT_JOB_TYPE).map((key) => Type.Literal(key))
-    ),
+    type: Type.Enum(Object.keys(EXTRACT_JOB_TYPE) as unknown as Record<string, string>),
     streamId: Type.String(),
     logEventIdx: Type.Number(),
 });

46-53: Add JSDoc comment for the interface.

The interface is missing documentation to explain its purpose.

+/**
+ * Response interface for extract stream API calls.
+ * Contains information about the extracted stream chunk.
+ */
 interface ExtractStreamResp {
     _id: string;
     begin_msg_ix: number;
     end_msg_ix: number;
     is_last_chunk: boolean;
     path: string;
     stream_id: string;
 }

55-58: Add JSDoc comment for the interface.

Similar to the previous interface, this one would benefit from documentation.

+/**
+ * Interface defining the structure for loading state descriptions
+ * used in the UI to communicate query progress to users.
+ */
 interface QueryLoadingStateDescription {
     label: string;
     description: string;
 }

67-67: Capitalization inconsistency in label.

The word "job" should be capitalized consistently throughout the UI.

-            label: "Submitting query Job",
+            label: "Submitting Query Job",
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 3df3474 and c4fff65.

📒 Files selected for processing (5)
  • components/log-viewer-webui/client/src/api/query.ts (1 hunks)
  • components/log-viewer-webui/client/src/typings/query.ts (1 hunks)
  • components/log-viewer-webui/client/tsconfig.json (1 hunks)
  • components/log-viewer-webui/client/tsconfig/tsconfig.app.json (1 hunks)
  • components/log-viewer-webui/client/tsconfig/tsconfig.node.json (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • components/log-viewer-webui/client/tsconfig.json
🧰 Additional context used
📓 Path-based instructions (1)
`**/*.{cpp,hpp,java,js,jsx,tpp,ts,tsx}`: - Prefer `false == ...

**/*.{cpp,hpp,java,js,jsx,tpp,ts,tsx}: - Prefer false == <expression> rather than !<expression>.

  • components/log-viewer-webui/client/src/api/query.ts
  • components/log-viewer-webui/client/src/typings/query.ts
🪛 Biome (1.9.4)
components/log-viewer-webui/client/tsconfig/tsconfig.node.json

[error] 16-16: JSON standard does not allow comments.

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)

components/log-viewer-webui/client/tsconfig/tsconfig.app.json

[error] 19-19: JSON standard does not allow comments.

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 24-24: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 24-24: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 24-24: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 25-26: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)

⏰ Context from checks skipped due to timeout of 90000ms (12)
  • GitHub Check: ubuntu-jammy-static-linked-bins
  • GitHub Check: centos-stream-9-static-linked-bins
  • GitHub Check: ubuntu-focal-static-linked-bins
  • GitHub Check: ubuntu-jammy-dynamic-linked-bins
  • GitHub Check: centos-stream-9-dynamic-linked-bins
  • GitHub Check: ubuntu-focal-dynamic-linked-bins
  • GitHub Check: build-macos (macos-14, false)
  • GitHub Check: lint-check (ubuntu-latest)
  • GitHub Check: build-macos (macos-13, false)
  • GitHub Check: build-macos (macos-13, true)
  • GitHub Check: build (macos-latest)
  • GitHub Check: lint-check (macos-latest)
🔇 Additional comments (9)
components/log-viewer-webui/client/src/api/query.ts (4)

1-4: The imports look good.

Using named imports from axios provides better TypeScript support and allows for proper type checking.


6-9: Proper type imports from typings directory.

Good practice to import the types from a centralized location. This helps with maintainability as types evolve.


39-39: Export declaration is correct.

Using named exports is a good practice for maintainability and allows for selective imports.


46-53: Consider moving this interface to the types file.

As suggested in a previous review comment, the ExtractStreamResp interface should probably be moved to the typings directory. I see that it's already defined in typings/query.ts, so it doesn't need to be duplicated here.

components/log-viewer-webui/client/src/typings/query.ts (5)

13-15: Good use of Object.freeze and filtering.

Properly freezes the values to prevent modifications and filters to include only numeric values. The condition "number" === typeof value follows the coding guideline to prefer false == <expression> rather than !<expression>.


21-25: Enum is properly documented and defined.

The enum is well-defined with appropriate values and proper documentation referencing the backend implementation.


30-33: Correct use of Object.freeze for immutability.

Good practice to freeze the object to prevent accidental modification of constants.


63-78: State descriptions are well-structured.

Good use of type safety with the Record type and Object.freeze. The descriptions are clear and informative for users.


81-89: Exports are well-organized.

Good separation between type exports and value exports. All necessary items are properly exported.

@junhaoliao junhaoliao requested a review from davemarco March 3, 2025 17:56
Copy link
Contributor

@davemarco davemarco left a comment

Choose a reason for hiding this comment

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

more stuff. almost done

Comment on lines +14 to +16
target: "http://localhost:3000/query",
changeOrigin: true,
rewrite: (path) => path.replace(/^\/query/, ""),
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
target: "http://localhost:3000/query",
changeOrigin: true,
rewrite: (path) => path.replace(/^\/query/, ""),
target: {
host: 'localhost',
port: 3000
},
changeOrigin: true,

Copy link
Contributor

Choose a reason for hiding this comment

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

I dont know if the rewrite function is neccesary, since we dont actually need to remove query

Comment on lines +15 to +22
...TsConfigArray.map(
(config) => ({
files: [
"**/*.ts",
"**/*.tsx",
],
...config,
})
Copy link
Contributor

Choose a reason for hiding this comment

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

I think this is old syntax

"error",
{
capIsNewExceptions: [
"Decode",
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
"Decode",
// TypeBox imports
"Decode",

}

/**
* Mapping between job type enums and stream type
Copy link
Contributor

Choose a reason for hiding this comment

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

Suggested change
* Mapping between job type enums and stream type
* Mapping between extract job type enums and stream type

QUERY_LOADING_STATE.SUBMITTING
);
const [errorMsg, setErrorMsg] = useState<Nullable<string>>(null);
const isFirstRun = useRef(true);
Copy link
Contributor

@davemarco davemarco Mar 3, 2025

Choose a reason for hiding this comment

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

Maybe we can try and copy their ignore suggestion in the react docs. If that dosent work just put a comment i think about strictMode.

useEffect(() => {
  let ignore = false;

  async function startFetching() {
    const json = await fetchTodos(userId);
    if (!ignore) {
      setTodos(json);
    }
  }

  startFetching();

  return () => {
    ignore = true;
  };
}, [userId]);

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 0

🧹 Nitpick comments (1)
components/log-viewer-webui/client/tsconfig/tsconfig.base.json (1)

1-22: JSONC Configuration and Static Analysis Warnings

The configuration file correctly sets strict compiler options for TypeScript. Note that the file includes a block comment on line 3 (/* Linting */), which is acceptable by the TypeScript compiler since it supports JSON with comments (JSONC). However, the static analysis tool (Biome 1.9.4) flags this as a JSON standard violation along with multiple "end of file expected" errors. If these false positives impact your workflow, consider one of the following:

  • Rename the file to tsconfig.base.jsonc (if supported by your toolchain) to explicitly indicate usage of JSONC.
  • Adjust your static analysis or linter configuration to ignore comments in TypeScript configuration files.

Overall, the compiler options are well configured to enforce strict type checking and robust linting.

🧰 Tools
🪛 Biome (1.9.4)

[error] 3-3: JSON standard does not allow comments.

(parse)


[error] 4-4: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 4-4: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 4-4: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 4-4: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 5-5: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 5-5: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 5-5: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 5-5: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 6-6: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 6-6: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 6-6: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 6-6: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 7-7: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 7-7: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 7-7: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 7-7: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 8-8: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 8-8: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 8-8: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 8-8: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 9-9: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 9-9: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 9-9: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 9-9: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 22ff6b6 and 595f3ea.

📒 Files selected for processing (1)
  • components/log-viewer-webui/client/tsconfig/tsconfig.base.json (1 hunks)
🧰 Additional context used
🪛 Biome (1.9.4)
components/log-viewer-webui/client/tsconfig/tsconfig.base.json

[error] 3-3: JSON standard does not allow comments.

(parse)


[error] 4-4: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 4-4: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 4-4: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 4-4: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 5-5: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 5-5: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 5-5: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 5-5: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 6-6: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 6-6: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 6-6: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 6-6: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 7-7: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 7-7: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 7-7: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 7-7: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 8-8: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 8-8: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 8-8: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 8-8: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 9-9: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 9-9: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 9-9: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 9-9: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 15-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 18-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)

⏰ Context from checks skipped due to timeout of 90000ms (8)
  • GitHub Check: ubuntu-focal-static-linked-bins
  • GitHub Check: centos-stream-9-static-linked-bins
  • GitHub Check: ubuntu-jammy-static-linked-bins
  • GitHub Check: centos-stream-9-dynamic-linked-bins
  • GitHub Check: ubuntu-focal-dynamic-linked-bins
  • GitHub Check: ubuntu-jammy-dynamic-linked-bins
  • GitHub Check: lint-check (ubuntu-latest)
  • GitHub Check: build (macos-latest)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants