From d534c5bf1c2bed40fed1c2fb0ec5e7c814750590 Mon Sep 17 00:00:00 2001 From: Heran Lin Date: Thu, 8 Aug 2024 19:13:43 +0800 Subject: [PATCH] Add Python documentation --- README.md | 4 + docs/.vitepress/config.mts | 33 +- docs/development/index.md | 1 + docs/guide/index.md | 1 + docs/guide/installation.md | 1 + docs/index.md | 1 + docs/reference/index.md | 3 + docs/reference/python/[page].md | 1 + docs/reference/python/[page].paths.ts | 51 +++ package.json | 14 +- pnpm-lock.yaml | 348 +++++++++++------- pyproject.toml | 4 + python/pysail/docs/.gitignore | 2 + .../docs/_templates/autosummary/class.rst | 27 ++ python/pysail/docs/conf.py | 15 + python/pysail/docs/index.rst | 8 + python/pysail/docs/spark.rst | 12 + python/pysail/spark/__init__.py | 42 ++- tsconfig.json | 1 + 19 files changed, 434 insertions(+), 135 deletions(-) create mode 100644 docs/reference/index.md create mode 100644 docs/reference/python/[page].md create mode 100644 docs/reference/python/[page].paths.ts create mode 100644 python/pysail/docs/.gitignore create mode 100644 python/pysail/docs/_templates/autosummary/class.rst create mode 100644 python/pysail/docs/conf.py create mode 100644 python/pysail/docs/index.rst create mode 100644 python/pysail/docs/spark.rst diff --git a/README.md b/README.md index 415a66e6b2..60adbd04b4 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,8 @@ You need Node.js to build the documentation. On macOS, you can install rustup and the Node.js runtime via Homebrew. + + ```bash brew install rustup brew install node @@ -33,6 +35,8 @@ You also need the following tools when working on the project. On macOS, you can install these tools via Homebrew. + + ```bash brew install protobuf hatch maturin zig pnpm ``` diff --git a/docs/.vitepress/config.mts b/docs/.vitepress/config.mts index 4ecd63f190..ae6702792e 100644 --- a/docs/.vitepress/config.mts +++ b/docs/.vitepress/config.mts @@ -36,7 +36,6 @@ function analyticsHead(): HeadConfig[] { export default async () => { return defineConfig({ base: siteBase(), - lastUpdated: true, lang: "en-US", title: headTitle, description: headDescription, @@ -52,7 +51,10 @@ export default async () => { ["meta", { property: "og:image", content: headImage }], ["meta", { property: "og:type", content: "website" }], ["meta", { property: "og:site_name", content: "Sail documentation" }], - ['link', { rel: 'icon', type: 'image/png', href: `${siteBase()}favicon.png` }], + [ + "link", + { rel: "icon", type: "image/png", href: `${siteBase()}favicon.png` }, + ], ...analyticsHead(), ], transformPageData(pageData) { @@ -69,13 +71,26 @@ export default async () => { "meta", { property: "og:url", content: canonicalUrl }, ]); + + if (pageData.params?.sphinx) { + pageData.frontmatter.prev = pageData.params.prev || { + link: "/reference/", + text: "Reference", + }; + pageData.frontmatter.next = pageData.params.next ?? false; + } }, // Exclude directories starting with an underscore. Such directories are // internal (e.g. containing pages to be included in other pages). srcExclude: ["**/_*/**/*.md"], ignoreDeadLinks: [/^https?:\/\/localhost(:\d+)?(\/.*)?$/], themeConfig: { - nav: [{ text: "Home", link: "/" }], + logo: "/favicon.png", + nav: [ + { text: "User Guide", link: "/guide/" }, + { text: "Development", link: "/development/" }, + { text: "Reference", link: "/reference/" }, + ], notFound: { quote: "The page does not exist.", }, @@ -83,6 +98,7 @@ export default async () => { "/": [ { text: "User Guide", + link: "/guide/", items: [ { text: "Installation", @@ -93,6 +109,17 @@ export default async () => { { text: "Development", link: "/development/", + items: [], + }, + { + text: "Reference", + link: "/reference/", + items: [ + { + text: "Python API Reference", + link: "/reference/python/", + }, + ], }, ], }, diff --git a/docs/development/index.md b/docs/development/index.md index e69de29bb2..459110d341 100644 --- a/docs/development/index.md +++ b/docs/development/index.md @@ -0,0 +1 @@ +# Development diff --git a/docs/guide/index.md b/docs/guide/index.md index e69de29bb2..cd3d452278 100644 --- a/docs/guide/index.md +++ b/docs/guide/index.md @@ -0,0 +1 @@ +# User Guide diff --git a/docs/guide/installation.md b/docs/guide/installation.md index e69de29bb2..25267fe2b7 100644 --- a/docs/guide/installation.md +++ b/docs/guide/installation.md @@ -0,0 +1 @@ +# Installation diff --git a/docs/index.md b/docs/index.md index 9a42371ea2..81ea0e3f91 100644 --- a/docs/index.md +++ b/docs/index.md @@ -8,3 +8,4 @@ Welcome to the Sail documentation! - [User Guide](/guide/) - [Development](/development/) +- [Reference](/reference/) diff --git a/docs/reference/index.md b/docs/reference/index.md new file mode 100644 index 0000000000..6371d916dd --- /dev/null +++ b/docs/reference/index.md @@ -0,0 +1,3 @@ +# Reference + +- [Python API Reference](/reference/python/) diff --git a/docs/reference/python/[page].md b/docs/reference/python/[page].md new file mode 100644 index 0000000000..87e77682cb --- /dev/null +++ b/docs/reference/python/[page].md @@ -0,0 +1 @@ + diff --git a/docs/reference/python/[page].paths.ts b/docs/reference/python/[page].paths.ts new file mode 100644 index 0000000000..66b97255a0 --- /dev/null +++ b/docs/reference/python/[page].paths.ts @@ -0,0 +1,51 @@ +import * as fs from "node:fs"; +import * as path from "node:path"; + +const SPHINX_BUILD_OUTPUT = path.join( + __dirname, + "../../../python/pysail/docs/_build", +); + +export default { + async paths() { + const entries = await fs.promises.readdir(SPHINX_BUILD_OUTPUT, { + withFileTypes: true, + recursive: true, + }); + const files = entries.filter( + (entry) => entry.isFile() && entry.name.endsWith(".fjson"), + ); + + const paths = await Promise.all( + files.map(async (entry) => { + if (entry.name === "search.fjson" || entry.name === "genindex.fjson") { + return null; + } + const file = path.join(entry.parentPath, entry.name); + const content = await fs.promises.readFile(file, "utf-8"); + const data = JSON.parse(content); + const page = path + .relative(SPHINX_BUILD_OUTPUT, file) + .replace(/^index\.fjson$/, "/index") + .replace(/[/\\]index\.fjson$/, "/index") + // We must turn non-index pages into directories, since Sphinx handles URL in this way + // in `JSONHTMLBuilder`, which may generate relative URLs containing `../` may appear in the HTML. + .replace(/\.fjson$/, "/index"); + return { + params: { + sphinx: true, + page, + prev: data.prev + ? { link: data.prev.link, text: data.prev.title } + : false, + next: data.next + ? { link: data.next.link, text: data.next.title } + : false, + }, + content: data.body, + }; + }), + ); + return paths.filter((path) => path !== null); + }, +}; diff --git a/package.json b/package.json index 5ec3f73110..ee28f37a9d 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "type": "module", "private": true, "scripts": { - "lint": "eslint docs", + "lint": "vue-tsc --noEmit && eslint docs", "format": "prettier --write \"*.{js,json,md}\" \".github/**/*.{yml,yaml}\" \"docs/**/*.{ts,mts,vue,css,md}\"", "docs:dev": "vitepress dev docs", "docs:build": "vitepress build docs", @@ -13,8 +13,8 @@ "@ianvs/prettier-plugin-sort-imports": "^4.3.1", "@types/eslint__js": "^8.42.3", "@types/node": "^20.14.14", - "@typescript-eslint/eslint-plugin": "^8.0.0", - "@typescript-eslint/parser": "^8.0.0", + "@typescript-eslint/eslint-plugin": "^8.0.1", + "@typescript-eslint/parser": "^8.0.1", "autoprefixer": "^10.4.20", "eslint": "^9.8.0", "eslint-config-prettier": "^9.1.0", @@ -25,9 +25,11 @@ "prettier": "^3.3.3", "prettier-plugin-tailwindcss": "^0.5.14", "tailwindcss": "^3.4.7", - "typescript": "^4.9.5", - "typescript-eslint": "^8.0.0", - "vitepress": "^1.3.1" + "typescript": "^5.5.4", + "typescript-eslint": "^8.0.1", + "vitepress": "^1.3.2", + "vue": "^3.4.35", + "vue-tsc": "^2.0.29" }, "postcss": { "plugins": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6eb7c374d2..59d44a167c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -21,14 +21,14 @@ importers: specifier: ^20.14.14 version: 20.14.14 '@typescript-eslint/eslint-plugin': - specifier: ^8.0.0 - version: 8.0.0(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@4.9.5))(eslint@9.8.0)(typescript@4.9.5) + specifier: ^8.0.1 + version: 8.0.1(@typescript-eslint/parser@8.0.1(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4) '@typescript-eslint/parser': - specifier: ^8.0.0 - version: 8.0.0(eslint@9.8.0)(typescript@4.9.5) + specifier: ^8.0.1 + version: 8.0.1(eslint@9.8.0)(typescript@5.5.4) autoprefixer: specifier: ^10.4.20 - version: 10.4.20(postcss@8.4.40) + version: 10.4.20(postcss@8.4.41) eslint: specifier: ^9.8.0 version: 9.8.0 @@ -57,14 +57,20 @@ importers: specifier: ^3.4.7 version: 3.4.7 typescript: - specifier: ^4.9.5 - version: 4.9.5 + specifier: ^5.5.4 + version: 5.5.4 typescript-eslint: - specifier: ^8.0.0 - version: 8.0.0(eslint@9.8.0)(typescript@4.9.5) + specifier: ^8.0.1 + version: 8.0.1(eslint@9.8.0)(typescript@5.5.4) vitepress: - specifier: ^1.3.1 - version: 1.3.1(@algolia/client-search@4.24.0)(@types/node@20.14.14)(postcss@8.4.40)(search-insights@2.15.0)(typescript@4.9.5) + specifier: ^1.3.2 + version: 1.3.2(@algolia/client-search@4.24.0)(@types/node@20.14.14)(postcss@8.4.41)(search-insights@2.15.0)(typescript@5.5.4) + vue: + specifier: ^3.4.35 + version: 3.4.35(typescript@5.5.4) + vue-tsc: + specifier: ^2.0.29 + version: 2.0.29(typescript@5.5.4) packages: @@ -577,8 +583,8 @@ packages: '@types/web-bluetooth@0.0.20': resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} - '@typescript-eslint/eslint-plugin@8.0.0': - resolution: {integrity: sha512-STIZdwEQRXAHvNUS6ILDf5z3u95Gc8jzywunxSNqX00OooIemaaNIA0vEgynJlycL5AjabYLLrIyHd4iazyvtg==} + '@typescript-eslint/eslint-plugin@8.0.1': + resolution: {integrity: sha512-5g3Y7GDFsJAnY4Yhvk8sZtFfV6YNF2caLzjrRPUBzewjPCaj0yokePB4LJSobyCzGMzjZZYFbwuzbfDHlimXbQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 @@ -588,8 +594,8 @@ packages: typescript: optional: true - '@typescript-eslint/parser@8.0.0': - resolution: {integrity: sha512-pS1hdZ+vnrpDIxuFXYQpLTILglTjSYJ9MbetZctrUawogUsPdz31DIIRZ9+rab0LhYNTsk88w4fIzVheiTbWOQ==} + '@typescript-eslint/parser@8.0.1': + resolution: {integrity: sha512-5IgYJ9EO/12pOUwiBKFkpU7rS3IU21mtXzB81TNwq2xEybcmAZrE9qwDtsb5uQd9aVO9o0fdabFyAmKveXyujg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -598,12 +604,12 @@ packages: typescript: optional: true - '@typescript-eslint/scope-manager@8.0.0': - resolution: {integrity: sha512-V0aa9Csx/ZWWv2IPgTfY7T4agYwJyILESu/PVqFtTFz9RIS823mAze+NbnBI8xiwdX3iqeQbcTYlvB04G9wyQw==} + '@typescript-eslint/scope-manager@8.0.1': + resolution: {integrity: sha512-NpixInP5dm7uukMiRyiHjRKkom5RIFA4dfiHvalanD2cF0CLUuQqxfg8PtEUo9yqJI2bBhF+pcSafqnG3UBnRQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.0.0': - resolution: {integrity: sha512-mJAFP2mZLTBwAn5WI4PMakpywfWFH5nQZezUQdSKV23Pqo6o9iShQg1hP2+0hJJXP2LnZkWPphdIq4juYYwCeg==} + '@typescript-eslint/type-utils@8.0.1': + resolution: {integrity: sha512-+/UT25MWvXeDX9YaHv1IS6KI1fiuTto43WprE7pgSMswHbn1Jm9GEM4Txp+X74ifOWV8emu2AWcbLhpJAvD5Ng==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -611,12 +617,12 @@ packages: typescript: optional: true - '@typescript-eslint/types@8.0.0': - resolution: {integrity: sha512-wgdSGs9BTMWQ7ooeHtu5quddKKs5Z5dS+fHLbrQI+ID0XWJLODGMHRfhwImiHoeO2S5Wir2yXuadJN6/l4JRxw==} + '@typescript-eslint/types@8.0.1': + resolution: {integrity: sha512-PpqTVT3yCA/bIgJ12czBuE3iBlM3g4inRSC5J0QOdQFAn07TYrYEQBBKgXH1lQpglup+Zy6c1fxuwTk4MTNKIw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.0.0': - resolution: {integrity: sha512-5b97WpKMX+Y43YKi4zVcCVLtK5F98dFls3Oxui8LbnmRsseKenbbDinmvxrWegKDMmlkIq/XHuyy0UGLtpCDKg==} + '@typescript-eslint/typescript-estree@8.0.1': + resolution: {integrity: sha512-8V9hriRvZQXPWU3bbiUV4Epo7EvgM6RTs+sUmxp5G//dBGy402S7Fx0W0QkB2fb4obCF8SInoUzvTYtc3bkb5w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -624,14 +630,14 @@ packages: typescript: optional: true - '@typescript-eslint/utils@8.0.0': - resolution: {integrity: sha512-k/oS/A/3QeGLRvOWCg6/9rATJL5rec7/5s1YmdS0ZU6LHveJyGFwBvLhSRBv6i9xaj7etmosp+l+ViN1I9Aj/Q==} + '@typescript-eslint/utils@8.0.1': + resolution: {integrity: sha512-CBFR0G0sCt0+fzfnKaciu9IBsKvEKYwN9UZ+eeogK1fYHg4Qxk1yf/wLQkLXlq8wbU2dFlgAesxt8Gi76E8RTA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - '@typescript-eslint/visitor-keys@8.0.0': - resolution: {integrity: sha512-oN0K4nkHuOyF3PVMyETbpP5zp6wfyOvm7tWhTMfoqxSSsPmJIh6JNASuZDlODE8eE+0EB9uar+6+vxr9DBTYOA==} + '@typescript-eslint/visitor-keys@8.0.1': + resolution: {integrity: sha512-W5E+o0UfUcK5EgchLZsyVWqARmsM7v54/qEq6PY3YI5arkgmCzHiuk0zKSJJbm71V0xdRna4BGomkCTXz2/LkQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vitejs/plugin-vue@5.1.2': @@ -641,6 +647,15 @@ packages: vite: ^5.0.0 vue: ^3.2.25 + '@volar/language-core@2.4.0-alpha.18': + resolution: {integrity: sha512-JAYeJvYQQROmVRtSBIczaPjP3DX4QW1fOqW1Ebs0d3Y3EwSNRglz03dSv0Dm61dzd0Yx3WgTW3hndDnTQqgmyg==} + + '@volar/source-map@2.4.0-alpha.18': + resolution: {integrity: sha512-MTeCV9MUwwsH0sNFiZwKtFrrVZUK6p8ioZs3xFzHc2cvDXHWlYN3bChdQtwKX+FY2HG6H3CfAu1pKijolzIQ8g==} + + '@volar/typescript@2.4.0-alpha.18': + resolution: {integrity: sha512-sXh5Y8sqGUkgxpMWUGvRXggxYHAVxg0Pa1C42lQZuPDrW6vHJPR0VCK8Sr7WJsAW530HuNQT/ZIskmXtxjybMQ==} + '@vue/compiler-core@3.4.35': resolution: {integrity: sha512-gKp0zGoLnMYtw4uS/SJRRO7rsVggLjvot3mcctlMXunYNsX+aRJDqqw/lV5/gHK91nvaAAlWFgdVl020AW1Prg==} @@ -653,6 +668,9 @@ packages: '@vue/compiler-ssr@3.4.35': resolution: {integrity: sha512-7iynB+0KB1AAJKk/biENTV5cRGHRdbdaD7Mx3nWcm1W8bVD6QmnH3B4AHhQQ1qZHhqFwzEzMwiytXm3PX1e60A==} + '@vue/compiler-vue2@2.7.16': + resolution: {integrity: sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==} + '@vue/devtools-api@7.3.7': resolution: {integrity: sha512-kvjQ6nmsqTp7SrmpwI2G0MgbC4ys0bPsgQirHXJM8y1m7siQ5RnWQUHJVfyUrHNguCySW1cevAdIw87zrPTl9g==} @@ -662,6 +680,14 @@ packages: '@vue/devtools-shared@7.3.7': resolution: {integrity: sha512-M9EU1/bWi5GNS/+IZrAhwGOVZmUTN4MH22Hvh35nUZZg9AZP2R2OhfCb+MG4EtAsrUEYlu3R43/SIj3G7EZYtQ==} + '@vue/language-core@2.0.29': + resolution: {integrity: sha512-o2qz9JPjhdoVj8D2+9bDXbaI4q2uZTHQA/dbyZT4Bj1FR9viZxDJnLcKVHfxdn6wsOzRgpqIzJEEmSSvgMvDTQ==} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + '@vue/reactivity@3.4.35': resolution: {integrity: sha512-Ggtz7ZZHakriKioveJtPlStYardwQH6VCs9V13/4qjHSQb/teE30LVJNrbBVs4+aoYGtTQKJbTe4CWGxVZrvEw==} @@ -857,6 +883,9 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + computeds@0.0.1: + resolution: {integrity: sha512-7CEBgcMjVmitjYo5q8JTJVra6X5mQ20uTThdK+0kR7UEaDrAWEQcRiBtWJzga4eRpP6afNwwLsX2SET2JhVB1Q==} + concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} @@ -879,6 +908,9 @@ packages: csstype@3.1.3: resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + de-indent@1.0.2: + resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==} + debug@4.3.6: resolution: {integrity: sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==} engines: {node: '>=6.0'} @@ -904,8 +936,8 @@ packages: eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.5.4: - resolution: {integrity: sha512-orzA81VqLyIGUEA77YkVA1D+N+nNfl2isJVjjmOyrlxuooZ19ynb+dOlaDTqd/idKRS9lDCSBmtzM+kyCsMnkA==} + electron-to-chromium@1.5.5: + resolution: {integrity: sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -1098,6 +1130,10 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} + he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} @@ -1265,6 +1301,9 @@ packages: ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + muggle-string@0.4.1: + resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==} + mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -1317,6 +1356,9 @@ packages: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} + path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -1391,8 +1433,8 @@ packages: postcss-value-parser@4.2.0: resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} - postcss@8.4.40: - resolution: {integrity: sha512-YF2kKIUzAofPMpfH6hOi2cGnv/HrUlfucspc7pDyvv7kGdqXrfj8SCl/t8owkEgKEuu8ZcRjSOxFxVLqwChZ2Q==} + postcss@8.4.41: + resolution: {integrity: sha512-TesUflQ0WKZqAvg52PWL6kHgLKP6xB6heTOdoYM0Wt2UHyxNa4K25EZZMgKns3BH1RLVbZCREPpLY0rhnNoHVQ==} engines: {node: ^10 || ^12 || >=14} preact@10.23.1: @@ -1619,8 +1661,8 @@ packages: resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} engines: {node: '>=10'} - typescript-eslint@8.0.0: - resolution: {integrity: sha512-yQWBJutWL1PmpmDddIOl9/Mi6vZjqNCjqSGBMQ4vsc2Aiodk0SnbQQWPXbSy0HNuKCuGkw1+u4aQ2mO40TdhDQ==} + typescript-eslint@8.0.1: + resolution: {integrity: sha512-V3Y+MdfhawxEjE16dWpb7/IOgeXnLwAEEkS7v8oDqNcR1oYlqWhGH/iHqHdKVdpWme1VPZ0SoywXAkCqawj2eQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '*' @@ -1628,9 +1670,9 @@ packages: typescript: optional: true - typescript@4.9.5: - resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} - engines: {node: '>=4.2.0'} + typescript@5.5.4: + resolution: {integrity: sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==} + engines: {node: '>=14.17'} hasBin: true uc.micro@1.0.6: @@ -1679,8 +1721,8 @@ packages: terser: optional: true - vitepress@1.3.1: - resolution: {integrity: sha512-soZDpg2rRVJNIM/IYMNDPPr+zTHDA5RbLDHAxacRu+Q9iZ2GwSR0QSUlLs+aEZTkG0SOX1dc8RmUYwyuxK8dfQ==} + vitepress@1.3.2: + resolution: {integrity: sha512-6gvecsCuR6b1Cid4w19KQiQ02qkpgzFRqiG0v1ZBekGkrZCzsxdDD5y4WH82HRXAOhU4iZIpzA1CsWqs719rqA==} hasBin: true peerDependencies: markdown-it-mathjax3: ^4 @@ -1691,6 +1733,9 @@ packages: postcss: optional: true + vscode-uri@3.0.8: + resolution: {integrity: sha512-AyFQ0EVmsOZOlAnxoFOGOq1SQDWAB7C6aqMGS23svWAllfOaxbuFvcT8D1i8z3Gyn8fraVeZNNmN6e9bxxXkKw==} + vue-demi@0.14.10: resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} engines: {node: '>=12'} @@ -1708,6 +1753,12 @@ packages: peerDependencies: eslint: '>=6.0.0' + vue-tsc@2.0.29: + resolution: {integrity: sha512-MHhsfyxO3mYShZCGYNziSbc63x7cQ5g9kvijV7dRe1TTXBRLxXyL0FnXWpUF1xII2mJ86mwYpYsUmMwkmerq7Q==} + hasBin: true + peerDependencies: + typescript: '>=5.0.0' + vue@3.4.35: resolution: {integrity: sha512-+fl/GLmI4GPileHftVlCdB7fUL4aziPcqTudpTGXCT8s+iZWuOCeNEB5haX6Uz2IpRrbEXOgIFbe+XciCuGbNQ==} peerDependencies: @@ -2251,91 +2302,103 @@ snapshots: '@types/web-bluetooth@0.0.20': {} - '@typescript-eslint/eslint-plugin@8.0.0(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@4.9.5))(eslint@9.8.0)(typescript@4.9.5)': + '@typescript-eslint/eslint-plugin@8.0.1(@typescript-eslint/parser@8.0.1(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4)': dependencies: '@eslint-community/regexpp': 4.11.0 - '@typescript-eslint/parser': 8.0.0(eslint@9.8.0)(typescript@4.9.5) - '@typescript-eslint/scope-manager': 8.0.0 - '@typescript-eslint/type-utils': 8.0.0(eslint@9.8.0)(typescript@4.9.5) - '@typescript-eslint/utils': 8.0.0(eslint@9.8.0)(typescript@4.9.5) - '@typescript-eslint/visitor-keys': 8.0.0 + '@typescript-eslint/parser': 8.0.1(eslint@9.8.0)(typescript@5.5.4) + '@typescript-eslint/scope-manager': 8.0.1 + '@typescript-eslint/type-utils': 8.0.1(eslint@9.8.0)(typescript@5.5.4) + '@typescript-eslint/utils': 8.0.1(eslint@9.8.0)(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.0.1 eslint: 9.8.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@4.9.5) + ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: - typescript: 4.9.5 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@4.9.5)': + '@typescript-eslint/parser@8.0.1(eslint@9.8.0)(typescript@5.5.4)': dependencies: - '@typescript-eslint/scope-manager': 8.0.0 - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/typescript-estree': 8.0.0(typescript@4.9.5) - '@typescript-eslint/visitor-keys': 8.0.0 + '@typescript-eslint/scope-manager': 8.0.1 + '@typescript-eslint/types': 8.0.1 + '@typescript-eslint/typescript-estree': 8.0.1(typescript@5.5.4) + '@typescript-eslint/visitor-keys': 8.0.1 debug: 4.3.6 eslint: 9.8.0 optionalDependencies: - typescript: 4.9.5 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.0.0': + '@typescript-eslint/scope-manager@8.0.1': dependencies: - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/visitor-keys': 8.0.0 + '@typescript-eslint/types': 8.0.1 + '@typescript-eslint/visitor-keys': 8.0.1 - '@typescript-eslint/type-utils@8.0.0(eslint@9.8.0)(typescript@4.9.5)': + '@typescript-eslint/type-utils@8.0.1(eslint@9.8.0)(typescript@5.5.4)': dependencies: - '@typescript-eslint/typescript-estree': 8.0.0(typescript@4.9.5) - '@typescript-eslint/utils': 8.0.0(eslint@9.8.0)(typescript@4.9.5) + '@typescript-eslint/typescript-estree': 8.0.1(typescript@5.5.4) + '@typescript-eslint/utils': 8.0.1(eslint@9.8.0)(typescript@5.5.4) debug: 4.3.6 - ts-api-utils: 1.3.0(typescript@4.9.5) + ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: - typescript: 4.9.5 + typescript: 5.5.4 transitivePeerDependencies: - eslint - supports-color - '@typescript-eslint/types@8.0.0': {} + '@typescript-eslint/types@8.0.1': {} - '@typescript-eslint/typescript-estree@8.0.0(typescript@4.9.5)': + '@typescript-eslint/typescript-estree@8.0.1(typescript@5.5.4)': dependencies: - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/visitor-keys': 8.0.0 + '@typescript-eslint/types': 8.0.1 + '@typescript-eslint/visitor-keys': 8.0.1 debug: 4.3.6 globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@4.9.5) + ts-api-utils: 1.3.0(typescript@5.5.4) optionalDependencies: - typescript: 4.9.5 + typescript: 5.5.4 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.0.0(eslint@9.8.0)(typescript@4.9.5)': + '@typescript-eslint/utils@8.0.1(eslint@9.8.0)(typescript@5.5.4)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@9.8.0) - '@typescript-eslint/scope-manager': 8.0.0 - '@typescript-eslint/types': 8.0.0 - '@typescript-eslint/typescript-estree': 8.0.0(typescript@4.9.5) + '@typescript-eslint/scope-manager': 8.0.1 + '@typescript-eslint/types': 8.0.1 + '@typescript-eslint/typescript-estree': 8.0.1(typescript@5.5.4) eslint: 9.8.0 transitivePeerDependencies: - supports-color - typescript - '@typescript-eslint/visitor-keys@8.0.0': + '@typescript-eslint/visitor-keys@8.0.1': dependencies: - '@typescript-eslint/types': 8.0.0 + '@typescript-eslint/types': 8.0.1 eslint-visitor-keys: 3.4.3 - '@vitejs/plugin-vue@5.1.2(vite@5.3.5(@types/node@20.14.14))(vue@3.4.35(typescript@4.9.5))': + '@vitejs/plugin-vue@5.1.2(vite@5.3.5(@types/node@20.14.14))(vue@3.4.35(typescript@5.5.4))': dependencies: vite: 5.3.5(@types/node@20.14.14) - vue: 3.4.35(typescript@4.9.5) + vue: 3.4.35(typescript@5.5.4) + + '@volar/language-core@2.4.0-alpha.18': + dependencies: + '@volar/source-map': 2.4.0-alpha.18 + + '@volar/source-map@2.4.0-alpha.18': {} + + '@volar/typescript@2.4.0-alpha.18': + dependencies: + '@volar/language-core': 2.4.0-alpha.18 + path-browserify: 1.0.1 + vscode-uri: 3.0.8 '@vue/compiler-core@3.4.35': dependencies: @@ -2359,7 +2422,7 @@ snapshots: '@vue/shared': 3.4.35 estree-walker: 2.0.2 magic-string: 0.30.11 - postcss: 8.4.40 + postcss: 8.4.41 source-map-js: 1.2.0 '@vue/compiler-ssr@3.4.35': @@ -2367,6 +2430,11 @@ snapshots: '@vue/compiler-dom': 3.4.35 '@vue/shared': 3.4.35 + '@vue/compiler-vue2@2.7.16': + dependencies: + de-indent: 1.0.2 + he: 1.2.0 + '@vue/devtools-api@7.3.7': dependencies: '@vue/devtools-kit': 7.3.7 @@ -2385,6 +2453,19 @@ snapshots: dependencies: rfdc: 1.4.1 + '@vue/language-core@2.0.29(typescript@5.5.4)': + dependencies: + '@volar/language-core': 2.4.0-alpha.18 + '@vue/compiler-dom': 3.4.35 + '@vue/compiler-vue2': 2.7.16 + '@vue/shared': 3.4.35 + computeds: 0.0.1 + minimatch: 9.0.5 + muggle-string: 0.4.1 + path-browserify: 1.0.1 + optionalDependencies: + typescript: 5.5.4 + '@vue/reactivity@3.4.35': dependencies: '@vue/shared': 3.4.35 @@ -2401,29 +2482,29 @@ snapshots: '@vue/shared': 3.4.35 csstype: 3.1.3 - '@vue/server-renderer@3.4.35(vue@3.4.35(typescript@4.9.5))': + '@vue/server-renderer@3.4.35(vue@3.4.35(typescript@5.5.4))': dependencies: '@vue/compiler-ssr': 3.4.35 '@vue/shared': 3.4.35 - vue: 3.4.35(typescript@4.9.5) + vue: 3.4.35(typescript@5.5.4) '@vue/shared@3.4.35': {} - '@vueuse/core@10.11.0(vue@3.4.35(typescript@4.9.5))': + '@vueuse/core@10.11.0(vue@3.4.35(typescript@5.5.4))': dependencies: '@types/web-bluetooth': 0.0.20 '@vueuse/metadata': 10.11.0 - '@vueuse/shared': 10.11.0(vue@3.4.35(typescript@4.9.5)) - vue-demi: 0.14.10(vue@3.4.35(typescript@4.9.5)) + '@vueuse/shared': 10.11.0(vue@3.4.35(typescript@5.5.4)) + vue-demi: 0.14.10(vue@3.4.35(typescript@5.5.4)) transitivePeerDependencies: - '@vue/composition-api' - vue - '@vueuse/integrations@10.11.0(focus-trap@7.5.4)(vue@3.4.35(typescript@4.9.5))': + '@vueuse/integrations@10.11.0(focus-trap@7.5.4)(vue@3.4.35(typescript@5.5.4))': dependencies: - '@vueuse/core': 10.11.0(vue@3.4.35(typescript@4.9.5)) - '@vueuse/shared': 10.11.0(vue@3.4.35(typescript@4.9.5)) - vue-demi: 0.14.10(vue@3.4.35(typescript@4.9.5)) + '@vueuse/core': 10.11.0(vue@3.4.35(typescript@5.5.4)) + '@vueuse/shared': 10.11.0(vue@3.4.35(typescript@5.5.4)) + vue-demi: 0.14.10(vue@3.4.35(typescript@5.5.4)) optionalDependencies: focus-trap: 7.5.4 transitivePeerDependencies: @@ -2432,9 +2513,9 @@ snapshots: '@vueuse/metadata@10.11.0': {} - '@vueuse/shared@10.11.0(vue@3.4.35(typescript@4.9.5))': + '@vueuse/shared@10.11.0(vue@3.4.35(typescript@5.5.4))': dependencies: - vue-demi: 0.14.10(vue@3.4.35(typescript@4.9.5)) + vue-demi: 0.14.10(vue@3.4.35(typescript@5.5.4)) transitivePeerDependencies: - '@vue/composition-api' - vue @@ -2497,14 +2578,14 @@ snapshots: array-union@2.1.0: {} - autoprefixer@10.4.20(postcss@8.4.40): + autoprefixer@10.4.20(postcss@8.4.41): dependencies: browserslist: 4.23.3 caniuse-lite: 1.0.30001649 fraction.js: 4.3.7 normalize-range: 0.1.2 picocolors: 1.0.1 - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 balanced-match@1.0.2: {} @@ -2531,7 +2612,7 @@ snapshots: browserslist@4.23.3: dependencies: caniuse-lite: 1.0.30001649 - electron-to-chromium: 1.5.4 + electron-to-chromium: 1.5.5 node-releases: 2.0.18 update-browserslist-db: 1.1.0(browserslist@4.23.3) @@ -2578,6 +2659,8 @@ snapshots: commander@4.1.1: {} + computeds@0.0.1: {} + concat-map@0.0.1: {} convert-source-map@2.0.0: {} @@ -2596,6 +2679,8 @@ snapshots: csstype@3.1.3: {} + de-indent@1.0.2: {} + debug@4.3.6: dependencies: ms: 2.1.2 @@ -2612,7 +2697,7 @@ snapshots: eastasianwidth@0.2.0: {} - electron-to-chromium@1.5.4: {} + electron-to-chromium@1.5.5: {} emoji-regex@8.0.0: {} @@ -2851,6 +2936,8 @@ snapshots: dependencies: function-bind: 1.1.2 + he@1.2.0: {} + hookable@5.5.3: {} ignore@5.3.1: {} @@ -2986,6 +3073,8 @@ snapshots: ms@2.1.2: {} + muggle-string@0.4.1: {} + mz@2.7.0: dependencies: any-promise: 1.3.0 @@ -3033,6 +3122,8 @@ snapshots: dependencies: callsites: 3.1.0 + path-browserify@1.0.1: {} + path-exists@4.0.0: {} path-key@3.1.1: {} @@ -3056,28 +3147,28 @@ snapshots: pirates@4.0.6: {} - postcss-import@15.1.0(postcss@8.4.40): + postcss-import@15.1.0(postcss@8.4.41): dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-value-parser: 4.2.0 read-cache: 1.0.0 resolve: 1.22.8 - postcss-js@4.0.1(postcss@8.4.40): + postcss-js@4.0.1(postcss@8.4.41): dependencies: camelcase-css: 2.0.1 - postcss: 8.4.40 + postcss: 8.4.41 - postcss-load-config@4.0.2(postcss@8.4.40): + postcss-load-config@4.0.2(postcss@8.4.41): dependencies: lilconfig: 3.1.2 yaml: 2.5.0 optionalDependencies: - postcss: 8.4.40 + postcss: 8.4.41 - postcss-nested@6.2.0(postcss@8.4.40): + postcss-nested@6.2.0(postcss@8.4.41): dependencies: - postcss: 8.4.40 + postcss: 8.4.41 postcss-selector-parser: 6.1.1 postcss-selector-parser@6.1.1: @@ -3087,7 +3178,7 @@ snapshots: postcss-value-parser@4.2.0: {} - postcss@8.4.40: + postcss@8.4.41: dependencies: nanoid: 3.3.7 picocolors: 1.0.1 @@ -3244,11 +3335,11 @@ snapshots: normalize-path: 3.0.0 object-hash: 3.0.0 picocolors: 1.0.1 - postcss: 8.4.40 - postcss-import: 15.1.0(postcss@8.4.40) - postcss-js: 4.0.1(postcss@8.4.40) - postcss-load-config: 4.0.2(postcss@8.4.40) - postcss-nested: 6.2.0(postcss@8.4.40) + postcss: 8.4.41 + postcss-import: 15.1.0(postcss@8.4.41) + postcss-js: 4.0.1(postcss@8.4.41) + postcss-load-config: 4.0.2(postcss@8.4.41) + postcss-nested: 6.2.0(postcss@8.4.41) postcss-selector-parser: 6.1.1 resolve: 1.22.8 sucrase: 3.35.0 @@ -3271,9 +3362,9 @@ snapshots: dependencies: is-number: 7.0.0 - ts-api-utils@1.3.0(typescript@4.9.5): + ts-api-utils@1.3.0(typescript@5.5.4): dependencies: - typescript: 4.9.5 + typescript: 5.5.4 ts-interface-checker@0.1.13: {} @@ -3283,18 +3374,18 @@ snapshots: type-fest@0.20.2: {} - typescript-eslint@8.0.0(eslint@9.8.0)(typescript@4.9.5): + typescript-eslint@8.0.1(eslint@9.8.0)(typescript@5.5.4): dependencies: - '@typescript-eslint/eslint-plugin': 8.0.0(@typescript-eslint/parser@8.0.0(eslint@9.8.0)(typescript@4.9.5))(eslint@9.8.0)(typescript@4.9.5) - '@typescript-eslint/parser': 8.0.0(eslint@9.8.0)(typescript@4.9.5) - '@typescript-eslint/utils': 8.0.0(eslint@9.8.0)(typescript@4.9.5) + '@typescript-eslint/eslint-plugin': 8.0.1(@typescript-eslint/parser@8.0.1(eslint@9.8.0)(typescript@5.5.4))(eslint@9.8.0)(typescript@5.5.4) + '@typescript-eslint/parser': 8.0.1(eslint@9.8.0)(typescript@5.5.4) + '@typescript-eslint/utils': 8.0.1(eslint@9.8.0)(typescript@5.5.4) optionalDependencies: - typescript: 4.9.5 + typescript: 5.5.4 transitivePeerDependencies: - eslint - supports-color - typescript@4.9.5: {} + typescript@5.5.4: {} uc.micro@1.0.6: {} @@ -3315,32 +3406,32 @@ snapshots: vite@5.3.5(@types/node@20.14.14): dependencies: esbuild: 0.21.5 - postcss: 8.4.40 + postcss: 8.4.41 rollup: 4.20.0 optionalDependencies: '@types/node': 20.14.14 fsevents: 2.3.3 - vitepress@1.3.1(@algolia/client-search@4.24.0)(@types/node@20.14.14)(postcss@8.4.40)(search-insights@2.15.0)(typescript@4.9.5): + vitepress@1.3.2(@algolia/client-search@4.24.0)(@types/node@20.14.14)(postcss@8.4.41)(search-insights@2.15.0)(typescript@5.5.4): dependencies: '@docsearch/css': 3.6.1 '@docsearch/js': 3.6.1(@algolia/client-search@4.24.0)(search-insights@2.15.0) '@shikijs/core': 1.12.1 '@shikijs/transformers': 1.12.1 '@types/markdown-it': 14.1.2 - '@vitejs/plugin-vue': 5.1.2(vite@5.3.5(@types/node@20.14.14))(vue@3.4.35(typescript@4.9.5)) + '@vitejs/plugin-vue': 5.1.2(vite@5.3.5(@types/node@20.14.14))(vue@3.4.35(typescript@5.5.4)) '@vue/devtools-api': 7.3.7 '@vue/shared': 3.4.35 - '@vueuse/core': 10.11.0(vue@3.4.35(typescript@4.9.5)) - '@vueuse/integrations': 10.11.0(focus-trap@7.5.4)(vue@3.4.35(typescript@4.9.5)) + '@vueuse/core': 10.11.0(vue@3.4.35(typescript@5.5.4)) + '@vueuse/integrations': 10.11.0(focus-trap@7.5.4)(vue@3.4.35(typescript@5.5.4)) focus-trap: 7.5.4 mark.js: 8.11.1 minisearch: 7.1.0 shiki: 1.12.1 vite: 5.3.5(@types/node@20.14.14) - vue: 3.4.35(typescript@4.9.5) + vue: 3.4.35(typescript@5.5.4) optionalDependencies: - postcss: 8.4.40 + postcss: 8.4.41 transitivePeerDependencies: - '@algolia/client-search' - '@types/node' @@ -3368,9 +3459,11 @@ snapshots: - typescript - universal-cookie - vue-demi@0.14.10(vue@3.4.35(typescript@4.9.5)): + vscode-uri@3.0.8: {} + + vue-demi@0.14.10(vue@3.4.35(typescript@5.5.4)): dependencies: - vue: 3.4.35(typescript@4.9.5) + vue: 3.4.35(typescript@5.5.4) vue-eslint-parser@9.4.3(eslint@9.8.0): dependencies: @@ -3385,15 +3478,22 @@ snapshots: transitivePeerDependencies: - supports-color - vue@3.4.35(typescript@4.9.5): + vue-tsc@2.0.29(typescript@5.5.4): + dependencies: + '@volar/typescript': 2.4.0-alpha.18 + '@vue/language-core': 2.0.29(typescript@5.5.4) + semver: 7.6.3 + typescript: 5.5.4 + + vue@3.4.35(typescript@5.5.4): dependencies: '@vue/compiler-dom': 3.4.35 '@vue/compiler-sfc': 3.4.35 '@vue/runtime-dom': 3.4.35 - '@vue/server-renderer': 3.4.35(vue@3.4.35(typescript@4.9.5)) + '@vue/server-renderer': 3.4.35(vue@3.4.35(typescript@5.5.4)) '@vue/shared': 3.4.35 optionalDependencies: - typescript: 4.9.5 + typescript: 5.5.4 which@2.0.2: dependencies: diff --git a/pyproject.toml b/pyproject.toml index 6388f9a875..e8a9838744 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,8 +32,12 @@ installer = "pip" dependencies = [ "pyspark[connect,sql]==3.5.1", "pytest~=8.2", + "sphinx~=8.0", ] +[tool.hatch.envs.default.scripts] +docs-build = "sphinx-build python/pysail/docs python/pysail/docs/_build -b json" + [tool.hatch.envs.default.overrides] env.CI.installer = "uv" diff --git a/python/pysail/docs/.gitignore b/python/pysail/docs/.gitignore new file mode 100644 index 0000000000..7dcd40d957 --- /dev/null +++ b/python/pysail/docs/.gitignore @@ -0,0 +1,2 @@ +_build/ +api/ diff --git a/python/pysail/docs/_templates/autosummary/class.rst b/python/pysail/docs/_templates/autosummary/class.rst new file mode 100644 index 0000000000..0e9cf0dbd5 --- /dev/null +++ b/python/pysail/docs/_templates/autosummary/class.rst @@ -0,0 +1,27 @@ +{{ fullname | escape | underline}} + +.. currentmodule:: {{ module }} + +.. autoclass:: {{ objname }} + +{% block methods %} + .. automethod:: __init__ +{% if methods %} + .. rubric:: {{ _('Methods') }} +{% for item in methods %} +{%- if item != '__init__' %} + .. automethod:: {{ item }} +{%- endif %} +{%- endfor %} +{%- endif %} +{%- endblock %} + +{% block attributes %} +{% if attributes %} + .. rubric:: {{ _('Attributes') }} +{% for item in attributes %} + .. autoattribute:: {{ item }} +{%- endfor %} +{%- endif %} +{%- endblock %} + diff --git a/python/pysail/docs/conf.py b/python/pysail/docs/conf.py new file mode 100644 index 0000000000..2d33f16af5 --- /dev/null +++ b/python/pysail/docs/conf.py @@ -0,0 +1,15 @@ +# Configuration file for the Sphinx documentation builder. + +project = 'Sail' +copyright = 'LakeSail, Inc.' +author = 'LakeSail' + +extensions = [ + 'sphinx.ext.autodoc', + 'sphinx.ext.autosummary', +] + +templates_path = ['_templates'] +exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] + +autosummary_generate = True diff --git a/python/pysail/docs/index.rst b/python/pysail/docs/index.rst new file mode 100644 index 0000000000..9b1aaf9330 --- /dev/null +++ b/python/pysail/docs/index.rst @@ -0,0 +1,8 @@ +==================== +Python API Reference +==================== + +.. toctree:: + :maxdepth: 2 + + spark diff --git a/python/pysail/docs/spark.rst b/python/pysail/docs/spark.rst new file mode 100644 index 0000000000..2a799da4bf --- /dev/null +++ b/python/pysail/docs/spark.rst @@ -0,0 +1,12 @@ +======================== +Apache Spark Integration +======================== + +The :mod:`pysail.spark` module provides integration with Apache Spark. + +.. currentmodule:: pysail.spark + +.. autosummary:: + :toctree: api/ + + SparkConnectServer diff --git a/python/pysail/spark/__init__.py b/python/pysail/spark/__init__.py index 0f34dd9819..7d94c1966f 100644 --- a/python/pysail/spark/__init__.py +++ b/python/pysail/spark/__init__.py @@ -1,7 +1,45 @@ -from pysail import _native +from typing import Tuple -SparkConnectServer = _native.spark.SparkConnectServer +from pysail import _native __all__ = [ "SparkConnectServer", ] + + +class SparkConnectServer: + """The Spark Connect server that uses Sail as the computation engine.""" + def __init__(self, ip: str, port: int) -> None: + """Create a new Spark Connect server. + + :param ip: The IP address to bind the server to. + :param port: The port to bind the server to. + """ + self._inner = _native.spark.SparkConnectServer(ip, port) + + def init_telemetry(self) -> None: + """Initialize OpenTelemetry for the server.""" + self._inner.init_telemetry() + + def start(self, *, background=False) -> None: + """Start the server. + + :param background: Whether to start the server in a background thread. + """ + self._inner.start(background=background) + + def stop(self) -> None: + """Stop the server.""" + self._inner.stop() + + @property + def listening_address(self) -> Tuple[str, int] | None: + """The address that the server is listening on, + or ``None`` if the server is not running. + """ + return self._inner.listening_address + + @property + def running(self) -> bool: + """Whether the server is running.""" + return self._inner.running diff --git a/tsconfig.json b/tsconfig.json index 2935617f88..131a96175b 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,6 +1,7 @@ { "compilerOptions": { "esModuleInterop": true, + "skipLibCheck": true, "baseUrl": "." }, "include": ["docs/.vitepress/theme/**/*"]