From 14eba3716db0908910868580dd48082fcff2ed2a Mon Sep 17 00:00:00 2001 From: azu Date: Sat, 17 May 2025 01:20:07 +0900 Subject: [PATCH 1/3] update --- package.json | 3 +- .../@textstat/rule-context/src/report-type.ts | 8 +- packages/@textstat/rule-context/tsconfig.json | 2 + .../src/sentence-util.ts | 4 +- packages/@textstat/textstat-view/package.json | 2 +- .../NumberOfCharactersView.tsx | 87 ++++++++------- .../textstat-view/src/context/StatContext.ts | 15 +++ .../textstat-rule-document-dependency.tsx | 103 +++++++++++++----- tsconfig.base.json | 3 +- 9 files changed, 148 insertions(+), 79 deletions(-) diff --git a/package.json b/package.json index e3dc60b..4487889 100644 --- a/package.json +++ b/package.json @@ -52,5 +52,6 @@ "post-commit": "git reset", "pre-commit": "lint-staged" } - } + }, + "packageManager": "yarn@1.22.22+sha256.c17d3797fb9a9115bf375e31bfd30058cac6bc9c3b8807a3d8cb2094794b51ca" } diff --git a/packages/@textstat/rule-context/src/report-type.ts b/packages/@textstat/rule-context/src/report-type.ts index 7ea4c5e..1c5b7e8 100644 --- a/packages/@textstat/rule-context/src/report-type.ts +++ b/packages/@textstat/rule-context/src/report-type.ts @@ -1,6 +1,6 @@ import { TextlintRuleOptions } from "@textlint/kernel"; -import RuleContext from "@textlint/kernel/lib/kernel/src/core/rule-context"; -import FilterRuleContext from "@textlint/kernel/lib/kernel/src/core/filter-rule-context"; +import { TextlintRuleContext } from "@textlint/types"; +import { TextlintFilterRuleContext } from "@textlint/types"; import { TxtNode, TxtNodeType } from "@textlint/kernel/lib/ast-node-types/src"; import { LocaleTag, LocalizeMessages } from "./Localize"; @@ -28,7 +28,7 @@ export type TextstatRuleMeta = { }; export type TextstatRuleReporter = ( - context: Readonly, + context: Readonly, options: TextlintRuleOptions, deps: TextstatRuleSharedDependencies ) => { [P in TxtNodeType]?: (node: TxtNode) => void | Promise }; @@ -43,7 +43,7 @@ export interface TextstatKernelRule { } export type TextstatFilterRuleReporter = ( - context: Readonly, + context: Readonly, options: TextlintRuleOptions, deps: TextstatRuleSharedDependencies ) => { [P in TxtNodeType]?: (node: TxtNode) => void | Promise }; diff --git a/packages/@textstat/rule-context/tsconfig.json b/packages/@textstat/rule-context/tsconfig.json index f8082ab..8c068c8 100644 --- a/packages/@textstat/rule-context/tsconfig.json +++ b/packages/@textstat/rule-context/tsconfig.json @@ -1,6 +1,8 @@ { "extends": "../../../tsconfig.base.json", "compilerOptions": { + "baseUrl": ".", + "paths": { "*": ["types/*"] }, "outDir": "./lib/" }, "include": [ diff --git a/packages/@textstat/textstat-rule-tateishi-level/src/sentence-util.ts b/packages/@textstat/textstat-rule-tateishi-level/src/sentence-util.ts index 351f0c9..5ad38e1 100644 --- a/packages/@textstat/textstat-rule-tateishi-level/src/sentence-util.ts +++ b/packages/@textstat/textstat-rule-tateishi-level/src/sentence-util.ts @@ -1,8 +1,8 @@ import { splitAST, Syntax } from "sentence-splitter"; import { TxtParentNode } from "@textlint/ast-node-types"; -export const getSentences = (node: TxtParentNode) => { +export const getSentences = (node: TxtParentNode): import("sentence-splitter").SentenceNode[] => { return splitAST(node).children.filter(node => { return node.type === Syntax.Sentence; - }); + }) as import("sentence-splitter").SentenceNode[]; }; diff --git a/packages/@textstat/textstat-view/package.json b/packages/@textstat/textstat-view/package.json index 405e011..fba34a9 100644 --- a/packages/@textstat/textstat-view/package.json +++ b/packages/@textstat/textstat-view/package.json @@ -6,7 +6,7 @@ "build": "react-scripts build", "build:navi": "cross-env REACT_APP_NAVI=true navi-scripts build", "eject": "react-scripts eject", - "start": "react-scripts start", + "start": "NODE_OPTIONS=--openssl-legacy-provider react-scripts start", "test": "react-scripts test", "prettier": "prettier --write \"**/*.{js,jsx,ts,tsx,css}\"" }, diff --git a/packages/@textstat/textstat-view/src/components/NumberOfCharactersView/NumberOfCharactersView.tsx b/packages/@textstat/textstat-view/src/components/NumberOfCharactersView/NumberOfCharactersView.tsx index 02b1f02..e56e106 100644 --- a/packages/@textstat/textstat-view/src/components/NumberOfCharactersView/NumberOfCharactersView.tsx +++ b/packages/@textstat/textstat-view/src/components/NumberOfCharactersView/NumberOfCharactersView.tsx @@ -1,6 +1,7 @@ import * as React from "react"; import Plot from "react-plotly.js"; import { trimCommonPrefix } from "../../helper/trim-common-prefix"; +import { useMemo } from "react"; export interface FileSizeViewProps { results: { @@ -25,50 +26,56 @@ export function NumberOfCharactersView(props: FileSizeViewProps) { return result.filePath; }) ); - const values: number[] = []; - props.results.forEach(result => { - return result.messages.forEach(message => { - if (message.ruleId !== ruleId) { - return; - } - message.data.details.forEach(detail => { - values.push(detail.value); + const values: number[] = useMemo(() => { + const values: number[] = []; + props.results.forEach(result => { + return result.messages.forEach(message => { + if (message.ruleId !== ruleId) { + return; + } + message.data.details.forEach(detail => { + values.push(detail.value); + }); }); }); - }); + return values; + }, [props.results]); return ( - +
+ + ]} + useResizeHandler={true} + style={{ + width: "100%", + height: "100%" + }} + layout={{ + title: ruleId, + yaxis: { + tickmode: "linear", + ticks: "outside", + ticklen: 8, + automargin: true + } + }} + /> +
); } diff --git a/packages/@textstat/textstat-view/src/context/StatContext.ts b/packages/@textstat/textstat-view/src/context/StatContext.ts index 53610fd..cfe7617 100644 --- a/packages/@textstat/textstat-view/src/context/StatContext.ts +++ b/packages/@textstat/textstat-view/src/context/StatContext.ts @@ -1,6 +1,21 @@ import { createContext } from "react"; import { getStore } from "./LocalStore"; +export type Result = { + filePath: string; + messages: { + ruleId: string; + data: { + details: { + name: string; + value: { + type: string; + path: string; + }[]; + }[]; + }; + }[]; +}; const defaultValue = { input: "", results: [] diff --git a/packages/@textstat/textstat-view/src/pages/textstat-rule-document-dependency.tsx b/packages/@textstat/textstat-view/src/pages/textstat-rule-document-dependency.tsx index 5ed16d0..ad64364 100644 --- a/packages/@textstat/textstat-view/src/pages/textstat-rule-document-dependency.tsx +++ b/packages/@textstat/textstat-view/src/pages/textstat-rule-document-dependency.tsx @@ -1,39 +1,82 @@ import * as React from "react"; -import { StatContext } from "../context/StatContext"; +import { Result, StatContext } from "../context/StatContext"; import { DocumentDependencyView } from "../components/DocumentDependencyView/DocumentDependencyView"; +import { useState } from "react"; +import { on } from "node:cluster"; +// { +// filePath: string; +// messages: { +// ruleId: string; +// data: { +// details: { +// name: string; +// value: { +// type: string; +// path: string; +// }[]; +// }[]; +// }; +// }[]; +// }[] +// filePath 自体を消す +// それぞれのmessageからdata.details.valueのpathが一致するものは消す -export class TextstatRuleDocumentDependency extends React.Component { - state = { - reverse: false - }; - - private onChangeCheckbox = () => { - this.setState({ - reverse: !this.state.reverse - }); - }; - - render() { - return ( - - {({ results }) => { +type ResultFilterProps = { + excludeFilePaths: string[]; + results: Result[]; + onChangeExcludeFilePath: (result: Result, excluded: boolean) => void; +}; +const ResultFilter = ({ excludeFilePaths, results, onChangeExcludeFilePath }: ResultFilterProps) => { + return ( +
+
    + {results.map(result => { + const isIncluded = !excludeFilePaths.includes(result.filePath); return ( -
    +
  • - - -
  • + checked={isIncluded} + onChange={() => { + onChangeExcludeFilePath(result, !isIncluded); + }} + > + {result.filePath} + + ); - }} - - ); - } -} + })} +
+
+ ); +}; +const TextstatRuleDocumentDependency = () => { + const [reverse, setReverse] = useState(false); + const onChangeCheckbox = () => setReverse(r => !r); + const [excludeFilePaths, setExcludeFilePaths] = React.useState([]); + const onChangeExcludeFilePath = (result: Result, excluded: boolean) => { + setExcludeFilePaths(oldSet => { + return excluded ? [...oldSet, result.filePath] : oldSet.filter(filepath => filepath !== result.filePath); + }); + }; + return ( + + {({ results }) => { + return ( +
+ + + + +
+ ); + }} +
+ ); +}; export default function() { return ; diff --git a/tsconfig.base.json b/tsconfig.base.json index 6efbac7..1c9f9e4 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -19,7 +19,8 @@ "noFallthroughCasesInSwitch": true, "esModuleInterop": true, /* monorepo */ - "composite": true + "composite": true, + "skipLibCheck": true }, "include": [ "src/**/*" From 0599a0c62d2efd1f498477daee9c9396aac4e8c5 Mon Sep 17 00:00:00 2001 From: azu Date: Sun, 18 May 2025 22:11:34 +0900 Subject: [PATCH 2/3] work --- packages/@textstat/kernel/package.json | 2 +- packages/@textstat/rule-context/package.json | 4 +- .../textstat-rule-tateishi-level/package.json | 6 +- .../@textstat/textstat-tester/package.json | 2 +- packages/@textstat/textstat-view/.gitignore | 2 + .../@textstat/textstat-view/next.config.ts | 8 + packages/@textstat/textstat-view/package.json | 35 +- .../@textstat/textstat-view/public/_redirects | 1 - .../textstat-view/public/favicon.ico | Bin 3870 -> 0 bytes .../@textstat/textstat-view/public/index.html | 40 - packages/@textstat/textstat-view/src/App.tsx | 104 +- .../textstat-view/src/context/StatContext.ts | 24 - .../textstat-view/src/context/StatContext.tsx | 48 + .../@textstat/textstat-view/src/index.tsx | 22 - .../textstat-view/src/pages/index.tsx | 33 - .../textstat-rule-document-dependency.tsx | 83 - .../textstat-rule-number-of-characters.tsx | 8 - .../textstat-view/src/react-app-env.d.ts | 1 - .../textstat-view/src/serviceWorker.ts | 133 - .../@textstat/textstat-view/tsconfig.json | 16 +- yarn.lock | 16553 +++++----------- 21 files changed, 5615 insertions(+), 11510 deletions(-) create mode 100644 packages/@textstat/textstat-view/next.config.ts delete mode 100644 packages/@textstat/textstat-view/public/_redirects delete mode 100644 packages/@textstat/textstat-view/public/favicon.ico delete mode 100644 packages/@textstat/textstat-view/public/index.html delete mode 100644 packages/@textstat/textstat-view/src/context/StatContext.ts create mode 100644 packages/@textstat/textstat-view/src/context/StatContext.tsx delete mode 100644 packages/@textstat/textstat-view/src/index.tsx delete mode 100644 packages/@textstat/textstat-view/src/pages/index.tsx delete mode 100644 packages/@textstat/textstat-view/src/pages/textstat-rule-document-dependency.tsx delete mode 100644 packages/@textstat/textstat-view/src/pages/textstat-rule-number-of-characters.tsx delete mode 100644 packages/@textstat/textstat-view/src/react-app-env.d.ts delete mode 100644 packages/@textstat/textstat-view/src/serviceWorker.ts diff --git a/packages/@textstat/kernel/package.json b/packages/@textstat/kernel/package.json index 5b517a2..d2f2d63 100644 --- a/packages/@textstat/kernel/package.json +++ b/packages/@textstat/kernel/package.json @@ -38,7 +38,7 @@ "tabWidth": 4 }, "dependencies": { - "@textlint/kernel": "^3.1.4" + "@textlint/kernel": "^14.7.1" }, "devDependencies": { "@textlint/textlint-plugin-markdown": "^5.0.1", diff --git a/packages/@textstat/rule-context/package.json b/packages/@textstat/rule-context/package.json index f10a3ee..ab0217a 100644 --- a/packages/@textstat/rule-context/package.json +++ b/packages/@textstat/rule-context/package.json @@ -37,8 +37,8 @@ "tabWidth": 4 }, "dependencies": { - "@textlint/kernel": "^3.1.4", - "lodash.template": "^4.4.0" + "@textlint/kernel": "^14.7.1", + "lodash.template": "^4.5.0" }, "devDependencies": { "@types/lodash.template": "^4.4.4", diff --git a/packages/@textstat/textstat-rule-tateishi-level/package.json b/packages/@textstat/textstat-rule-tateishi-level/package.json index 028110c..9d5d5e8 100644 --- a/packages/@textstat/textstat-rule-tateishi-level/package.json +++ b/packages/@textstat/textstat-rule-tateishi-level/package.json @@ -40,10 +40,10 @@ "tabWidth": 4 }, "dependencies": { - "@textlint/ast-node-types": "^4.2.1", + "@textlint/ast-node-types": "^14.7.1", "@textstat/rule-context": "^0.8.0", - "sentence-splitter": "^3.0.11", - "textlint-rule-helper": "^2.0.1" + "sentence-splitter": "^5.0.0", + "textlint-rule-helper": "^2.3.1" }, "devDependencies": { "@textstat/textstat-tester": "^0.8.0", diff --git a/packages/@textstat/textstat-tester/package.json b/packages/@textstat/textstat-tester/package.json index ef47037..14e6e2b 100644 --- a/packages/@textstat/textstat-tester/package.json +++ b/packages/@textstat/textstat-tester/package.json @@ -36,7 +36,7 @@ "tabWidth": 4 }, "dependencies": { - "@textlint/textlint-plugin-markdown": "^5.1.4", + "@textlint/textlint-plugin-markdown": "^14.7.1", "@textstat/kernel": "^0.8.0", "@textstat/rule-context": "^0.8.0" }, diff --git a/packages/@textstat/textstat-view/.gitignore b/packages/@textstat/textstat-view/.gitignore index ea63ec7..5560b5b 100644 --- a/packages/@textstat/textstat-view/.gitignore +++ b/packages/@textstat/textstat-view/.gitignore @@ -10,6 +10,7 @@ # production /build +.next/ # misc .DS_Store @@ -104,5 +105,6 @@ com_crashlytics_export_strings.xml crashlytics.properties crashlytics-build.properties +next-env.d.ts /lib diff --git a/packages/@textstat/textstat-view/next.config.ts b/packages/@textstat/textstat-view/next.config.ts new file mode 100644 index 0000000..a4822e0 --- /dev/null +++ b/packages/@textstat/textstat-view/next.config.ts @@ -0,0 +1,8 @@ +import { NextConfig } from "next"; + +const nextConfig: NextConfig = { + output: "export", // Outputs a Single-Page Application (SPA) + distDir: "build" // Changes the build output directory to `build` +}; + +export default nextConfig; diff --git a/packages/@textstat/textstat-view/package.json b/packages/@textstat/textstat-view/package.json index fba34a9..a9da1b3 100644 --- a/packages/@textstat/textstat-view/package.json +++ b/packages/@textstat/textstat-view/package.json @@ -3,11 +3,12 @@ "version": "0.8.0", "private": true, "scripts": { - "build": "react-scripts build", - "build:navi": "cross-env REACT_APP_NAVI=true navi-scripts build", - "eject": "react-scripts eject", - "start": "NODE_OPTIONS=--openssl-legacy-provider react-scripts start", - "test": "react-scripts test", + "dev": "next dev", + "build": "next build", + "start": "next start", + "lint": "next lint", + "export": "next export", + "serve": "npx serve@latest ./build", "prettier": "prettier --write \"**/*.{js,jsx,ts,tsx,css}\"" }, "prettier": { @@ -21,28 +22,24 @@ "dependencies": { "@textstat/to-non-cyclic": "^0.8.0", "@types/classnames": "^2.2.6", - "@types/jest": "23.3.10", "@types/node": "10.12.12", - "@types/react": "16.7.13", - "@types/react-dom": "16.0.11", + "@types/react": "19.1.4", + "@types/react-dom": "19.1.5", "classnames": "^2.2.6", "common-path-prefix": "^1.0.0", - "navi": "^0.8.0", "plotly.js": "^1.45.0", - "react": "^16.6.3", - "react-dom": "^16.6.3", - "react-navi": "^0.8.4", - "react-plotly.js": "^2.3.0", - "react-scripts": "2.1.1", - "typescript": "3.3.3333" + "react": "^19.1.0", + "react-dom": "^19.1.0", + "react-plotly.js": "^2.6.0", + "typescript": "^5.8.3", + "next": "^15.3.2" }, "devDependencies": { "@types/react-plotly.js": "^2.2.2", - "cross-env": "^5.2.0", - "husky": "^1.3.1", "lint-staged": "^8.1.4", - "navi-scripts": "^0.8.0", - "prettier": "^1.16.4" + "prettier": "^1.16.4", + "eslint": "^8", + "eslint-config-next": "^15.3.2" }, "browserslist": [ ">0.2%", diff --git a/packages/@textstat/textstat-view/public/_redirects b/packages/@textstat/textstat-view/public/_redirects deleted file mode 100644 index 7797f7c..0000000 --- a/packages/@textstat/textstat-view/public/_redirects +++ /dev/null @@ -1 +0,0 @@ -/* /index.html 200 diff --git a/packages/@textstat/textstat-view/public/favicon.ico b/packages/@textstat/textstat-view/public/favicon.ico deleted file mode 100644 index a11777cc471a4344702741ab1c8a588998b1311a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3870 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 baj7?x%VD!5Cxk2YbYLNVeiXvvpMCWYo=by@ diff --git a/packages/@textstat/textstat-view/public/index.html b/packages/@textstat/textstat-view/public/index.html deleted file mode 100644 index 21fdde8..0000000 --- a/packages/@textstat/textstat-view/public/index.html +++ /dev/null @@ -1,40 +0,0 @@ - - - - - - - - - - - textstat-viewer - - - -
- - - diff --git a/packages/@textstat/textstat-view/src/App.tsx b/packages/@textstat/textstat-view/src/App.tsx index 49432bd..1476910 100644 --- a/packages/@textstat/textstat-view/src/App.tsx +++ b/packages/@textstat/textstat-view/src/App.tsx @@ -1,28 +1,33 @@ -// App.js +"use client"; import * as React from "react"; import * as url from "url"; -import { ChangeEvent } from "react"; -import { NavLoading, NavProvider, NavRoute } from "react-navi"; -import { BrowserNavigation } from "navi"; -import { StatContext } from "./context/StatContext"; +import { ChangeEvent, useEffect, useState } from "react"; // useEffectとuseStateをインポート +// import { NavLoading, NavProvider, NavRoute } from "react-navi"; // react-navi関連を削除 +// import { BrowserNavigation } from "navi"; // react-navi関連を削除 +import { Result, StatProvider } from "./context/StatContext"; // Result型をインポート import { getStore, saveStore } from "./context/LocalStore"; import { AppMenu } from "./AppMenu"; import "./App.css"; import { fetchGistContent } from "./context/GistStore"; -export interface AppProps { - navigation: BrowserNavigation; -} +// AppPropsからnavigationを削除 +// export interface AppProps { +// navigation: BrowserNavigation; +// } -class App extends React.Component { - state = getStore({ - input: "[]", - results: [] - }); +// クラスコンポーネントを関数コンポーネントに変換 +const App = () => { + // AppPropsを削除 + const [state, setState] = useState( + getStore({ + input: "[]", + results: [] as Result[] // resultsの型を明示 + }) + ); - private onChangeTextarea = (event: ChangeEvent) => { + const onChangeTextarea = (event: ChangeEvent) => { const input = event.currentTarget.value; - let results = this.state.results; + let results = state.results; try { results = JSON.parse(input); } catch (error) { @@ -32,20 +37,20 @@ class App extends React.Component { input: input, results: results }; - this.setState(newState); + setState(newState); saveStore(newState); }; - componentDidMount(): void { + useEffect(() => { const urlObject = url.parse(location.href, true); if (urlObject.query && typeof urlObject.query.gist === "string") { fetchGistContent(urlObject.query.gist) .then(content => { try { - const state = JSON.parse(content); - this.setState({ + const parsedResults = JSON.parse(content); // 変数名を変更 + setState({ input: content, - results: state + results: parsedResults }); } catch (error) { console.error("parse error ?gist", error); @@ -55,37 +60,34 @@ class App extends React.Component { console.error("Gist Fetch Error", error); }); } - } + }, []); // componentDidMountの代わりにuseEffectを使用 - render() { - return ( - -
-
-