@osdk/create-app 2.1.0-beta.7 → 2.1.0-beta.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/build/browser/{esm-XQ5YTOO2.js → esm-4QSCBEZC.js} +15 -2
- package/build/browser/esm-4QSCBEZC.js.map +1 -0
- package/build/{esm/esm-MRNBIYTC.js → browser/esm-F6Y6OKER.js} +9 -2
- package/build/browser/esm-F6Y6OKER.js.map +1 -0
- package/build/browser/{esm-BVGFJP4A.js → esm-FXURBNU2.js} +15 -2
- package/build/browser/esm-FXURBNU2.js.map +1 -0
- package/build/{esm/esm-LSHNW2RY.js → browser/esm-G7B67PJ6.js} +17 -3
- package/build/browser/esm-G7B67PJ6.js.map +1 -0
- package/build/{esm/esm-KQDXBELM.js → browser/esm-H2IADGOR.js} +15 -2
- package/build/browser/esm-H2IADGOR.js.map +1 -0
- package/build/browser/{esm-XR4L35X6.js → esm-IWXD7ZFP.js} +9 -2
- package/build/browser/esm-IWXD7ZFP.js.map +1 -0
- package/build/{esm/esm-OSSDC2WN.js → browser/esm-LF7OTAKA.js} +9 -2
- package/build/browser/esm-LF7OTAKA.js.map +1 -0
- package/build/browser/{esm-DRTFALTA.js → esm-PQDKPDBA.js} +9 -2
- package/build/browser/esm-PQDKPDBA.js.map +1 -0
- package/build/{esm/esm-N7SXGNJF.js → browser/esm-S2OWTMMF.js} +17 -3
- package/build/browser/esm-S2OWTMMF.js.map +1 -0
- package/build/{esm/esm-DNMTAVCV.js → browser/esm-Y7D2PCM4.js} +9 -2
- package/build/browser/esm-Y7D2PCM4.js.map +1 -0
- package/build/browser/index.js +61 -15
- package/build/browser/index.js.map +1 -1
- package/build/esm/cli.d.ts.map +1 -1
- package/build/esm/{esm-XQ5YTOO2.js → esm-4QSCBEZC.js} +15 -2
- package/build/esm/esm-4QSCBEZC.js.map +1 -0
- package/build/{browser/esm-MRNBIYTC.js → esm/esm-F6Y6OKER.js} +9 -2
- package/build/esm/esm-F6Y6OKER.js.map +1 -0
- package/build/esm/{esm-BVGFJP4A.js → esm-FXURBNU2.js} +15 -2
- package/build/esm/esm-FXURBNU2.js.map +1 -0
- package/build/{browser/esm-LSHNW2RY.js → esm/esm-G7B67PJ6.js} +17 -3
- package/build/esm/esm-G7B67PJ6.js.map +1 -0
- package/build/{browser/esm-KQDXBELM.js → esm/esm-H2IADGOR.js} +15 -2
- package/build/esm/esm-H2IADGOR.js.map +1 -0
- package/build/esm/{esm-XR4L35X6.js → esm-IWXD7ZFP.js} +9 -2
- package/build/esm/esm-IWXD7ZFP.js.map +1 -0
- package/build/{browser/esm-OSSDC2WN.js → esm/esm-LF7OTAKA.js} +9 -2
- package/build/esm/esm-LF7OTAKA.js.map +1 -0
- package/build/esm/{esm-DRTFALTA.js → esm-PQDKPDBA.js} +9 -2
- package/build/esm/esm-PQDKPDBA.js.map +1 -0
- package/build/{browser/esm-N7SXGNJF.js → esm/esm-S2OWTMMF.js} +17 -3
- package/build/esm/esm-S2OWTMMF.js.map +1 -0
- package/build/{browser/esm-DNMTAVCV.js → esm/esm-Y7D2PCM4.js} +9 -2
- package/build/esm/esm-Y7D2PCM4.js.map +1 -0
- package/build/esm/index.js +61 -15
- package/build/esm/index.js.map +1 -1
- package/build/esm/prompts/promptScopes.d.ts +4 -0
- package/build/esm/prompts/promptScopes.d.ts.map +1 -0
- package/build/esm/run.d.ts +2 -1
- package/build/esm/run.d.ts.map +1 -1
- package/build/esm/templates.d.ts +1 -0
- package/build/esm/templates.d.ts.map +1 -1
- package/package.json +12 -12
- package/build/browser/esm-BVGFJP4A.js.map +0 -1
- package/build/browser/esm-DNMTAVCV.js.map +0 -1
- package/build/browser/esm-DRTFALTA.js.map +0 -1
- package/build/browser/esm-KQDXBELM.js.map +0 -1
- package/build/browser/esm-LSHNW2RY.js.map +0 -1
- package/build/browser/esm-MRNBIYTC.js.map +0 -1
- package/build/browser/esm-N7SXGNJF.js.map +0 -1
- package/build/browser/esm-OSSDC2WN.js.map +0 -1
- package/build/browser/esm-XQ5YTOO2.js.map +0 -1
- package/build/browser/esm-XR4L35X6.js.map +0 -1
- package/build/esm/esm-BVGFJP4A.js.map +0 -1
- package/build/esm/esm-DNMTAVCV.js.map +0 -1
- package/build/esm/esm-DRTFALTA.js.map +0 -1
- package/build/esm/esm-KQDXBELM.js.map +0 -1
- package/build/esm/esm-LSHNW2RY.js.map +0 -1
- package/build/esm/esm-MRNBIYTC.js.map +0 -1
- package/build/esm/esm-N7SXGNJF.js.map +0 -1
- package/build/esm/esm-OSSDC2WN.js.map +0 -1
- package/build/esm/esm-XQ5YTOO2.js.map +0 -1
- package/build/esm/esm-XR4L35X6.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../create-app.template.tutorial-todo-app/build/esm/generatedNoCheck/index.js"],"names":[],"mappings":"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","file":"esm-PQDKPDBA.js","sourcesContent":["export const files = new Map([[\"README.md.hbs\", {\n type: \"raw\",\n body: `# {{project}}\n\nThis project was generated with [\\`@osdk/create-app\\`](https://www.npmjs.com/package/@osdk/create-app) and is intended to be used alongside the Developer Console tutorial for creating a To Do App against a reference Ontology.\n\n## Developing\n\nRun the following command or equivalent with your preferred package manager to start a local development server on \\`http://localhost:8080\\`:\n\n\\`\\`\\`sh\nnpm run dev\n\\`\\`\\`\n\nDevelopment configuration is stored in \\`.env.development\\`.\n\n{{#if corsProxy}}\nIn order to make API requests to Foundry, a CORS proxy has been set up for local development which may be removed if the stack is configured to allow \\`http://localhost:8080\\` to load resources. The configured OAuth client must also allow \\`http://localhost:8080/auth/callback\\` as a redirect URL.\n{{else}}\nIn order to make API requests to Foundry, CORS must be configured for the stack to allow \\`http://localhost:8080\\` to load resources. If this has not been configured and you are unable to request this, you can alternatively generate your project again with \\`--corsProxy true\\` to use a proxy for API requests during local development. The configured OAuth client must also allow \\`http://localhost:8080/auth/callback\\` as a redirect URL.\n{{/if}}\n\n## Deploying\n\nRun the following command or equivalent with your preferred package manager to create a production build of your application:\n\n\\`\\`\\`sh\nnpm run build\n\\`\\`\\`\n\nProduction configuration is stored in \\`.env.production\\`.\n\nIf you did not fill in the URL your production application will be hosted on you will need to fill in the \\`VITE_FOUNDRY_REDIRECT_URL\\` in \\`.env.production\\`. A default test is included in \\`env.test.ts\\` to verify your production environment variables which you can enable by removing the skip condition or running tests with the environment variable set \\`VERIFY_ENV_PRODUCTION=true\\`.\n\nIn order to make API requests to Foundry, CORS must be configured for the stack to allow the production origin to load resources. This will be automatically done for you if you are using Foundry website hosting. The configured OAuth client must also allow the production origin auth callback as a redirect URL.\n\nA \\`foundry.config.json\\` file is included in the root of this project to make deploying to Foundry website hosting with [\\`@osdk/cli\\`](https://www.npmjs.com/package/@osdk/cli) easier. If you are not using Foundry website hosting for your application you may delete this file.\n`\n}], [\".gitignore\", {\n type: \"raw\",\n body: `# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n`\n}], [\"eslint.config.mjs\", {\n \"type\": \"base64\",\n \"body\": \"Ly8gQHRzLWNoZWNrCmltcG9ydCBlc2xpbnQgZnJvbSAiQGVzbGludC9qcyI7CmltcG9ydCB0c1BhcnNlciBmcm9tICJAdHlwZXNjcmlwdC1lc2xpbnQvcGFyc2VyIjsKaW1wb3J0ICogYXMgaW1wb3J0UGx1Z2luIGZyb20gImVzbGludC1wbHVnaW4taW1wb3J0IjsKaW1wb3J0IGpzeEExMXlQbHVnaW4gZnJvbSAiZXNsaW50LXBsdWdpbi1qc3gtYTExeSI7CmltcG9ydCByZWFjdFBsdWdpbiBmcm9tICJlc2xpbnQtcGx1Z2luLXJlYWN0IjsKaW1wb3J0IHJlYWN0SG9va3NQbHVnaW4gZnJvbSAiZXNsaW50LXBsdWdpbi1yZWFjdC1ob29rcyI7CmltcG9ydCByZWFjdFJlZnJlc2ggZnJvbSAiZXNsaW50LXBsdWdpbi1yZWFjdC1yZWZyZXNoIjsKaW1wb3J0IGdsb2JhbHMgZnJvbSAiZ2xvYmFscyI7CmltcG9ydCB0c2VzbGludCBmcm9tICJ0eXBlc2NyaXB0LWVzbGludCI7CgpleHBvcnQgZGVmYXVsdCB0c2VzbGludC5jb25maWcoewogIGZpbGVzOiBbImVzbGludC5jb25maWcubWpzIiwgInNyYy8qKi8qLntqcyxtanMsY2pzLHRzLGpzeCx0c3h9Il0sCiAgc2V0dGluZ3M6IHsKICAgIHJlYWN0OiB7CiAgICAgIHZlcnNpb246ICJkZXRlY3QiLAogICAgfSwKCiAgICAiaW1wb3J0L3Jlc29sdmVyIjogewogICAgICBub2RlOiB7CiAgICAgICAgZXh0ZW5zaW9uczogWyIuanMiLCAiLmpzeCIsICIudHMiLCAiLnRzeCJdLAogICAgICB9LAogICAgfSwKICB9LAogIGxhbmd1YWdlT3B0aW9uczogewogICAgZ2xvYmFsczogewogICAgICAuLi5nbG9iYWxzLmJyb3dzZXIsCiAgICB9LAoKICAgIHBhcnNlcjogdHNQYXJzZXIsCiAgfSwKICBleHRlbmRzOiBbCiAgICBlc2xpbnQuY29uZmlncy5yZWNvbW1lbmRlZCwKICAgIC4uLnRzZXNsaW50LmNvbmZpZ3MucmVjb21tZW5kZWQsCiAgXSwKICBwbHVnaW5zOiB7CiAgICAicmVhY3QiOiAvKiogQHR5cGUgaW1wb3J0KCJlc2xpbnQiKS5FU0xpbnQuUGx1Z2luICovIChyZWFjdFBsdWdpbiksCiAgICAicmVhY3QtcmVmcmVzaCI6IHJlYWN0UmVmcmVzaCwKICAgICJyZWFjdC1ob29rcyI6CiAgICAgIC8qKiBAdHlwZSBpbXBvcnQoImVzbGludCIpLkVTTGludC5QbHVnaW4gKi8gKHJlYWN0SG9va3NQbHVnaW4pLAogICAgImpzeC1hMTF5IjoganN4QTExeVBsdWdpbiwKICAgICJpbXBvcnQiOiBpbXBvcnRQbHVnaW4sCiAgfSwKICBydWxlczogewogICAgLi4uKAogICAgICAvKiogQHR5cGUgaW1wb3J0KCJlc2xpbnQiKS5MaW50ZXIuUnVsZXNSZWNvcmQgKi8KICAgICAgKHJlYWN0UGx1Z2luLmNvbmZpZ3MuZmxhdD8ucmVjb21tZW5kZWQucnVsZXMpCiAgICApLAogICAgInJlYWN0LWhvb2tzL3J1bGVzLW9mLWhvb2tzIjogImVycm9yIiwKICAgICJyZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHMiOiAid2FybiIsCiAgICAuLi5qc3hBMTF5UGx1Z2luLmNvbmZpZ3MucmVjb21tZW5kZWQucnVsZXMsCiAgICAicmVhY3QtcmVmcmVzaC9vbmx5LWV4cG9ydC1jb21wb25lbnRzIjogWyJ3YXJuIiwgewogICAgICBhbGxvd0NvbnN0YW50RXhwb3J0OiB0cnVlLAogICAgfV0sCgogICAgImltcG9ydC9uYW1lZCI6ICJlcnJvciIsCiAgICAiaW1wb3J0L2RlZmF1bHQiOiAiZXJyb3IiLAogICAgImltcG9ydC9uYW1lc3BhY2UiOiAiZXJyb3IiLAogICAgImltcG9ydC9uby1kdXBsaWNhdGVzIjogImVycm9yIiwKICAgICJpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMiOiAiZXJyb3IiLAoKICAgICJyZWFjdC9yZWFjdC1pbi1qc3gtc2NvcGUiOiAib2ZmIiwKICB9LAp9KTsK\"\n}], [\"index.html\", {\n type: \"raw\",\n body: `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <link rel=\"icon\" type=\"image/svg+xml\" href=\"/todo-app.svg\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>Ontology SDK Tutorial - Todo App</title>\n </head>\n <body>\n <div id=\"root-container\">\n <div id=\"root\"></div>\n </div>\n <script type=\"module\" src=\"/src/main.tsx\"></script>\n </body>\n</html>\n`\n}], [\"package.json.hbs\", {\n type: \"raw\",\n body: `{\n \"name\": \"{{project}}\",\n \"private\": true,\n \"version\": \"0.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"vite\",\n \"build\": \"tsc && vite build\",\n \"lint\": \"eslint . --report-unused-disable-directives --max-warnings 0\",\n \"test\": \"vitest run\",\n \"preview\": \"vite preview\"\n },\n \"dependencies\": {\n \"{{osdkPackage}}\": \"latest\",\n \"react\": \"^18\",\n \"react-dom\": \"^18\",\n \"react-router-dom\": \"^6.23.1\",\n \"swr\": \"^2.2.5\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^9.13.0\",\n \"@types/react\": \"^18\",\n \"@types/react-dom\": \"^18\",\n \"@typescript-eslint/eslint-plugin\": \"^8.11.0\",\n \"@typescript-eslint/parser\": \"^8.11.0\",\n \"@vitejs/plugin-react\": \"^4.2.0\",\n \"eslint\": \"^9.13.0\",\n \"eslint-plugin-import\": \"^2.31.0\",\n \"eslint-plugin-jsx-a11y\": \"^6.10.1\",\n \"eslint-plugin-react\": \"^7.37.2\",\n \"eslint-plugin-react-hooks\": \"^5.0.0\",\n \"eslint-plugin-react-refresh\": \"^0.4.14\",\n \"globals\": \"^15.11.0\",\n \"typescript\": \"~5.5.4\",\n \"typescript-eslint\": \"^8.11.0\",\n \"vite\": \"^5.4.8\",\n \"vitest\": \"^2.1.2\"\n }\n}`\n}], [\"public/todo-app.svg\", {\n \"type\": \"base64\",\n \"body\": \"PHN2ZyB3aWR0aD0iMTI4IiBoZWlnaHQ9IjEyOCIgdmlld0JveD0iMCAwIDEyOCAxMjgiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxyZWN0IHdpZHRoPSIxMjgiIGhlaWdodD0iMTI4IiByeD0iMTYiIGZpbGw9IiNGQkIzNjAiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0yOCA4MlY5NEg0MFY4MkgyOFpNMjIgNzBINDZDNDkuMyA3MCA1MiA3Mi43IDUyIDc2VjEwMEM1MiAxMDMuMyA0OS4zIDEwNiA0NiAxMDZIMjJDMTguNyAxMDYgMTYgMTAzLjMgMTYgMTAwVjc2QzE2IDcyLjcgMTguNyA3MCAyMiA3MFpNNzYgMzRIMTA2QzEwOS4zIDM0IDExMiAzNi43IDExMiA0MEMxMTIgNDMuMyAxMDkuMyA0NiAxMDYgNDZINzZDNzIuNyA0NiA3MCA0My4zIDcwIDQwQzcwIDM2LjcgNzIuNyAzNCA3NiAzNFpNNTIgMjJDNTUuMyAyMiA1OCAyNC43IDU4IDI4QzU4IDI5LjY4IDU3LjM0IDMxLjE4IDU2LjI2IDMyLjI2TDM4LjI2IDU2LjI2QzM3LjE4IDU3LjM0IDM1LjY4IDU4IDM0IDU4QzMyLjMyIDU4IDMwLjgyIDU3LjM0IDI5Ljc0IDU2LjI2TDE3Ljc0IDQ0LjI2QzE2LjY2IDQzLjE4IDE2IDQxLjY4IDE2IDQwQzE2IDM2LjcgMTguNyAzNCAyMiAzNEMyMy42OCAzNCAyNS4xOCAzNC42NiAyNi4yNiAzNS43NEwzNCA0My41NEw0Ny43NCAyMy43NEM0OC44MiAyMi42NiA1MC4zMiAyMiA1MiAyMlpNNzYgODJIMTA2QzEwOS4zIDgyIDExMiA4NC43IDExMiA4OEMxMTIgOTEuMyAxMDkuMyA5NCAxMDYgOTRINzZDNzIuNyA5NCA3MCA5MS4zIDcwIDg4QzcwIDg0LjcgNzIuNyA4MiA3NiA4MloiIGZpbGw9IiM3NzQ1MEQiLz4KPC9zdmc+Cg==\"\n}], [\"src/AuthCallback.tsx\", {\n type: \"raw\",\n body: `import { useEffect, useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport client from \"./client\";\n\n/**\n * Component to render at \\`/auth/callback\\`\n * This calls signIn() again to save the token, and then navigates the user back to the home page.\n */\nfunction AuthCallback() {\n const [error, setError] = useState<string | undefined>(undefined);\n const navigate = useNavigate();\n\n // This effect conflicts with React 18 strict mode in development\n // https://react.dev/learn/synchronizing-with-effects#how-to-handle-the-effect-firing-twice-in-development\n useEffect(() => {\n client.auth\n .signIn()\n .then(() => navigate(\"/\", { replace: true }))\n .catch((e: unknown) => setError((e as Error).message ?? e));\n }, [navigate]);\n return <div>{error != null ? error : \"Authenticating…\"}</div>;\n}\n\nexport default AuthCallback;\n`\n}], [\"src/AuthenticatedRoute.tsx\", {\n type: \"raw\",\n body: `import { useEffect, useState } from \"react\";\nimport { Outlet, useNavigate } from \"react-router-dom\";\nimport client from \"./client\";\n\n/**\n * A component that can be used to wrap routes that require authentication.\n * Nested routes may assume that a valid token is present.\n */\nfunction AuthenticatedRoute() {\n const navigate = useNavigate();\n const [token, setToken] = useState(client.auth.token);\n useEffect(() => {\n if (client.auth.token == null || client.auth.token.isExpired) {\n client.auth\n .refresh()\n .then(() => {\n setToken(client.auth.token);\n })\n .catch(() => {\n // If we cannot refresh the token (i.e. the user is not logged in) we redirect to the login page\n navigate(\"/login\");\n });\n }\n }, [navigate]);\n\n if (token == null || token.isExpired) {\n return null;\n }\n\n return <Outlet />;\n}\n\nexport default AuthenticatedRoute;\n`\n}], [\"src/CreateProjectButton.tsx\", {\n type: \"raw\",\n body: `import { useCallback, useState } from \"react\";\nimport CreateProjectDialog from \"./CreateProjectDialog\";\nimport useProjects from \"./useProjects\";\n\ninterface CreateProjectButtonProps {\n onProjectCreated?: (projectId: string) => void;\n}\n\nfunction CreateProjectButton({ onProjectCreated }: CreateProjectButtonProps) {\n const { isLoading: isLoadingProjects, isError: isErrorProjects } =\n useProjects();\n\n const [isOpen, setIsOpen] = useState(false);\n const handleOpen = useCallback(() => setIsOpen(true), []);\n const handleClose = useCallback(() => setIsOpen(false), []);\n\n if (isLoadingProjects || isErrorProjects) {\n return null;\n }\n\n return (\n <>\n <button onClick={handleOpen}>Create Project</button>\n <CreateProjectDialog\n isOpen={isOpen}\n onClose={handleClose}\n onProjectCreated={onProjectCreated}\n />\n </>\n );\n}\n\nexport default CreateProjectButton;\n`\n}], [\"src/CreateProjectDialog.tsx\", {\n type: \"raw\",\n body: `import { ChangeEvent, useCallback, useEffect, useState } from \"react\";\nimport Dialog from \"./Dialog\";\nimport useProjects from \"./useProjects\";\n\ninterface CreateProjectDialogProps {\n isOpen: boolean;\n onClose: () => void;\n onProjectCreated?: (projectId: string) => void;\n}\n\nfunction CreateProjectDialog({\n isOpen,\n onClose,\n onProjectCreated,\n}: CreateProjectDialogProps) {\n const { createProject } = useProjects();\n\n const [name, setName] = useState<string>(\"New project\");\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => setName(e.target.value),\n [],\n );\n\n useEffect(() => setName(\"New project\"), [isOpen]);\n\n const [isCreating, setIsCreating] = useState(false);\n const handleSubmit = useCallback(async () => {\n setIsCreating(true);\n try {\n const projectId = await createProject(name);\n onProjectCreated?.(projectId);\n } finally {\n setIsCreating(false);\n onClose();\n }\n }, [onProjectCreated, onClose, createProject, name]);\n\n return (\n <Dialog\n isOpen={isOpen}\n buttons={[\n <button disabled={isCreating} onClick={onClose} key=\"cancel\">\n Cancel\n </button>,\n <button disabled={isCreating} onClick={handleSubmit} key=\"create\">\n Create project\n </button>,\n ]}\n >\n <label>\n Project name: <input type=\"text\" value={name} onChange={handleChange} />\n </label>\n </Dialog>\n );\n}\nexport default CreateProjectDialog;\n`\n}], [\"src/CreateTaskButton.tsx\", {\n type: \"raw\",\n body: `import { useCallback, useState } from \"react\";\nimport CreateTaskDialog from \"./CreateTaskDialog\";\nimport { MockProject } from \"./mocks\";\nimport { useProjectTasks } from \"./useProjectTasks\";\n\ninterface CreateTaskButtonProps {\n project: MockProject;\n}\n\nfunction CreateTaskButton({ project }: CreateTaskButtonProps) {\n const { isLoading: isLoadingTasks, isError: isErrorTasks } = useProjectTasks(\n project,\n );\n\n const [isOpen, setIsOpen] = useState(false);\n const handleOpen = useCallback(() => setIsOpen(true), []);\n const handleClose = useCallback(() => setIsOpen(false), []);\n\n if (isLoadingTasks || isErrorTasks) {\n return null;\n }\n\n return (\n <>\n <button onClick={handleOpen}>Create Task</button>\n <CreateTaskDialog\n project={project}\n isOpen={isOpen}\n onClose={handleClose}\n />\n </>\n );\n}\n\nexport default CreateTaskButton;\n`\n}], [\"src/CreateTaskDialog.tsx\", {\n type: \"raw\",\n body: `import { ChangeEvent, useCallback, useEffect, useState } from \"react\";\nimport Dialog from \"./Dialog\";\nimport { MockProject } from \"./mocks\";\nimport { useProjectTasks } from \"./useProjectTasks\";\n\ninterface CreateTaskDialogProps {\n project: MockProject;\n isOpen: boolean;\n onClose: () => void;\n}\n\nfunction CreateTaskDialog({ project, isOpen, onClose }: CreateTaskDialogProps) {\n const { createTask } = useProjectTasks(project);\n\n const [name, setName] = useState<string>(\"New task\");\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => setName(e.target.value),\n [],\n );\n\n useEffect(() => setName(\"New task\"), [isOpen]);\n\n const [isCreating, setIsCreating] = useState(false);\n const handleSubmit = useCallback(async () => {\n setIsCreating(true);\n try {\n await createTask(name);\n } finally {\n setIsCreating(false);\n onClose();\n }\n }, [onClose, createTask, name]);\n\n return (\n <Dialog\n isOpen={isOpen}\n buttons={[\n <button disabled={isCreating} onClick={onClose} key=\"cancel\">\n Cancel\n </button>,\n <button disabled={isCreating} onClick={handleSubmit} key=\"create\">\n Create task\n </button>,\n ]}\n >\n <label>\n Task name: <input type=\"text\" value={name} onChange={handleChange} />\n </label>\n </Dialog>\n );\n}\nexport default CreateTaskDialog;\n`\n}], [\"src/DeleteProjectButton.tsx\", {\n type: \"raw\",\n body: `import { useCallback, useState } from \"react\";\nimport DeleteProjectDialog from \"./DeleteProjectDialog\";\nimport { MockProject } from \"./mocks\";\nimport useProjects from \"./useProjects\";\n\ninterface DeleteProjectButtonProps {\n project: MockProject;\n}\n\nfunction DeleteProjectButton({ project }: DeleteProjectButtonProps) {\n const { isLoading: isLoadingProjects, isError: isErrorProjects } =\n useProjects();\n\n const [isOpen, setIsOpen] = useState(false);\n const handleOpen = useCallback(() => setIsOpen(true), []);\n const handleClose = useCallback(() => setIsOpen(false), []);\n\n if (isLoadingProjects || isErrorProjects) {\n return null;\n }\n\n return (\n <>\n <button onClick={handleOpen}>Delete Project</button>\n <DeleteProjectDialog\n project={project}\n isOpen={isOpen}\n onClose={handleClose}\n />\n </>\n );\n}\n\nexport default DeleteProjectButton;\n`\n}], [\"src/DeleteProjectDialog.tsx\", {\n type: \"raw\",\n body: `import { useCallback, useState } from \"react\";\nimport Dialog from \"./Dialog\";\nimport { MockProject } from \"./mocks\";\nimport useProjects from \"./useProjects\";\n\ninterface DeleteProjectDialogProps {\n project: MockProject;\n isOpen: boolean;\n onClose: () => void;\n}\n\nfunction DeleteProjectDialog({\n project,\n isOpen,\n onClose,\n}: DeleteProjectDialogProps) {\n const { deleteProject } = useProjects();\n\n const [isDeleting, setIsDeleting] = useState(false);\n const handleSubmit = useCallback(async () => {\n setIsDeleting(true);\n try {\n await deleteProject(project);\n } finally {\n setIsDeleting(false);\n onClose();\n }\n }, [deleteProject, onClose, project]);\n\n return (\n <Dialog\n isOpen={isOpen}\n buttons={[\n <button disabled={isDeleting} onClick={onClose} key=\"cancel\">\n Cancel\n </button>,\n <button disabled={isDeleting} onClick={handleSubmit} key=\"delete\">\n Delete\n </button>,\n ]}\n >\n Are you sure you want to delete this project?\n </Dialog>\n );\n}\nexport default DeleteProjectDialog;\n`\n}], [\"src/Dialog.module.css\", {\n \"type\": \"base64\",\n \"body\": \"LmJ1dHRvbnMgewogIGRpc3BsYXk6IGZsZXg7CiAgZ2FwOiAxZW07CiAgbWFyZ2luLXRvcDogMWVtOwp9CgouZGlhbG9nIHsKICBib3JkZXI6IDFweCBzb2xpZCBibGFjazsKICBib3JkZXItcmFkaXVzOiAxMHB4Owp9\"\n}], [\"src/Dialog.tsx\", {\n type: \"raw\",\n body: `import { PropsWithChildren } from \"react\";\nimport css from \"./Dialog.module.css\";\n\ninterface DialogProps {\n isOpen: boolean;\n buttons?: React.ReactElement[];\n}\n\nfunction Dialog({ children, isOpen, buttons }: PropsWithChildren<DialogProps>) {\n return (\n <dialog open={isOpen} className={css.dialog}>\n {children}\n {buttons != null && buttons.length > 0 && (\n <div className={css.buttons}>{buttons}</div>\n )}\n </dialog>\n );\n}\nexport default Dialog;\n`\n}], [\"src/Home.module.css\", {\n \"type\": \"base64\",\n \"body\": \"LnR1dG9yaWFsQmFubmVyV3JhcHBlciB7CiAgZGlzcGxheTogZmxleDsKICBtYXJnaW46IDJlbTsKfQoKLnR1dG9yaWFsQmFubmVyIHsKICBmbGV4OiAxOwogIHdpZHRoOiAwOwogIGJhY2tncm91bmQ6IGhzbCgzNSwgMTAwJSwgNzAlKTsKICBib3JkZXItcmFkaXVzOiAxZW07CiAgcGFkZGluZzogMWVtOwogIGJveC1zaGFkb3c6IDAgMTBweCAxNXB4IC0zcHggcmdiKDAgMCAwIC8gMC4xKSwgMCA0cHggNnB4IC00cHggcmdiKDAgMCAwIC8gMC4xKTsKfQoKLnR1dG9yaWFsQmFubmVyVGl0bGUgewogIG1hcmdpbi10b3A6IDA7CiAgZm9udC13ZWlnaHQ6IDYwMDsKfQoKLnByb2plY3RTZWxlY3QgewogIGRpc3BsYXk6IGZsZXg7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBnYXA6IDFlbTsKICBtYXJnaW46IDJlbTsKICBmb250LXdlaWdodDogNjAwOwp9CgoucHJvamVjdENhcmQgewogIG1hcmdpbjogMmVtOwp9CgoucHJvamVjdFRpdGxlIHsKICBmb250LXNpemU6IDEuNWVtOwp9Cg==\"\n}], [\"src/Home.tsx\", {\n type: \"raw\",\n body: `import { useCallback, useEffect, useState } from \"react\";\nimport CreateProjectButton from \"./CreateProjectButton\";\nimport CreateTaskButton from \"./CreateTaskButton\";\nimport DeleteProjectButton from \"./DeleteProjectButton\";\nimport css from \"./Home.module.css\";\nimport Layout from \"./Layout\";\nimport { MockProject } from \"./mocks\";\nimport ProjectSelect from \"./ProjectSelect\";\nimport TaskList from \"./TaskList\";\nimport useProjects from \"./useProjects\";\n\nfunction Home() {\n const [projectId, setProjectId] = useState<string | undefined>(undefined);\n const { projects } = useProjects();\n const project = projects?.find((p) => p.id === projectId);\n\n const handleSelectProject = useCallback(\n (p: MockProject) => setProjectId(p.id),\n [],\n );\n\n useEffect(() => {\n if (project == null && projects != null && projects.length > 0) {\n setProjectId(projects[0].id);\n }\n }, [project, projects]);\n\n return (\n <Layout>\n <div className={css.tutorialBannerWrapper}>\n <div className={css.tutorialBanner}>\n <p className={css.tutorialBannerTitle}>\n 💡 Welcome to To Do app tutorial!\n </p>\n <p>\n The To Do App is implemented with mock in-memory data.\n <br />Can you solve how to switch it to use the Ontology SDK\n instead?\n </p>\n </div>\n </div>\n <div className={css.projectSelect}>\n <span>Project:</span>\n <ProjectSelect\n project={project}\n projects={projects ?? []}\n onSelectProject={handleSelectProject}\n />\n <CreateProjectButton onProjectCreated={setProjectId} />\n {project != null && <DeleteProjectButton project={project} />}\n </div>\n {project != null && (\n <div className={css.projectCard} key={project.id}>\n <h1 className={css.projectTitle}>{project.name}</h1>\n <TaskList project={project} />\n <CreateTaskButton project={project} />\n </div>\n )}\n </Layout>\n );\n}\n\nexport default Home;\n`\n}], [\"src/Layout.module.css\", {\n \"type\": \"base64\",\n \"body\": \"LmhlYWRlciB7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIG1hcmdpbjogMmVtOwp9CgoubG9nbyB7CiAgaGVpZ2h0OiA0ZW07CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBtYXJnaW4tcmlnaHQ6IDFlbTsKfQoKLnRpdGxlIHsKICBmb250LXdlaWdodDogNjAwOwogIGZvbnQtc2l6ZTogMS41ZW07Cn0K\"\n}], [\"src/Layout.tsx\", {\n type: \"raw\",\n body: `import todoAppLogo from \"/todo-app.svg\";\nimport React from \"react\";\nimport css from \"./Layout.module.css\";\n\ninterface LayoutProps {\n children?: React.ReactNode;\n}\n\nfunction Layout({ children }: LayoutProps) {\n return (\n <>\n <div className={css.header}>\n <img src={todoAppLogo} className={css.logo} alt=\"Todo App logo\" />\n <div className={css.title}>Ontology SDK Tutorial - Todo App</div>\n </div>\n {children}\n </>\n );\n}\n\nexport default Layout;\n`\n}], [\"src/Login.module.css\", {\n \"type\": \"base64\",\n \"body\": \"LmxvZ2luQnV0dG9uIHsKICBkaXNwbGF5OiBmbGV4OwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIG1hcmdpbjogMmVtOwp9Cg==\"\n}], [\"src/Login.tsx\", {\n type: \"raw\",\n body: `import { useCallback, useState } from \"react\";\nimport { Navigate } from \"react-router-dom\";\nimport client from \"./client\";\nimport Layout from \"./Layout\";\nimport css from \"./Login.module.css\";\n\nfunction Login() {\n const [isLoggingIn, setIsLoggingIn] = useState(false);\n const [error, setError] = useState<string | undefined>(undefined);\n const token = client.auth.token;\n\n const handleLogin = useCallback(async () => {\n setIsLoggingIn(true);\n try {\n // Initiate the OAuth flow, which will redirect the user to log into Foundry\n // Once the login has completed, the user will be redirected back to the route defined via the\n // FOUNDRY_REDIRECT_URL variable in .env.development\n await client.auth.signIn();\n } catch (e: unknown) {\n console.error(e);\n setError((e as Error).message ?? e);\n } finally {\n setIsLoggingIn(false);\n }\n }, []);\n\n // If the token exists but a user tries to load /login, redirect to the home page instead\n if (token != null) {\n return <Navigate to=\"/\" replace={true} />;\n }\n\n return (\n <Layout>\n <div className={css.loginButton}>\n <button onClick={handleLogin}>\n {isLoggingIn ? \"Logging in…\" : \"Log in \"}\n </button>\n </div>\n {error && <div>Unable to log in: {error}</div>}\n </Layout>\n );\n}\n\nexport default Login;\n`\n}], [\"src/ProjectSelect.tsx\", {\n type: \"raw\",\n body: `import { ChangeEvent, useCallback } from \"react\";\nimport { MockProject } from \"./mocks\";\n\ninterface ProjectSelectProps {\n project: MockProject | undefined;\n projects: MockProject[];\n onSelectProject: (project: MockProject) => void;\n}\n\nfunction ProjectSelect({\n project,\n projects,\n onSelectProject,\n}: ProjectSelectProps) {\n const handleSelect = useCallback(\n (e: ChangeEvent<HTMLSelectElement>) => {\n const nextProject = projects.find((p) => \\`\\${p.id}\\` === e.target.value);\n if (nextProject != null) {\n onSelectProject(nextProject);\n }\n },\n [projects, onSelectProject],\n );\n\n return (\n <select value={project?.id} onChange={handleSelect}>\n <option hidden disabled value=\"\">\n -- select a project --\n </option>\n\n {projects.map((p) => (\n <option key={p.id} value={p.id}>\n {p.name}\n </option>\n ))}\n </select>\n );\n}\n\nexport default ProjectSelect;\n`\n}], [\"src/TaskList.module.css\", {\n \"type\": \"base64\",\n \"body\": \"LnRhc2tMaXN0IHsKICBsaXN0LXN0eWxlOiBub25lOwogIHBhZGRpbmc6IDA7CiAgbWFyZ2luLXRvcDogMWVtOwogIG1hcmdpbi1ib3R0b206IDFlbTsKfQo=\"\n}], [\"src/TaskList.tsx\", {\n type: \"raw\",\n body: `import { MockProject } from \"./mocks\";\nimport css from \"./TaskList.module.css\";\nimport TaskListItem from \"./TaskListItem\";\nimport { useProjectTasks } from \"./useProjectTasks\";\n\ninterface TaskListProps {\n project: MockProject;\n}\n\nfunction TaskList({ project }: TaskListProps) {\n const {\n tasks,\n isLoading: isLoadingTasks,\n isError: isErrorTasks,\n deleteTask,\n } = useProjectTasks(project);\n\n if (isErrorTasks) {\n return <div className={css.taskList}>Error loading tasks!</div>;\n } else if (isLoadingTasks) {\n return null;\n }\n\n const data = tasks ?? [];\n if (data.length === 0) {\n return <div className={css.taskList}>No tasks found</div>;\n }\n\n return (\n <ul className={css.taskList}>\n {data.map((task) => (\n <TaskListItem key={task.id} task={task} deleteTask={deleteTask} />\n ))}\n </ul>\n );\n}\n\nexport default TaskList;\n`\n}], [\"src/TaskListItem.module.css\", {\n \"type\": \"base64\",\n \"body\": \"LmxhYmVsIHsKICBtYXJnaW4tbGVmdDogMC41ZW07Cn0KCi5jaGVja2VkIHsKICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDsKfQoKLmRlbGV0ZSB7CiAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICBwYWRkaW5nOiAycHg7Cn0KCg==\"\n}], [\"src/TaskListItem.tsx\", {\n type: \"raw\",\n body: `import { useCallback, useState } from \"react\";\nimport { MockTask } from \"./mocks\";\nimport css from \"./TaskListItem.module.css\";\n\ninterface TaskListItemProps {\n task: MockTask;\n deleteTask: (task: MockTask) => Promise<void>;\n}\n\nfunction TaskListItem({ task, deleteTask }: TaskListItemProps) {\n const [isDeleting, setIsDeleting] = useState(false);\n const handleClick = useCallback(async () => {\n setIsDeleting(true);\n try {\n await deleteTask(task);\n } finally {\n setIsDeleting(false);\n }\n }, [deleteTask, task]);\n\n return (\n <li>\n <label\n className={\\`\\${css.label} \\${isDeleting ? css.checked : \"\"}\\`}\n htmlFor={\\`\\${task.id}\\`}\n >\n <input\n type=\"checkbox\"\n onChange={handleClick}\n checked={isDeleting}\n className={css.delete}\n title=\"Delete task\"\n />\n {task.title}\n </label>\n </li>\n );\n}\n\nexport default TaskListItem;\n`\n}], [\"src/client.ts.hbs\", {\n type: \"raw\",\n body: `import { FoundryClient, PublicClientAuth } from \"{{osdkPackage}}\";\n\nconst url = import.meta.env.VITE_FOUNDRY_API_URL;\nconst clientId = import.meta.env.VITE_FOUNDRY_CLIENT_ID;\nconst redirectUrl = import.meta.env.VITE_FOUNDRY_REDIRECT_URL;\ncheckEnv(url, \"VITE_FOUNDRY_API_URL\");\ncheckEnv(clientId, \"VITE_FOUNDRY_CLIENT_ID\");\ncheckEnv(redirectUrl, \"VITE_FOUNDRY_REDIRECT_URL\");\n\nfunction checkEnv(\n value: string | undefined,\n name: string,\n): asserts value is string {\n if (value == null) {\n throw new Error(\\`Missing environment variable: \\${name}\\`);\n }\n}\n\n/**\n * Initialize the client to interact with the Ontology SDK\n */\nconst client = new FoundryClient({\n url,\n auth: new PublicClientAuth({\n clientId,\n url,\n redirectUrl,\n {{#if scopes}}\n scopes: [\n {{#each scopes}}\n \"{{this}}\",\n {{/each}}\n ],\n {{/if}}\n }),\n});\n\nexport default client;\n`\n}], [\"src/env.test.ts\", {\n \"type\": \"base64\",\n \"body\": \"aW1wb3J0IHsgbG9hZEVudiB9IGZyb20gInZpdGUiOwppbXBvcnQgeyBleHBlY3QsIHRlc3QgfSBmcm9tICJ2aXRlc3QiOwoKY29uc3QgRU5WX1ZBUlMgPSBbCiAgIlZJVEVfRk9VTkRSWV9BUElfVVJMIiwKICAiVklURV9GT1VORFJZX0NMSUVOVF9JRCIsCiAgIlZJVEVfRk9VTkRSWV9SRURJUkVDVF9VUkwiLApdOwoKZm9yIChjb25zdCBlbnZWYXIgb2YgRU5WX1ZBUlMpIHsKICB0ZXN0LnNraXBJZihwcm9jZXNzLmVudi5WRVJJRllfRU5WX1BST0RVQ1RJT04gIT09ICJ0cnVlIikoCiAgICBgcHJvZHVjdGlvbiBlbnYgc2hvdWxkIGNvbnRhaW4gJHtlbnZWYXJ9YCwKICAgICgpID0+IHsKICAgICAgY29uc3QgZW52ID0gbG9hZEVudigicHJvZHVjdGlvbiIsIHByb2Nlc3MuY3dkKCkpOwogICAgICBleHBlY3QoZW52W2VudlZhcl0sIGAke2VudlZhcn0gc2hvdWxkIGJlIGRlZmluZWRgKS50b0JlRGVmaW5lZCgpOwogICAgICBleHBlY3QoCiAgICAgICAgZW52W2VudlZhcl0sCiAgICAgICAgYCR7ZW52VmFyfSBzaG91bGQgbm90IGNvbnRhaW4gcGxhY2Vob2xkZXIgdmFsdWVgLAogICAgICApLm5vdC50b01hdGNoKC88Lio+Lyk7CiAgICB9LAogICk7Cn0K\"\n}], [\"src/index.css\", {\n \"type\": \"base64\",\n \"body\": \"OnJvb3QgewogIGZvbnQtZmFtaWx5OiBJbnRlciwgc3lzdGVtLXVpLCBBdmVuaXIsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CiAgbGluZS1oZWlnaHQ6IDEuNTsKICBmb250LXdlaWdodDogNDAwOwoKICBmb250LXN5bnRoZXNpczogbm9uZTsKICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5OwogIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7Cn0KCiNyb290LWNvbnRhaW5lciB7CiAgZGlzcGxheTogZmxleDsKICBmbGV4OiAxOwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCiNyb290IHsKICBtYXgtd2lkdGg6IDEyODBweDsKICBtYXJnaW46IDJyZW0gYXV0bzsKICBwYWRkaW5nOiAycmVtOwp9CgphIHsKICBmb250LXdlaWdodDogNTAwOwogIGNvbG9yOiAjNjQ2Y2ZmOwogIHRleHQtZGVjb3JhdGlvbjogaW5oZXJpdDsKfQphOmhvdmVyIHsKICBjb2xvcjogIzUzNWJmMjsKfQoKYm9keSB7CiAgbWFyZ2luOiAwOwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBtaW4td2lkdGg6IDMyMHB4OwogIG1pbi1oZWlnaHQ6IDEwMHZoOwp9CgpoMSB7CiAgZm9udC1zaXplOiAzLjJlbTsKICBsaW5lLWhlaWdodDogMS4xOwp9CgpidXR0b24gewogIGJvcmRlci1yYWRpdXM6IDhweDsKICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICBwYWRkaW5nOiAwLjZlbSAxLjJlbTsKICBmb250LXNpemU6IDFlbTsKICBmb250LXdlaWdodDogNTAwOwogIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogIGN1cnNvcjogcG9pbnRlcjsKICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4yNXM7Cn0KYnV0dG9uOmhvdmVyIHsKICBib3JkZXItY29sb3I6ICM2NDZjZmY7Cn0KYnV0dG9uOmZvY3VzLApidXR0b246Zm9jdXMtdmlzaWJsZSB7CiAgb3V0bGluZTogNHB4IGF1dG8gLXdlYmtpdC1mb2N1cy1yaW5nLWNvbG9yOwp9CgpAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBsaWdodCkgewogIDpyb290IHsKICAgIGNvbG9yOiAjMjEzNTQ3OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKICB9CiAgYTpob3ZlciB7CiAgICBjb2xvcjogIzc0N2JmZjsKICB9CiAgYnV0dG9uIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7CiAgfQp9Cg==\"\n}], [\"src/main.tsx\", {\n type: \"raw\",\n body: `import ReactDOM from \"react-dom/client\";\nimport { createBrowserRouter, RouterProvider } from \"react-router-dom\";\nimport AuthCallback from \"./AuthCallback\";\nimport AuthenticatedRoute from \"./AuthenticatedRoute\";\nimport Home from \"./Home\";\nimport Login from \"./Login\";\nimport \"./index.css\";\n\nconst router = createBrowserRouter(\n [\n {\n path: \"/\",\n element: <AuthenticatedRoute />,\n children: [\n {\n path: \"/\",\n element: <Home />,\n },\n ],\n },\n {\n path: \"/login\",\n element: <Login />,\n },\n {\n // This is the route defined in your application's redirect URL\n path: \"/auth/callback\",\n element: <AuthCallback />,\n },\n ],\n { basename: import.meta.env.BASE_URL },\n);\n\nReactDOM.createRoot(document.getElementById(\"root\")!).render(\n <RouterProvider router={router} />,\n);\n`\n}], [\"src/mocks.ts\", {\n \"type\": \"base64\",\n \"body\": \"ZXhwb3J0IGludGVyZmFjZSBNb2NrUHJvamVjdCB7CiAgJGFwaU5hbWU6IHN0cmluZzsKICAkcHJpbWFyeUtleTogc3RyaW5nOwogIGlkOiBzdHJpbmc7CiAgbmFtZTogc3RyaW5nOwogIHRhc2tzOiBNb2NrVGFza1tdOwp9CgpleHBvcnQgaW50ZXJmYWNlIE1vY2tUYXNrIHsKICAkYXBpTmFtZTogc3RyaW5nOwogICRwcmltYXJ5S2V5OiBzdHJpbmc7CiAgaWQ6IHN0cmluZzsKICB0aXRsZTogc3RyaW5nOwp9Cgpjb25zdCBwcm9qZWN0czogTW9ja1Byb2plY3RbXSA9IFsKICB7CiAgICAkYXBpTmFtZTogIk1vY2tQcm9qZWN0IiwKICAgICRwcmltYXJ5S2V5OiAiMSIsCiAgICBpZDogIjEiLAogICAgbmFtZTogIk1vY2sgcHJvamVjdCIsCiAgICB0YXNrczogWwogICAgICB7CiAgICAgICAgJGFwaU5hbWU6ICJNb2NrVGFzayIsCiAgICAgICAgJHByaW1hcnlLZXk6ICIxIiwKICAgICAgICBpZDogIjEiLAogICAgICAgIHRpdGxlOiAiVHJ5IHRvIiwKICAgICAgfSwKICAgICAgewogICAgICAgICRhcGlOYW1lOiAiTW9ja1Rhc2siLAogICAgICAgICRwcmltYXJ5S2V5OiAiMiIsCiAgICAgICAgaWQ6ICIyIiwKICAgICAgICB0aXRsZTogIkltcGxlbWVudCB0aGlzIiwKICAgICAgfSwKICAgICAgewogICAgICAgICRhcGlOYW1lOiAiTW9ja1Rhc2siLAogICAgICAgICRwcmltYXJ5S2V5OiAiMyIsCiAgICAgICAgaWQ6ICIzIiwKICAgICAgICB0aXRsZTogIldpdGggdGhlIE9udG9sb2d5IFNESyEiLAogICAgICB9LAogICAgXSwKICB9LAogIHsKICAgICRhcGlOYW1lOiAiTW9ja1Byb2plY3QiLAogICAgJHByaW1hcnlLZXk6ICIyIiwKICAgIGlkOiAiMiIsCiAgICBuYW1lOiAiWWV0IGFub3RoZXIgbW9jayBwcm9qZWN0IiwKICAgIHRhc2tzOiBbCiAgICAgIHsKICAgICAgICAkYXBpTmFtZTogIk1vY2tUYXNrIiwKICAgICAgICAkcHJpbWFyeUtleTogIjQiLAogICAgICAgIGlkOiAiNCIsCiAgICAgICAgdGl0bGU6ICJNb3JlIHRhc2tzIGhlcmUiLAogICAgICB9LAogICAgXSwKICB9LApdOwoKYXN5bmMgZnVuY3Rpb24gZGVsYXkoKTogUHJvbWlzZTx2b2lkPiB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PgogICAgc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIDUwMCArIE1hdGgucmFuZG9tKCkgKiAxMDAwKQogICk7Cn0KCi8vIEdvb2QgZW5vdWdoIHJhbmRvbSBpZCBmb3IgbW9ja3MKZnVuY3Rpb24gcmFuZG9tSWQoKTogc3RyaW5nIHsKICByZXR1cm4gYCR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMiAqKiAzMSl9YDsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0UHJvamVjdHMoKTogUHJvbWlzZTxNb2NrUHJvamVjdFtdPiB7CiAgYXdhaXQgZGVsYXkoKTsKICBjb25zdCByZXN1bHQgPSBbLi4ucHJvamVjdHNdOwogIHJlc3VsdC5zb3J0KChwMSwgcDIpID0+IHAxLm5hbWUubG9jYWxlQ29tcGFyZShwMi5uYW1lKSk7CiAgcmV0dXJuIHJlc3VsdDsKfQoKYXN5bmMgZnVuY3Rpb24gY3JlYXRlUHJvamVjdCh7CiAgbmFtZSwKfTogewogIG5hbWU6IHN0cmluZzsKfSk6IFByb21pc2U8TW9ja1Byb2plY3RbIiRwcmltYXJ5S2V5Il0+IHsKICBhd2FpdCBkZWxheSgpOwogIGNvbnN0IGlkID0gcmFuZG9tSWQoKTsKICBwcm9qZWN0cy5wdXNoKHsKICAgICRhcGlOYW1lOiAiTW9ja1Byb2plY3QiLAogICAgJHByaW1hcnlLZXk6IGlkLAogICAgaWQsCiAgICBuYW1lLAogICAgdGFza3M6IFtdLAogIH0pOwogIHJldHVybiBpZDsKfQoKYXN5bmMgZnVuY3Rpb24gZGVsZXRlUHJvamVjdChpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7CiAgYXdhaXQgZGVsYXkoKTsKICBjb25zdCBpZHggPSBwcm9qZWN0cy5maW5kSW5kZXgoKHApID0+IHAuaWQgPT09IGlkKTsKICBpZiAoaWR4ICE9PSAtMSkgewogICAgcHJvamVjdHMuc3BsaWNlKGlkeCwgMSk7CiAgfQp9Cgphc3luYyBmdW5jdGlvbiBjcmVhdGVUYXNrKHsKICB0aXRsZSwKICBwcm9qZWN0SWQsCn06IHsKICB0aXRsZTogc3RyaW5nOwogIHByb2plY3RJZDogc3RyaW5nOwp9KTogUHJvbWlzZTxNb2NrVGFza1siJHByaW1hcnlLZXkiXT4gewogIGF3YWl0IGRlbGF5KCk7CiAgY29uc3QgcHJvamVjdCA9IHByb2plY3RzLmZpbmQoKHApID0+IHAuaWQgPT09IHByb2plY3RJZCk7CiAgaWYgKHByb2plY3QgPT0gbnVsbCkgewogICAgdGhyb3cgbmV3IEVycm9yKGBQcm9qZWN0ICR7cHJvamVjdElkfSBub3QgZm91bmQhYCk7CiAgfQogIGNvbnN0IGlkID0gcmFuZG9tSWQoKTsKICBwcm9qZWN0LnRhc2tzLnVuc2hpZnQoeyAkYXBpTmFtZTogIk1vY2tUYXNrIiwgJHByaW1hcnlLZXk6IGlkLCBpZCwgdGl0bGUgfSk7CiAgcmV0dXJuIGlkOwp9Cgphc3luYyBmdW5jdGlvbiBkZWxldGVUYXNrKGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHsKICBhd2FpdCBkZWxheSgpOwogIGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykgewogICAgY29uc3QgaWR4ID0gcHJvamVjdC50YXNrcy5maW5kSW5kZXgoKHQpID0+IHQuaWQgPT09IGlkKTsKICAgIGlmIChpZHggIT09IC0xKSB7CiAgICAgIHByb2plY3QudGFza3Muc3BsaWNlKGlkeCwgMSk7CiAgICB9CiAgfQp9Cgpjb25zdCBNb2NrcyA9IHsKICBnZXRQcm9qZWN0cywKICBjcmVhdGVQcm9qZWN0LAogIGRlbGV0ZVByb2plY3QsCiAgY3JlYXRlVGFzaywKICBkZWxldGVUYXNrLAp9OwoKZXhwb3J0IGRlZmF1bHQgTW9ja3M7Cg==\"\n}], [\"src/useProjectTasks.ts\", {\n \"type\": \"base64\",\n \"body\": \"aW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICJyZWFjdCI7CmltcG9ydCB1c2VTV1IgZnJvbSAic3dyIjsKaW1wb3J0IE1vY2tzLCB7IE1vY2tQcm9qZWN0LCBNb2NrVGFzayB9IGZyb20gIi4vbW9ja3MiOwoKZXhwb3J0IGZ1bmN0aW9uIHVzZVByb2plY3RUYXNrcyhwcm9qZWN0OiBNb2NrUHJvamVjdCB8IHVuZGVmaW5lZCkgewogIGNvbnN0IHsgZGF0YSwgaXNMb2FkaW5nLCBpc1ZhbGlkYXRpbmcsIGVycm9yLCBtdXRhdGUgfSA9IHVzZVNXUjxNb2NrVGFza1tdPigKICAgIHByb2plY3QgIT0gbnVsbCA\\u002FIGBwcm9qZWN0cy8ke3Byb2plY3QuaWR9L3Rhc2tzYCA6IG51bGwsCiAgICAvLyBUcnkgdG8gaW1wbGVtZW50IHRoaXMgd2l0aCB0aGUgT250b2xvZ3kgU0RLIQogICAgYXN5bmMgKCkgPT4gewogICAgICBpZiAocHJvamVjdCA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIFtdOwogICAgICB9CiAgICAgIHJldHVybiBwcm9qZWN0LnRhc2tzOwogICAgfSwKICApOwoKICBjb25zdCBjcmVhdGVUYXNrOiAoCiAgICB0aXRsZTogc3RyaW5nLAogICkgPT4gUHJvbWlzZTxNb2NrVGFza1siJHByaW1hcnlLZXkiXSB8IHVuZGVmaW5lZD4gPSB1c2VDYWxsYmFjaygKICAgIGFzeW5jICh0aXRsZSkgPT4gewogICAgICBpZiAocHJvamVjdCA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgfQogICAgICAvLyBUcnkgdG8gaW1wbGVtZW50IHRoaXMgd2l0aCB0aGUgT250b2xvZ3kgU0RLIQogICAgICBjb25zdCBpZCA9IGF3YWl0IE1vY2tzLmNyZWF0ZVRhc2soewogICAgICAgIHRpdGxlLAogICAgICAgIHByb2plY3RJZDogcHJvamVjdC4kcHJpbWFyeUtleSwKICAgICAgfSk7CiAgICAgIGF3YWl0IG11dGF0ZSgpOwogICAgICByZXR1cm4gaWQ7CiAgICB9LAogICAgW3Byb2plY3QsIG11dGF0ZV0sCiAgKTsKCiAgY29uc3QgZGVsZXRlVGFzazogKHRhc2s6IE1vY2tUYXNrKSA9PiBQcm9taXNlPHZvaWQ+ID0gdXNlQ2FsbGJhY2soCiAgICBhc3luYyAodGFzaykgPT4gewogICAgICBpZiAocHJvamVjdCA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGF3YWl0IHNsZWVwKDEwMDApOwogICAgICAvLyBUcnkgdG8gaW1wbGVtZW50IHRoaXMgd2l0aCB0aGUgT250b2xvZ3kgU0RLIQogICAgICBhd2FpdCBNb2Nrcy5kZWxldGVUYXNrKHRhc2suJHByaW1hcnlLZXkpOwogICAgICBhd2FpdCBtdXRhdGUoKTsKICAgIH0sCiAgICBbcHJvamVjdCwgbXV0YXRlXSwKICApOwoKICByZXR1cm4gewogICAgdGFza3M6IGRhdGEsCiAgICBpc0xvYWRpbmcsCiAgICBpc1ZhbGlkYXRpbmcsCiAgICBpc0Vycm9yOiBlcnJvciwKICAgIGNyZWF0ZVRhc2ssCiAgICBkZWxldGVUYXNrLAogIH07Cn0KCmZ1bmN0aW9uIHNsZWVwKG1zOiBudW1iZXIpIHsKICByZXR1cm4gbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7Cn0K\"\n}], [\"src/useProjects.ts\", {\n \"type\": \"base64\",\n \"body\": \"aW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICJyZWFjdCI7CmltcG9ydCB1c2VTV1IgZnJvbSAic3dyIjsKaW1wb3J0IE1vY2tzLCB7IE1vY2tQcm9qZWN0IH0gZnJvbSAiLi9tb2NrcyI7CgpmdW5jdGlvbiB1c2VQcm9qZWN0cygpIHsKICBjb25zdCB7IGRhdGEsIGlzTG9hZGluZywgaXNWYWxpZGF0aW5nLCBlcnJvciwgbXV0YXRlIH0gPSB1c2VTV1I8CiAgICBNb2NrUHJvamVjdFtdCiAgPigicHJvamVjdHMiLCBhc3luYyAoKSA9PiB7CiAgICAvLyBUcnkgdG8gaW1wbGVtZW50IHRoaXMgd2l0aCB0aGUgT250b2xvZ3kgU0RLIQogICAgcmV0dXJuIE1vY2tzLmdldFByb2plY3RzKCk7CiAgfSk7CgogIGNvbnN0IGNyZWF0ZVByb2plY3Q6IChuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8TW9ja1Byb2plY3RbIiRwcmltYXJ5S2V5Il0+ID0KICAgIHVzZUNhbGxiYWNrKAogICAgICBhc3luYyAobmFtZSkgPT4gewogICAgICAgIC8vIFRyeSB0byBpbXBsZW1lbnQgdGhpcyB3aXRoIHRoZSBPbnRvbG9neSBTREshCiAgICAgICAgY29uc3QgaWQgPSBhd2FpdCBNb2Nrcy5jcmVhdGVQcm9qZWN0KHsgbmFtZSB9KTsKICAgICAgICBhd2FpdCBtdXRhdGUoKTsKICAgICAgICByZXR1cm4gaWQ7CiAgICAgIH0sCiAgICAgIFttdXRhdGVdLAogICAgKTsKCiAgY29uc3QgZGVsZXRlUHJvamVjdDogKHByb2plY3Q6IE1vY2tQcm9qZWN0KSA9PiBQcm9taXNlPHZvaWQ+ID0gdXNlQ2FsbGJhY2soCiAgICBhc3luYyAocHJvamVjdCkgPT4gewogICAgICAvLyBUcnkgdG8gaW1wbGVtZW50IHRoaXMgd2l0aCB0aGUgT250b2xvZ3kgU0RLIQogICAgICBhd2FpdCBNb2Nrcy5kZWxldGVQcm9qZWN0KHByb2plY3QuJHByaW1hcnlLZXkpOwogICAgICBhd2FpdCBtdXRhdGUoKTsKICAgIH0sCiAgICBbbXV0YXRlXSwKICApOwoKICByZXR1cm4gewogICAgcHJvamVjdHM6IGRhdGEsCiAgICBpc0xvYWRpbmcsCiAgICBpc1ZhbGlkYXRpbmcsCiAgICBpc0Vycm9yOiBlcnJvciwKICAgIGNyZWF0ZVByb2plY3QsCiAgICBkZWxldGVQcm9qZWN0LAogIH07Cn0KCmV4cG9ydCBkZWZhdWx0IHVzZVByb2plY3RzOwo=\"\n}], [\"src/vite-env.d.ts\", {\n \"type\": \"base64\",\n \"body\": \"Ly8vIDxyZWZlcmVuY2UgdHlwZXM9InZpdGUvY2xpZW50IiAvPgo=\"\n}], [\"tsconfig.json\", {\n \"type\": \"base64\",\n \"body\": \"ewogICJjb21waWxlck9wdGlvbnMiOiB7CiAgICAidGFyZ2V0IjogIkVTMjAyMCIsCiAgICAidXNlRGVmaW5lRm9yQ2xhc3NGaWVsZHMiOiB0cnVlLAogICAgImxpYiI6IFsiRVMyMDIwIiwgIkRPTSIsICJET00uSXRlcmFibGUiXSwKICAgICJtb2R1bGUiOiAiRVNOZXh0IiwKICAgICJza2lwTGliQ2hlY2siOiB0cnVlLAoKICAgIC8qIEJ1bmRsZXIgbW9kZSAqLwogICAgIm1vZHVsZVJlc29sdXRpb24iOiAiYnVuZGxlciIsCiAgICAiYWxsb3dJbXBvcnRpbmdUc0V4dGVuc2lvbnMiOiB0cnVlLAogICAgInJlc29sdmVKc29uTW9kdWxlIjogdHJ1ZSwKICAgICJpc29sYXRlZE1vZHVsZXMiOiB0cnVlLAogICAgIm5vRW1pdCI6IHRydWUsCiAgICAianN4IjogInJlYWN0LWpzeCIsCgogICAgLyogTGludGluZyAqLwogICAgInN0cmljdCI6IHRydWUsCiAgICAibm9VbnVzZWRMb2NhbHMiOiB0cnVlLAogICAgIm5vVW51c2VkUGFyYW1ldGVycyI6IHRydWUsCiAgICAibm9GYWxsdGhyb3VnaENhc2VzSW5Td2l0Y2giOiB0cnVlCiAgfSwKICAiaW5jbHVkZSI6IFsic3JjIl0sCiAgInJlZmVyZW5jZXMiOiBbeyAicGF0aCI6ICIuL3RzY29uZmlnLm5vZGUuanNvbiIgfV0KfQo=\"\n}], [\"tsconfig.node.json\", {\n \"type\": \"base64\",\n \"body\": \"ewogICJjb21waWxlck9wdGlvbnMiOiB7CiAgICAiY29tcG9zaXRlIjogdHJ1ZSwKICAgICJza2lwTGliQ2hlY2siOiB0cnVlLAogICAgIm1vZHVsZSI6ICJFU05leHQiLAogICAgIm1vZHVsZVJlc29sdXRpb24iOiAiYnVuZGxlciIsCiAgICAiYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0cyI6IHRydWUKICB9LAogICJpbmNsdWRlIjogWyJ2aXRlLmNvbmZpZy50cyJdCn0K\"\n}], [\"vite.config.ts.hbs\", {\n type: \"raw\",\n body: `import react from \"@vitejs/plugin-react\";\nimport { defineConfig } from \"vite\";\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n plugins: [react()],\n server: {\n port: 8080,\n {{#if corsProxy}}\n proxy: {\n \"^(/multipass/api|/api)\": {\n target: \"{{foundryUrl}}\",\n changeOrigin: true,\n secure: true,\n },\n },\n {{/if}}\n },\n});\n`\n}]]);"]}
|
|
@@ -263,6 +263,13 @@ import { createPublicOauthClient } from "@osdk/oauth";
|
|
|
263
263
|
const url = import.meta.env.VITE_FOUNDRY_API_URL;
|
|
264
264
|
const clientId = import.meta.env.VITE_FOUNDRY_CLIENT_ID;
|
|
265
265
|
const redirectUrl = import.meta.env.VITE_FOUNDRY_REDIRECT_URL;
|
|
266
|
+
{{#if scopes}}
|
|
267
|
+
const scopes = [
|
|
268
|
+
{{#each scopes}}
|
|
269
|
+
"{{this}}",
|
|
270
|
+
{{/each}}
|
|
271
|
+
];
|
|
272
|
+
{{/if}}
|
|
266
273
|
|
|
267
274
|
checkEnv(url, "VITE_FOUNDRY_API_URL");
|
|
268
275
|
checkEnv(clientId, "VITE_FOUNDRY_CLIENT_ID");
|
|
@@ -281,7 +288,14 @@ export const auth = createPublicOauthClient(
|
|
|
281
288
|
clientId,
|
|
282
289
|
url,
|
|
283
290
|
redirectUrl,
|
|
284
|
-
|
|
291
|
+
{{#if scopes}}
|
|
292
|
+
true,
|
|
293
|
+
undefined,
|
|
294
|
+
window.location.toString(),
|
|
295
|
+
scopes,
|
|
296
|
+
{{/if}}
|
|
297
|
+
);
|
|
298
|
+
|
|
285
299
|
/**
|
|
286
300
|
* Initialize the client to interact with the Ontology SDK
|
|
287
301
|
*/
|
|
@@ -365,5 +379,5 @@ export default defineConfig(({ mode }) => {
|
|
|
365
379
|
}]]);
|
|
366
380
|
|
|
367
381
|
export { files };
|
|
368
|
-
//# sourceMappingURL=esm-
|
|
369
|
-
//# sourceMappingURL=esm-
|
|
382
|
+
//# sourceMappingURL=esm-S2OWTMMF.js.map
|
|
383
|
+
//# sourceMappingURL=esm-S2OWTMMF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../create-app.template.react.beta/build/esm/generatedNoCheck/index.js"],"names":[],"mappings":"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","file":"esm-S2OWTMMF.js","sourcesContent":["export const files = new Map([[\"README.md.hbs\", {\n type: \"raw\",\n body: `# {{project}}\n\nThis project was generated with [\\`@osdk/create-app\\`](https://www.npmjs.com/package/@osdk/create-app) and demonstrates using the Ontology SDK package \\`{{osdkPackage}}\\` with React on top of Vite. Check out the [Vite](https://vitejs.dev/guide/) docs for further configuration.\n\n## Developing\n\nRun the following command or equivalent with your preferred package manager to start a local development server on \\`http://localhost:8080\\`:\n\n\\`\\`\\`sh\nnpm run dev\n\\`\\`\\`\n\nDevelopment configuration is stored in \\`.env.development\\`.\n\n{{#if corsProxy}}\nIn order to make API requests to Foundry, a CORS proxy has been set up for local development which may be removed if the stack is configured to allow \\`http://localhost:8080\\` to load resources. The configured OAuth client must also allow \\`http://localhost:8080/auth/callback\\` as a redirect URL.\n{{else}}\nIn order to make API requests to Foundry, CORS must be configured for the stack to allow \\`http://localhost:8080\\` to load resources. If this has not been configured and you are unable to request this, you can alternatively generate your project again with \\`--corsProxy true\\` to use a proxy for API requests during local development. The configured OAuth client must also allow \\`http://localhost:8080/auth/callback\\` as a redirect URL.\n{{/if}}\n\n## Deploying\n\nRun the following command or equivalent with your preferred package manager to create a production build of your application:\n\n\\`\\`\\`sh\nnpm run build\n\\`\\`\\`\n\nProduction configuration is stored in \\`.env.production\\`.\n\nIf you did not fill in the URL your production application will be hosted on you will need to fill in the \\`VITE_FOUNDRY_REDIRECT_URL\\` in \\`.env.production\\`. A default test is included in \\`env.test.ts\\` to verify your production environment variables which you can enable by removing the skip condition or running tests with the environment variable set \\`VERIFY_ENV_PRODUCTION=true\\`.\n\nIn order to make API requests to Foundry, CORS must be configured for the stack to allow the production origin to load resources. This will be automatically done for you if you are using Foundry website hosting. The configured OAuth client must also allow the production origin auth callback as a redirect URL.\n\nA \\`foundry.config.json\\` file is included in the root of this project to make deploying to Foundry website hosting with [\\`@osdk/cli\\`](https://www.npmjs.com/package/@osdk/cli) easier. If you are not using Foundry website hosting for your application you may delete this file.\n`\n}], [\".gitignore\", {\n type: \"raw\",\n body: `# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n`\n}], [\"eslint.config.mjs\", {\n \"type\": \"base64\",\n \"body\": \"Ly8gQHRzLWNoZWNrCmltcG9ydCBlc2xpbnQgZnJvbSAiQGVzbGludC9qcyI7CmltcG9ydCB0c1BhcnNlciBmcm9tICJAdHlwZXNjcmlwdC1lc2xpbnQvcGFyc2VyIjsKaW1wb3J0ICogYXMgaW1wb3J0UGx1Z2luIGZyb20gImVzbGludC1wbHVnaW4taW1wb3J0IjsKaW1wb3J0IGpzeEExMXlQbHVnaW4gZnJvbSAiZXNsaW50LXBsdWdpbi1qc3gtYTExeSI7CmltcG9ydCByZWFjdFBsdWdpbiBmcm9tICJlc2xpbnQtcGx1Z2luLXJlYWN0IjsKaW1wb3J0IHJlYWN0SG9va3NQbHVnaW4gZnJvbSAiZXNsaW50LXBsdWdpbi1yZWFjdC1ob29rcyI7CmltcG9ydCByZWFjdFJlZnJlc2ggZnJvbSAiZXNsaW50LXBsdWdpbi1yZWFjdC1yZWZyZXNoIjsKaW1wb3J0IGdsb2JhbHMgZnJvbSAiZ2xvYmFscyI7CmltcG9ydCB0c2VzbGludCBmcm9tICJ0eXBlc2NyaXB0LWVzbGludCI7CgpleHBvcnQgZGVmYXVsdCB0c2VzbGludC5jb25maWcoewogIGZpbGVzOiBbImVzbGludC5jb25maWcubWpzIiwgInNyYy8qKi8qLntqcyxtanMsY2pzLHRzLGpzeCx0c3h9Il0sCiAgc2V0dGluZ3M6IHsKICAgIHJlYWN0OiB7CiAgICAgIHZlcnNpb246ICJkZXRlY3QiLAogICAgfSwKCiAgICAiaW1wb3J0L3Jlc29sdmVyIjogewogICAgICBub2RlOiB7CiAgICAgICAgZXh0ZW5zaW9uczogWyIuanMiLCAiLmpzeCIsICIudHMiLCAiLnRzeCJdLAogICAgICB9LAogICAgfSwKICB9LAogIGxhbmd1YWdlT3B0aW9uczogewogICAgZ2xvYmFsczogewogICAgICAuLi5nbG9iYWxzLmJyb3dzZXIsCiAgICB9LAoKICAgIHBhcnNlcjogdHNQYXJzZXIsCiAgfSwKICBleHRlbmRzOiBbCiAgICBlc2xpbnQuY29uZmlncy5yZWNvbW1lbmRlZCwKICAgIC4uLnRzZXNsaW50LmNvbmZpZ3MucmVjb21tZW5kZWQsCiAgXSwKICBwbHVnaW5zOiB7CiAgICAicmVhY3QiOiAvKiogQHR5cGUgaW1wb3J0KCJlc2xpbnQiKS5FU0xpbnQuUGx1Z2luICovIChyZWFjdFBsdWdpbiksCiAgICAicmVhY3QtcmVmcmVzaCI6IHJlYWN0UmVmcmVzaCwKICAgICJyZWFjdC1ob29rcyI6CiAgICAgIC8qKiBAdHlwZSBpbXBvcnQoImVzbGludCIpLkVTTGludC5QbHVnaW4gKi8gKHJlYWN0SG9va3NQbHVnaW4pLAogICAgImpzeC1hMTF5IjoganN4QTExeVBsdWdpbiwKICAgICJpbXBvcnQiOiBpbXBvcnRQbHVnaW4sCiAgfSwKICBydWxlczogewogICAgLi4uKAogICAgICAvKiogQHR5cGUgaW1wb3J0KCJlc2xpbnQiKS5MaW50ZXIuUnVsZXNSZWNvcmQgKi8KICAgICAgKHJlYWN0UGx1Z2luLmNvbmZpZ3MuZmxhdD8ucmVjb21tZW5kZWQucnVsZXMpCiAgICApLAogICAgInJlYWN0LWhvb2tzL3J1bGVzLW9mLWhvb2tzIjogImVycm9yIiwKICAgICJyZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHMiOiAid2FybiIsCiAgICAuLi5qc3hBMTF5UGx1Z2luLmNvbmZpZ3MucmVjb21tZW5kZWQucnVsZXMsCiAgICAicmVhY3QtcmVmcmVzaC9vbmx5LWV4cG9ydC1jb21wb25lbnRzIjogWyJ3YXJuIiwgewogICAgICBhbGxvd0NvbnN0YW50RXhwb3J0OiB0cnVlLAogICAgfV0sCgogICAgImltcG9ydC9uYW1lZCI6ICJlcnJvciIsCiAgICAiaW1wb3J0L2RlZmF1bHQiOiAiZXJyb3IiLAogICAgImltcG9ydC9uYW1lc3BhY2UiOiAiZXJyb3IiLAogICAgImltcG9ydC9uby1kdXBsaWNhdGVzIjogImVycm9yIiwKICAgICJpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMiOiAiZXJyb3IiLAogICAgInJlYWN0L3JlYWN0LWluLWpzeC1zY29wZSI6ICJvZmYiLAogIH0sCn0pOwo=\"\n}], [\"index.html\", {\n type: \"raw\",\n body: `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <link rel=\"icon\" type=\"image/svg+xml\" href=\"/react.svg\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>Ontology SDK + React</title>\n </head>\n <body>\n <div id=\"root-container\">\n <div id=\"root\"></div>\n </div>\n <script type=\"module\" src=\"/src/main.tsx\"></script>\n </body>\n</html>\n`\n}], [\"package.json.hbs\", {\n type: \"raw\",\n body: `{\n \"name\": \"{{project}}\",\n \"private\": true,\n \"version\": \"0.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"vite\",\n \"build\": \"tsc && vite build\",\n \"lint\": \"eslint . --report-unused-disable-directives --max-warnings 0\",\n \"lint:fix\": \"eslint --report-unused-disable-directives --max-warnings 0 --fix\",\n \"test\": \"vitest run\",\n \"preview\": \"vite preview\"\n },\n \"dependencies\": {\n \"{{osdkPackage}}\": \"latest\",\n \"@osdk/client\": \"{{clientVersion}}\",\n \"@osdk/oauth\": \"^1.0.0\",\n \"react\": \"^18\",\n \"react-dom\": \"^18\",\n \"react-router-dom\": \"^6.23.1\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^22.7.4\",\n \"@eslint/compat\": \"^1.2.1\",\n \"@eslint/js\": \"^9.13.0\",\n \"@types/eslint-plugin-jsx-a11y\": \"^6.9.0\",\n \"@types/react\": \"^18\",\n \"@types/react-dom\": \"^18\",\n \"@typescript-eslint/eslint-plugin\": \"^8.11.0\",\n \"@typescript-eslint/parser\": \"^8.11.0\",\n \"@vitejs/plugin-react\": \"^4.2.0\",\n \"eslint\": \"^9.13.0\",\n \"eslint-plugin-import\": \"^2.31.0\",\n \"eslint-plugin-jsx-a11y\": \"^6.10.1\",\n \"eslint-plugin-prettier\": \"^5.2.1\",\n \"eslint-plugin-react\": \"^7.37.2\",\n \"eslint-plugin-react-hooks\": \"^5.0.0\",\n \"eslint-plugin-react-refresh\": \"^0.4.14\",\n \"globals\": \"^15.11.0\",\n \"typescript\": \"~5.5.4\",\n \"typescript-eslint\": \"^8.11.0\",\n \"vite\": \"^5.4.8\",\n \"vitest\": \"^2.1.2\"\n }\n}`\n}], [\"public/palantir.svg\", {\n \"type\": \"base64\",\n \"body\": \"PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik00LjEwNzY4IDYuMDY0MDFDNC4xMDc2OCA4LjM3NzEgNS45NjcwMiAxMC4yNTI2IDguMjYwNTkgMTAuMjUyNkMxMC41NTQzIDEwLjI1MjYgMTIuNDEzOCA4LjM3NzEgMTIuNDEzOCA2LjA2NDAxQzEyLjQxMzggMy43NTA4IDEwLjU1NDMgMS44NzU1MyA4LjI2MDU5IDEuODc1NTNDNS45NjcwMiAxLjg3NTUzIDQuMTA3NjggMy43NTA4IDQuMTA3NjggNi4wNjQwMVpNOC4yNjA5MyAxMy45MjNMMTMuNjI5OSAxMS41ODQ4TDE0LjUyMTcgMTMuMzA5MUw4LjI2MDkzIDE2TDIgMTMuMzA5MUwyLjg5MjAxIDExLjU4NDhMOC4yNjA5MyAxMy45MjNaTTguMjYxMDEgMEM0Ljk0MzY3IDAgMi4yNTQ0MiAyLjcxMjI4IDIuMjU0NDIgNi4wNTgwM0MyLjI1NDQyIDkuNDAzNzggNC45NDM2NyAxMi4xMTU5IDguMjYxMDEgMTIuMTE1OUMxMS41NzgyIDEyLjExNTkgMTQuMjY3NiA5LjQwMzc4IDE0LjI2NzYgNi4wNTgwM0MxNC4yNjc2IDIuNzEyMjggMTEuNTc4MiAwIDguMjYxMDEgMFoiIGZpbGw9IiMxMTE0MTgiLz4KPC9zdmc+Cg==\"\n}], [\"public/react.svg\", {\n \"type\": \"base64\",\n \"body\": \"PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiBhcmlhLWhpZGRlbj0idHJ1ZSIgcm9sZT0iaW1nIiBjbGFzcz0iaWNvbmlmeSBpY29uaWZ5LS1sb2dvcyIgd2lkdGg9IjM1LjkzIiBoZWlnaHQ9IjMyIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWlkWU1pZCBtZWV0IiB2aWV3Qm94PSIwIDAgMjU2IDIyOCI+PHBhdGggZmlsbD0iIzAwRDhGRiIgZD0iTTIxMC40ODMgNzMuODI0YTE3MS40OSAxNzEuNDkgMCAwIDAtOC4yNC0yLjU5N2MuNDY1LTEuOS44OTMtMy43NzcgMS4yNzMtNS42MjFjNi4yMzgtMzAuMjgxIDIuMTYtNTQuNjc2LTExLjc2OS02Mi43MDhjLTEzLjM1NS03LjctMzUuMTk2LjMyOS01Ny4yNTQgMTkuNTI2YTE3MS4yMyAxNzEuMjMgMCAwIDAtNi4zNzUgNS44NDhhMTU1Ljg2NiAxNTUuODY2IDAgMCAwLTQuMjQxLTMuOTE3QzEwMC43NTkgMy44MjkgNzcuNTg3LTQuODIyIDYzLjY3MyAzLjIzM0M1MC4zMyAxMC45NTcgNDYuMzc5IDMzLjg5IDUxLjk5NSA2Mi41ODhhMTcwLjk3NCAxNzAuOTc0IDAgMCAwIDEuODkyIDguNDhjLTMuMjguOTMyLTYuNDQ1IDEuOTI0LTkuNDc0IDIuOThDMTcuMzA5IDgzLjQ5OCAwIDk4LjMwNyAwIDExMy42NjhjMCAxNS44NjUgMTguNTgyIDMxLjc3OCA0Ni44MTIgNDEuNDI3YTE0NS41MiAxNDUuNTIgMCAwIDAgNi45MjEgMi4xNjVhMTY3LjQ2NyAxNjcuNDY3IDAgMCAwLTIuMDEgOS4xMzhjLTUuMzU0IDI4LjItMS4xNzMgNTAuNTkxIDEyLjEzNCA1OC4yNjZjMTMuNzQ0IDcuOTI2IDM2LjgxMi0uMjIgNTkuMjczLTE5Ljg1NWExNDUuNTY3IDE0NS41NjcgMCAwIDAgNS4zNDItNC45MjNhMTY4LjA2NCAxNjguMDY0IDAgMCAwIDYuOTIgNi4zMTRjMjEuNzU4IDE4LjcyMiA0My4yNDYgMjYuMjgyIDU2LjU0IDE4LjU4NmMxMy43MzEtNy45NDkgMTguMTk0LTMyLjAwMyAxMi40LTYxLjI2OGExNDUuMDE2IDE0NS4wMTYgMCAwIDAtMS41MzUtNi44NDJjMS42Mi0uNDggMy4yMS0uOTc0IDQuNzYtMS40ODhjMjkuMzQ4LTkuNzIzIDQ4LjQ0My0yNS40NDMgNDguNDQzLTQxLjUyYzAtMTUuNDE3LTE3Ljg2OC0zMC4zMjYtNDUuNTE3LTM5Ljg0NFptLTYuMzY1IDcwLjk4NGMtMS40LjQ2My0yLjgzNi45MS00LjMgMS4zNDVjLTMuMjQtMTAuMjU3LTcuNjEyLTIxLjE2My0xMi45NjMtMzIuNDMyYzUuMTA2LTExIDkuMzEtMjEuNzY3IDEyLjQ1OS0zMS45NTdjMi42MTkuNzU4IDUuMTYgMS41NTcgNy42MSAyLjRjMjMuNjkgOC4xNTYgMzguMTQgMjAuMjEzIDM4LjE0IDI5LjUwNGMwIDkuODk2LTE1LjYwNiAyMi43NDMtNDAuOTQ2IDMxLjE0Wm0tMTAuNTE0IDIwLjgzNGMyLjU2MiAxMi45NCAyLjkyNyAyNC42NCAxLjIzIDMzLjc4N2MtMS41MjQgOC4yMTktNC41OSAxMy42OTgtOC4zODIgMTUuODkzYy04LjA2NyA0LjY3LTI1LjMyLTEuNC00My45MjctMTcuNDEyYTE1Ni43MjYgMTU2LjcyNiAwIDAgMS02LjQzNy01Ljg3YzcuMjE0LTcuODg5IDE0LjQyMy0xNy4wNiAyMS40NTktMjcuMjQ2YzEyLjM3Ni0xLjA5OCAyNC4wNjgtMi44OTQgMzQuNjcxLTUuMzQ1YTEzNC4xNyAxMzQuMTcgMCAwIDEgMS4zODYgNi4xOTNaTTg3LjI3NiAyMTQuNTE1Yy03Ljg4MiAyLjc4My0xNC4xNiAyLjg2My0xNy45NTUuNjc1Yy04LjA3NS00LjY1Ny0xMS40MzItMjIuNjM2LTYuODUzLTQ2Ljc1MmExNTYuOTIzIDE1Ni45MjMgMCAwIDEgMS44NjktOC40OTljMTAuNDg2IDIuMzIgMjIuMDkzIDMuOTg4IDM0LjQ5OCA0Ljk5NGM3LjA4NCA5Ljk2NyAxNC41MDEgMTkuMTI4IDIxLjk3NiAyNy4xNWExMzQuNjY4IDEzNC42NjggMCAwIDEtNC44NzcgNC40OTJjLTkuOTMzIDguNjgyLTE5Ljg4NiAxNC44NDItMjguNjU4IDE3Ljk0Wk01MC4zNSAxNDQuNzQ3Yy0xMi40ODMtNC4yNjctMjIuNzkyLTkuODEyLTI5Ljg1OC0xNS44NjNjLTYuMzUtNS40MzctOS41NTUtMTAuODM2LTkuNTU1LTE1LjIxNmMwLTkuMzIyIDEzLjg5Ny0yMS4yMTIgMzcuMDc2LTI5LjI5M2MyLjgxMy0uOTggNS43NTctMS45MDUgOC44MTItMi43NzNjMy4yMDQgMTAuNDIgNy40MDYgMjEuMzE1IDEyLjQ3NyAzMi4zMzJjLTUuMTM3IDExLjE4LTkuMzk5IDIyLjI0OS0xMi42MzQgMzIuNzkyYTEzNC43MTggMTM0LjcxOCAwIDAgMS02LjMxOC0xLjk3OVptMTIuMzc4LTg0LjI2Yy00LjgxMS0yNC41ODctMS42MTYtNDMuMTM0IDYuNDI1LTQ3Ljc4OWM4LjU2NC00Ljk1OCAyNy41MDIgMi4xMTEgNDcuNDYzIDE5LjgzNWExNDQuMzE4IDE0NC4zMTggMCAwIDEgMy44NDEgMy41NDVjLTcuNDM4IDcuOTg3LTE0Ljc4NyAxNy4wOC0yMS44MDggMjYuOTg4Yy0xMi4wNCAxLjExNi0yMy41NjUgMi45MDgtMzQuMTYxIDUuMzA5YTE2MC4zNDIgMTYwLjM0MiAwIDAgMS0xLjc2LTcuODg3Wm0xMTAuNDI3IDI3LjI2OGEzNDcuOCAzNDcuOCAwIDAgMC03Ljc4NS0xMi44MDNjOC4xNjggMS4wMzMgMTUuOTk0IDIuNDA0IDIzLjM0MyA0LjA4Yy0yLjIwNiA3LjA3Mi00Ljk1NiAxNC40NjUtOC4xOTMgMjIuMDQ1YTM4MS4xNTEgMzgxLjE1MSAwIDAgMC03LjM2NS0xMy4zMjJabS00NS4wMzItNDMuODYxYzUuMDQ0IDUuNDY1IDEwLjA5NiAxMS41NjYgMTUuMDY1IDE4LjE4NmEzMjIuMDQgMzIyLjA0IDAgMCAwLTMwLjI1Ny0uMDA2YzQuOTc0LTYuNTU5IDEwLjA2OS0xMi42NTIgMTUuMTkyLTE4LjE4Wk04Mi44MDIgODcuODNhMzIzLjE2NyAzMjMuMTY3IDAgMCAwLTcuMjI3IDEzLjIzOGMtMy4xODQtNy41NTMtNS45MDktMTQuOTgtOC4xMzQtMjIuMTUyYzcuMzA0LTEuNjM0IDE1LjA5My0yLjk3IDIzLjIwOS0zLjk4NGEzMjEuNTI0IDMyMS41MjQgMCAwIDAtNy44NDggMTIuODk3Wm04LjA4MSA2NS4zNTJjLTguMzg1LS45MzYtMTYuMjkxLTIuMjAzLTIzLjU5My0zLjc5M2MyLjI2LTcuMyA1LjA0NS0xNC44ODUgOC4yOTgtMjIuNmEzMjEuMTg3IDMyMS4xODcgMCAwIDAgNy4yNTcgMTMuMjQ2YzIuNTk0IDQuNDggNS4yOCA4Ljg2OCA4LjAzOCAxMy4xNDdabTM3LjU0MiAzMS4wM2MtNS4xODQtNS41OTItMTAuMzU0LTExLjc3OS0xNS40MDMtMTguNDMzYzQuOTAyLjE5MiA5Ljg5OS4yOSAxNC45NzguMjljNS4yMTggMCAxMC4zNzYtLjExNyAxNS40NTMtLjM0M2MtNC45ODUgNi43NzQtMTAuMDE4IDEyLjk3LTE1LjAyOCAxOC40ODZabTUyLjE5OC01Ny44MTdjMy40MjIgNy44IDYuMzA2IDE1LjM0NSA4LjU5NiAyMi41MmMtNy40MjIgMS42OTQtMTUuNDM2IDMuMDU4LTIzLjg4IDQuMDcxYTM4Mi40MTcgMzgyLjQxNyAwIDAgMCA3Ljg1OS0xMy4wMjZhMzQ3LjQwMyAzNDcuNDAzIDAgMCAwIDcuNDI1LTEzLjU2NVptLTE2Ljg5OCA4LjEwMWEzNTguNTU3IDM1OC41NTcgMCAwIDEtMTIuMjgxIDE5LjgxNWEzMjkuNCAzMjkuNCAwIDAgMS0yMy40NDQuODIzYy03Ljk2NyAwLTE1LjcxNi0uMjQ4LTIzLjE3OC0uNzMyYTMxMC4yMDIgMzEwLjIwMiAwIDAgMS0xMi41MTMtMTkuODQ2aC4wMDFhMzA3LjQxIDMwNy40MSAwIDAgMS0xMC45MjMtMjAuNjI3YTMxMC4yNzggMzEwLjI3OCAwIDAgMSAxMC44OS0yMC42MzdsLS4wMDEuMDAxYTMwNy4zMTggMzA3LjMxOCAwIDAgMSAxMi40MTMtMTkuNzYxYzcuNjEzLS41NzYgMTUuNDItLjg3NiAyMy4zMS0uODc2SDEyOGM3LjkyNiAwIDE1Ljc0My4zMDMgMjMuMzU0Ljg4M2EzMjkuMzU3IDMyOS4zNTcgMCAwIDEgMTIuMzM1IDE5LjY5NWEzNTguNDg5IDM1OC40ODkgMCAwIDEgMTEuMDM2IDIwLjU0YTMyOS40NzIgMzI5LjQ3MiAwIDAgMS0xMSAyMC43MjJabTIyLjU2LTEyMi4xMjRjOC41NzIgNC45NDQgMTEuOTA2IDI0Ljg4MSA2LjUyIDUxLjAyNmMtLjM0NCAxLjY2OC0uNzMgMy4zNjctMS4xNSA1LjA5Yy0xMC42MjItMi40NTItMjIuMTU1LTQuMjc1LTM0LjIzLTUuNDA4Yy03LjAzNC0xMC4wMTctMTQuMzIzLTE5LjEyNC0yMS42NC0yNy4wMDhhMTYwLjc4OSAxNjAuNzg5IDAgMCAxIDUuODg4LTUuNGMxOC45LTE2LjQ0NyAzNi41NjQtMjIuOTQxIDQ0LjYxMi0xOC4zWk0xMjggOTAuODA4YzEyLjYyNSAwIDIyLjg2IDEwLjIzNSAyMi44NiAyMi44NnMtMTAuMjM1IDIyLjg2LTIyLjg2IDIyLjg2cy0yMi44Ni0xMC4yMzUtMjIuODYtMjIuODZzMTAuMjM1LTIyLjg2IDIyLjg2LTIyLjg2WiI+PC9wYXRoPjwvc3ZnPg==\"\n}], [\"src/AuthCallback.tsx\", {\n type: \"raw\",\n body: `import { useEffect, useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport { auth } from \"./client\";\n\n/**\n * Component to render at \\`/auth/callback\\`\n * This calls signIn() again to save the token, and then navigates the user back to the home page.\n */\nfunction AuthCallback() {\n const [error, setError] = useState<string | undefined>(undefined);\n const navigate = useNavigate();\n\n // This effect conflicts with React 18 strict mode in development\n // https://react.dev/learn/synchronizing-with-effects#how-to-handle-the-effect-firing-twice-in-development\n useEffect(() => {\n auth\n .signIn()\n .then(() => navigate(\"/\", { replace: true }))\n .catch((e: unknown) => setError((e as Error).message ?? e));\n }, [navigate]);\n return <div>{error != null ? error : \"Authenticating…\"}</div>;\n}\n\nexport default AuthCallback;\n`\n}], [\"src/Home.module.css\", {\n \"type\": \"base64\",\n \"body\": \"Lm1ldGhvZHMgewogIHBhZGRpbmc6IDJlbTsKICBnYXA6IDJlbTsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgZmxleC13cmFwOiB3cmFwOwp9Cg==\"\n}], [\"src/Home.tsx.hbs\", {\n type: \"raw\",\n body: `import { \\$Objects, \\$Actions, \\$Queries } from \"{{osdkPackage}}\";\nimport css from \"./Home.module.css\";\nimport Layout from \"./Layout\";\n\nfunction Home() {\n const objectApiNames = Object.keys(\\$Objects);\n const actionApiNames = Object.keys(\\$Actions);\n const queryApiNames = Object.keys(\\$Queries);\n return (\n <Layout>\n <h1>{{osdkPackage}}</h1>\n <p>\n Welcome to your Ontology SDK! Try using any of the following methods\n now.\n </p>\n <div className={css.methods}>\n <div>\n <h2>Objects ({objectApiNames.length})</h2>\n {objectApiNames.map((objectApiName) => (\n <pre key={objectApiName}>\n \\$Objects.{objectApiName}\n </pre>\n ))}\n </div>\n <div>\n <h2>Actions ({actionApiNames.length})</h2>\n {actionApiNames.map((actionApiName) => (\n <pre key={actionApiName}>\n \\$Actions.{actionApiName}\n </pre>\n ))}\n </div>\n <div>\n <h2>Queries ({queryApiNames.length})</h2>\n {queryApiNames.map((queryApiName) => (\n <pre key={queryApiName}>\n \\$Queries.{queryApiName}\n </pre>\n ))}\n </div>\n </div>\n </Layout>\n );\n}\n\nexport default Home;\n`\n}], [\"src/Layout.module.css\", {\n \"type\": \"base64\",\n \"body\": \"LmxvZ28gewogIGhlaWdodDogNmVtOwogIHBhZGRpbmc6IDEuNWVtOwogIHdpbGwtY2hhbmdlOiBmaWx0ZXI7CiAgdHJhbnNpdGlvbjogZmlsdGVyIDMwMG1zOwp9CgoubG9nbzpob3ZlciB7CiAgZmlsdGVyOiBkcm9wLXNoYWRvdygwIDAgMmVtICM2NDZjZmZhYSk7Cn0K\"\n}], [\"src/Layout.tsx\", {\n type: \"raw\",\n body: `import palantirLogo from \"/palantir.svg\";\nimport reactLogo from \"/react.svg\";\nimport React from \"react\";\nimport css from \"./Layout.module.css\";\n\ninterface LayoutProps {\n children?: React.ReactNode;\n}\n\nfunction Layout({ children }: LayoutProps) {\n return (\n <>\n <div>\n <a\n href=\"https://www.palantir.com/docs/foundry/ontology-sdk/overview/\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n >\n <img src={palantirLogo} className={css.logo} alt=\"Palantir logo\" />\n </a>\n <a href=\"https://react.dev\" target=\"_blank\" rel=\"noopener noreferrer\">\n <img src={reactLogo} className={css.logo} alt=\"React logo\" />\n </a>\n </div>\n {children}\n </>\n );\n}\n\nexport default Layout;\n`\n}], [\"src/client.ts.hbs\", {\n type: \"raw\",\n body: `import type { Client } from \"@osdk/client\";\nimport { createClient } from \"@osdk/client\";\nimport { \\$ontologyRid } from \"{{osdkPackage}}\";\nimport { createPublicOauthClient } from \"@osdk/oauth\";\n\nconst url = import.meta.env.VITE_FOUNDRY_API_URL;\nconst clientId = import.meta.env.VITE_FOUNDRY_CLIENT_ID;\nconst redirectUrl = import.meta.env.VITE_FOUNDRY_REDIRECT_URL;\n{{#if scopes}}\nconst scopes = [\n {{#each scopes}}\n \"{{this}}\",\n {{/each}}\n];\n{{/if}}\n\ncheckEnv(url, \"VITE_FOUNDRY_API_URL\");\ncheckEnv(clientId, \"VITE_FOUNDRY_CLIENT_ID\");\ncheckEnv(redirectUrl, \"VITE_FOUNDRY_REDIRECT_URL\");\n\nfunction checkEnv(\n value: string | undefined,\n name: string,\n): asserts value is string {\n if (value == null) {\n throw new Error(\\`Missing environment variable: \\${name}\\`);\n }\n}\n\nexport const auth = createPublicOauthClient(\n clientId,\n url,\n redirectUrl,\n {{#if scopes}}\n true,\n undefined,\n window.location.toString(),\n scopes,\n {{/if}}\n);\n\n/**\n * Initialize the client to interact with the Ontology SDK\n */\nconst client: Client = createClient(\n url,\n \\$ontologyRid,\n auth,\n);\n\nexport default client;\n`\n}], [\"src/env.test.ts\", {\n \"type\": \"base64\",\n \"body\": \"aW1wb3J0IHsgbG9hZEVudiB9IGZyb20gInZpdGUiOwppbXBvcnQgeyBleHBlY3QsIHRlc3QgfSBmcm9tICJ2aXRlc3QiOwoKY29uc3QgRU5WX1ZBUlMgPSBbCiAgIlZJVEVfRk9VTkRSWV9BUElfVVJMIiwKICAiVklURV9GT1VORFJZX0NMSUVOVF9JRCIsCiAgIlZJVEVfRk9VTkRSWV9SRURJUkVDVF9VUkwiLApdOwoKZm9yIChjb25zdCBlbnZWYXIgb2YgRU5WX1ZBUlMpIHsKICB0ZXN0LnNraXBJZihwcm9jZXNzLmVudi5WRVJJRllfRU5WX1BST0RVQ1RJT04gIT09ICJ0cnVlIikoCiAgICBgcHJvZHVjdGlvbiBlbnYgc2hvdWxkIGNvbnRhaW4gJHtlbnZWYXJ9YCwKICAgICgpID0+IHsKICAgICAgY29uc3QgZW52ID0gbG9hZEVudigicHJvZHVjdGlvbiIsIHByb2Nlc3MuY3dkKCkpOwogICAgICBleHBlY3QoZW52W2VudlZhcl0sIGAke2VudlZhcn0gc2hvdWxkIGJlIGRlZmluZWRgKS50b0JlRGVmaW5lZCgpOwogICAgICBleHBlY3QoCiAgICAgICAgZW52W2VudlZhcl0sCiAgICAgICAgYCR7ZW52VmFyfSBzaG91bGQgbm90IGNvbnRhaW4gcGxhY2Vob2xkZXIgdmFsdWVgLAogICAgICApLm5vdC50b01hdGNoKC88Lio+Lyk7CiAgICB9LAogICk7Cn0K\"\n}], [\"src/index.css\", {\n \"type\": \"base64\",\n \"body\": \"OnJvb3QgewogIGZvbnQtZmFtaWx5OiBJbnRlciwgc3lzdGVtLXVpLCBBdmVuaXIsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CiAgbGluZS1oZWlnaHQ6IDEuNTsKICBmb250LXdlaWdodDogNDAwOwoKICBjb2xvci1zY2hlbWU6IGxpZ2h0IGRhcms7CiAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC44Nyk7CiAgYmFja2dyb3VuZC1jb2xvcjogIzI0MjQyNDsKCiAgZm9udC1zeW50aGVzaXM6IG5vbmU7CiAgdGV4dC1yZW5kZXJpbmc6IG9wdGltaXplTGVnaWJpbGl0eTsKICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlOwp9Cgojcm9vdC1jb250YWluZXIgewogIGRpc3BsYXk6IGZsZXg7CiAgZmxleDogMTsKICBhbGlnbi1pdGVtczogY2VudGVyOwp9Cgojcm9vdCB7CiAgbWF4LXdpZHRoOiAxMjgwcHg7CiAgbWFyZ2luOiAwIGF1dG87CiAgcGFkZGluZzogMnJlbTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KCmEgewogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgY29sb3I6ICM2NDZjZmY7CiAgdGV4dC1kZWNvcmF0aW9uOiBpbmhlcml0Owp9CmE6aG92ZXIgewogIGNvbG9yOiAjNTM1YmYyOwp9Cgpib2R5IHsKICBtYXJnaW46IDA7CiAgZGlzcGxheTogZmxleDsKICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogIG1pbi13aWR0aDogMzIwcHg7CiAgbWluLWhlaWdodDogMTAwdmg7Cn0KCmgxIHsKICBmb250LXNpemU6IDMuMmVtOwogIGxpbmUtaGVpZ2h0OiAxLjE7Cn0KCmJ1dHRvbiB7CiAgYm9yZGVyLXJhZGl1czogOHB4OwogIGJvcmRlcjogMXB4IHNvbGlkIHRyYW5zcGFyZW50OwogIHBhZGRpbmc6IDAuNmVtIDEuMmVtOwogIGZvbnQtc2l6ZTogMWVtOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgYmFja2dyb3VuZC1jb2xvcjogIzFhMWExYTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgdHJhbnNpdGlvbjogYm9yZGVyLWNvbG9yIDAuMjVzOwp9CmJ1dHRvbjpob3ZlciB7CiAgYm9yZGVyLWNvbG9yOiAjNjQ2Y2ZmOwp9CmJ1dHRvbjpmb2N1cywKYnV0dG9uOmZvY3VzLXZpc2libGUgewogIG91dGxpbmU6IDRweCBhdXRvIC13ZWJraXQtZm9jdXMtcmluZy1jb2xvcjsKfQoKQG1lZGlhIChwcmVmZXJzLWNvbG9yLXNjaGVtZTogbGlnaHQpIHsKICA6cm9vdCB7CiAgICBjb2xvcjogIzIxMzU0NzsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmZmZmY7CiAgfQogIGE6aG92ZXIgewogICAgY29sb3I6ICM3NDdiZmY7CiAgfQogIGJ1dHRvbiB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjlmOWY5OwogIH0KfQo=\"\n}], [\"src/main.tsx\", {\n type: \"raw\",\n body: `import ReactDOM from \"react-dom/client\";\nimport { createBrowserRouter, RouterProvider } from \"react-router-dom\";\nimport AuthCallback from \"./AuthCallback\";\nimport Home from \"./Home\";\nimport \"./index.css\";\n\nconst router = createBrowserRouter(\n [\n {\n path: \"/\",\n element: <Home />,\n },\n {\n // This is the route defined in your application's redirect URL\n path: \"/auth/callback\",\n element: <AuthCallback />,\n },\n ],\n { basename: import.meta.env.BASE_URL },\n);\n\nReactDOM.createRoot(document.getElementById(\"root\")!).render(\n <RouterProvider router={router} />,\n);\n`\n}], [\"src/vite-env.d.ts\", {\n \"type\": \"base64\",\n \"body\": \"Ly8vIDxyZWZlcmVuY2UgdHlwZXM9InZpdGUvY2xpZW50IiAvPgo=\"\n}], [\"tsconfig.json\", {\n \"type\": \"base64\",\n \"body\": \"ewogICJjb21waWxlck9wdGlvbnMiOiB7CiAgICAidGFyZ2V0IjogIkVTMjAyMCIsCiAgICAidXNlRGVmaW5lRm9yQ2xhc3NGaWVsZHMiOiB0cnVlLAogICAgImxpYiI6IFsiRVMyMDIwIiwgIkRPTSIsICJET00uSXRlcmFibGUiXSwKICAgICJtb2R1bGUiOiAiRVNOZXh0IiwKICAgICJza2lwTGliQ2hlY2siOiB0cnVlLAoKICAgIC8qIEJ1bmRsZXIgbW9kZSAqLwogICAgIm1vZHVsZVJlc29sdXRpb24iOiAiYnVuZGxlciIsCiAgICAiYWxsb3dJbXBvcnRpbmdUc0V4dGVuc2lvbnMiOiB0cnVlLAogICAgInJlc29sdmVKc29uTW9kdWxlIjogdHJ1ZSwKICAgICJpc29sYXRlZE1vZHVsZXMiOiB0cnVlLAogICAgIm5vRW1pdCI6IHRydWUsCiAgICAianN4IjogInJlYWN0LWpzeCIsCgogICAgLyogTGludGluZyAqLwogICAgInN0cmljdCI6IHRydWUsCiAgICAibm9VbnVzZWRMb2NhbHMiOiB0cnVlLAogICAgIm5vVW51c2VkUGFyYW1ldGVycyI6IHRydWUsCiAgICAibm9GYWxsdGhyb3VnaENhc2VzSW5Td2l0Y2giOiB0cnVlCiAgfSwKICAiaW5jbHVkZSI6IFsic3JjIl0sCiAgInJlZmVyZW5jZXMiOiBbeyAicGF0aCI6ICIuL3RzY29uZmlnLm5vZGUuanNvbiIgfV0KfQo=\"\n}], [\"tsconfig.node.json\", {\n \"type\": \"base64\",\n \"body\": \"ewogICJjb21waWxlck9wdGlvbnMiOiB7CiAgICAiY29tcG9zaXRlIjogdHJ1ZSwKICAgICJza2lwTGliQ2hlY2siOiB0cnVlLAogICAgIm1vZHVsZSI6ICJFU05leHQiLAogICAgIm1vZHVsZVJlc29sdXRpb24iOiAiYnVuZGxlciIsCiAgICAiYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0cyI6IHRydWUKICB9LAogICJpbmNsdWRlIjogWyJ2aXRlLmNvbmZpZy50cyJdCn0K\"\n}], [\"vite.config.ts.hbs\", {\n type: \"raw\",\n body: `import react from \"@vitejs/plugin-react\";\nimport { defineConfig } from \"vite\";\n\n// https://vitejs.dev/config/\nexport default defineConfig(({ mode }) => { \n return {\n plugins: [react()],\n server: {\n port: 8080,\n {{#if corsProxy}}\n proxy: {\n \"^(/multipass/api|/api)\": {\n target: \"{{foundryUrl}}\",\n changeOrigin: true,\n secure: true,\n },\n },\n {{/if}}\n },\n define: {\n \"process.env.NODE_ENV\": JSON.stringify(mode),\n },\n };\n});\n`\n}]]);"]}
|
|
@@ -1067,6 +1067,13 @@ const client = new FoundryClient({
|
|
|
1067
1067
|
clientId,
|
|
1068
1068
|
url,
|
|
1069
1069
|
redirectUrl,
|
|
1070
|
+
{{#if scopes}}
|
|
1071
|
+
scopes: [
|
|
1072
|
+
{{#each scopes}}
|
|
1073
|
+
"{{this}}",
|
|
1074
|
+
{{/each}}
|
|
1075
|
+
],
|
|
1076
|
+
{{/if}}
|
|
1070
1077
|
}),
|
|
1071
1078
|
});
|
|
1072
1079
|
|
|
@@ -1160,5 +1167,5 @@ export default defineConfig({
|
|
|
1160
1167
|
}]]);
|
|
1161
1168
|
|
|
1162
1169
|
export { files };
|
|
1163
|
-
//# sourceMappingURL=esm-
|
|
1164
|
-
//# sourceMappingURL=esm-
|
|
1170
|
+
//# sourceMappingURL=esm-Y7D2PCM4.js.map
|
|
1171
|
+
//# sourceMappingURL=esm-Y7D2PCM4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../create-app.template.tutorial-todo-aip-app/build/esm/generatedNoCheck/index.js"],"names":[],"mappings":"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","file":"esm-Y7D2PCM4.js","sourcesContent":["export const files = new Map([[\"README.md.hbs\", {\n type: \"raw\",\n body: `# {{project}}\n\nThis project was generated with [\\`@osdk/create-app\\`](https://www.npmjs.com/package/@osdk/create-app) and is intended to be used alongside the Developer Console tutorial for creating an AIP Logic backed To Do App against a reference Ontology.\n\n## Developing\n\nRun the following command or equivalent with your preferred package manager to start a local development server on \\`http://localhost:8080\\`:\n\n\\`\\`\\`sh\nnpm run dev\n\\`\\`\\`\n\nDevelopment configuration is stored in \\`.env.development\\`.\n\n{{#if corsProxy}}\nIn order to make API requests to Foundry, a CORS proxy has been set up for local development which may be removed if the stack is configured to allow \\`http://localhost:8080\\` to load resources. The configured OAuth client must also allow \\`http://localhost:8080/auth/callback\\` as a redirect URL.\n{{else}}\nIn order to make API requests to Foundry, CORS must be configured for the stack to allow \\`http://localhost:8080\\` to load resources. If this has not been configured and you are unable to request this, you can alternatively generate your project again with \\`--corsProxy true\\` to use a proxy for API requests during local development. The configured OAuth client must also allow \\`http://localhost:8080/auth/callback\\` as a redirect URL.\n{{/if}}\n\n## Deploying\n\nRun the following command or equivalent with your preferred package manager to create a production build of your application:\n\n\\`\\`\\`sh\nnpm run build\n\\`\\`\\`\n\nProduction configuration is stored in \\`.env.production\\`.\n\nIf you did not fill in the URL your production application will be hosted on you will need to fill in the \\`VITE_FOUNDRY_REDIRECT_URL\\` in \\`.env.production\\`. A default test is included in \\`env.test.ts\\` to verify your production environment variables which you can enable by removing the skip condition or running tests with the environment variable set \\`VERIFY_ENV_PRODUCTION=true\\`.\n\nIn order to make API requests to Foundry, CORS must be configured for the stack to allow the production origin to load resources. This will be automatically done for you if you are using Foundry website hosting. The configured OAuth client must also allow the production origin auth callback as a redirect URL.\n\nA \\`foundry.config.json\\` file is included in the root of this project to make deploying to Foundry website hosting with [\\`@osdk/cli\\`](https://www.npmjs.com/package/@osdk/cli) easier. If you are not using Foundry website hosting for your application you may delete this file.\n`\n}], [\".gitignore\", {\n type: \"raw\",\n body: `# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndist-ssr\n*.local\n\n# Editor directories and files\n.vscode/*\n!.vscode/extensions.json\n.idea\n.DS_Store\n*.suo\n*.ntvs*\n*.njsproj\n*.sln\n*.sw?\n`\n}], [\"eslint.config.mjs\", {\n \"type\": \"base64\",\n \"body\": \"Ly8gQHRzLWNoZWNrCmltcG9ydCBlc2xpbnQgZnJvbSAiQGVzbGludC9qcyI7CmltcG9ydCB0c1BhcnNlciBmcm9tICJAdHlwZXNjcmlwdC1lc2xpbnQvcGFyc2VyIjsKaW1wb3J0ICogYXMgaW1wb3J0UGx1Z2luIGZyb20gImVzbGludC1wbHVnaW4taW1wb3J0IjsKaW1wb3J0IGpzeEExMXlQbHVnaW4gZnJvbSAiZXNsaW50LXBsdWdpbi1qc3gtYTExeSI7CmltcG9ydCByZWFjdFBsdWdpbiBmcm9tICJlc2xpbnQtcGx1Z2luLXJlYWN0IjsKaW1wb3J0IHJlYWN0SG9va3NQbHVnaW4gZnJvbSAiZXNsaW50LXBsdWdpbi1yZWFjdC1ob29rcyI7CmltcG9ydCByZWFjdFJlZnJlc2ggZnJvbSAiZXNsaW50LXBsdWdpbi1yZWFjdC1yZWZyZXNoIjsKaW1wb3J0IGdsb2JhbHMgZnJvbSAiZ2xvYmFscyI7CmltcG9ydCB0c2VzbGludCBmcm9tICJ0eXBlc2NyaXB0LWVzbGludCI7CgpleHBvcnQgZGVmYXVsdCB0c2VzbGludC5jb25maWcoewogIGZpbGVzOiBbImVzbGludC5jb25maWcubWpzIiwgInNyYy8qKi8qLntqcyxtanMsY2pzLHRzLGpzeCx0c3h9Il0sCiAgc2V0dGluZ3M6IHsKICAgIHJlYWN0OiB7CiAgICAgIHZlcnNpb246ICJkZXRlY3QiLAogICAgfSwKCiAgICAiaW1wb3J0L3Jlc29sdmVyIjogewogICAgICBub2RlOiB7CiAgICAgICAgZXh0ZW5zaW9uczogWyIuanMiLCAiLmpzeCIsICIudHMiLCAiLnRzeCJdLAogICAgICB9LAogICAgfSwKICB9LAogIGxhbmd1YWdlT3B0aW9uczogewogICAgZ2xvYmFsczogewogICAgICAuLi5nbG9iYWxzLmJyb3dzZXIsCiAgICB9LAoKICAgIHBhcnNlcjogdHNQYXJzZXIsCiAgfSwKICBleHRlbmRzOiBbCiAgICBlc2xpbnQuY29uZmlncy5yZWNvbW1lbmRlZCwKICAgIC4uLnRzZXNsaW50LmNvbmZpZ3MucmVjb21tZW5kZWQsCiAgXSwKICBwbHVnaW5zOiB7CiAgICAicmVhY3QiOiAvKiogQHR5cGUgaW1wb3J0KCJlc2xpbnQiKS5FU0xpbnQuUGx1Z2luICovIChyZWFjdFBsdWdpbiksCiAgICAicmVhY3QtcmVmcmVzaCI6IHJlYWN0UmVmcmVzaCwKICAgICJyZWFjdC1ob29rcyI6CiAgICAgIC8qKiBAdHlwZSBpbXBvcnQoImVzbGludCIpLkVTTGludC5QbHVnaW4gKi8gKHJlYWN0SG9va3NQbHVnaW4pLAogICAgImpzeC1hMTF5IjoganN4QTExeVBsdWdpbiwKICAgICJpbXBvcnQiOiBpbXBvcnRQbHVnaW4sCiAgfSwKICBydWxlczogewogICAgLi4uKAogICAgICAvKiogQHR5cGUgaW1wb3J0KCJlc2xpbnQiKS5MaW50ZXIuUnVsZXNSZWNvcmQgKi8KICAgICAgKHJlYWN0UGx1Z2luLmNvbmZpZ3MuZmxhdD8ucmVjb21tZW5kZWQucnVsZXMpCiAgICApLAogICAgInJlYWN0LWhvb2tzL3J1bGVzLW9mLWhvb2tzIjogImVycm9yIiwKICAgICJyZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHMiOiAid2FybiIsCiAgICAuLi5qc3hBMTF5UGx1Z2luLmNvbmZpZ3MucmVjb21tZW5kZWQucnVsZXMsCiAgICAicmVhY3QtcmVmcmVzaC9vbmx5LWV4cG9ydC1jb21wb25lbnRzIjogWyJ3YXJuIiwgewogICAgICBhbGxvd0NvbnN0YW50RXhwb3J0OiB0cnVlLAogICAgfV0sCgogICAgImltcG9ydC9uYW1lZCI6ICJlcnJvciIsCiAgICAiaW1wb3J0L2RlZmF1bHQiOiAiZXJyb3IiLAogICAgImltcG9ydC9uYW1lc3BhY2UiOiAiZXJyb3IiLAogICAgImltcG9ydC9uby1kdXBsaWNhdGVzIjogImVycm9yIiwKICAgICJpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMiOiAiZXJyb3IiLAoKICAgICJyZWFjdC9yZWFjdC1pbi1qc3gtc2NvcGUiOiAib2ZmIiwKICB9LAp9KTsK\"\n}], [\"index.html\", {\n type: \"raw\",\n body: `<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <link rel=\"icon\" type=\"image/svg+xml\" href=\"/todo-aip-app.svg\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n <title>Ontology SDK Tutorial - To do AIP App</title>\n </head>\n <body>\n <div id=\"root-container\">\n <div id=\"root\"></div>\n </div>\n <script type=\"module\" src=\"/src/main.tsx\"></script>\n </body>\n</html>\n`\n}], [\"package.json.hbs\", {\n type: \"raw\",\n body: `{\n \"name\": \"{{project}}\",\n \"private\": true,\n \"version\": \"0.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"vite\",\n \"build\": \"tsc && vite build\",\n \"lint\": \"eslint . --report-unused-disable-directives --max-warnings 0\",\n \"test\": \"vitest run\",\n \"preview\": \"vite preview\"\n },\n \"dependencies\": {\n \"{{osdkPackage}}\": \"latest\",\n \"react\": \"^18\",\n \"react-dom\": \"^18\",\n \"react-router-dom\": \"^6.23.1\",\n \"swr\": \"^2.2.5\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^9.13.0\",\n \"@types/react\": \"^18\",\n \"@types/react-dom\": \"^18\",\n \"@typescript-eslint/eslint-plugin\": \"^8.11.0\",\n \"@typescript-eslint/parser\": \"^8.11.0\",\n \"@vitejs/plugin-react\": \"^4.2.0\",\n \"eslint\": \"^9.13.0\",\n \"eslint-plugin-import\": \"^2.31.0\",\n \"eslint-plugin-jsx-a11y\": \"^6.10.1\",\n \"eslint-plugin-react\": \"^7.37.2\",\n \"eslint-plugin-react-hooks\": \"^5.0.0\",\n \"eslint-plugin-react-refresh\": \"^0.4.14\",\n \"globals\": \"^15.11.0\",\n \"typescript\": \"~5.5.4\",\n \"typescript-eslint\": \"^8.11.0\",\n \"vite\": \"^5.4.8\",\n \"vitest\": \"^2.1.2\"\n }\n}`\n}], [\"public/aip-icon.svg\", {\n \"type\": \"base64\",\n \"body\": \"PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik03Ljk5OTQ5IDFIMi4wNjE4NkMwLjQ3NzI5NCAxIC0wLjUxMzI3NiAyLjY2NjI0IDAuMjc4NTY1IDMuOTk5NjhMMi42NTQwOSA4TDAuMjc4NTY1IDEyLjAwMDNDLTAuNTEzMjc2IDEzLjMzMzggMC40NzcyOTUgMTUgMi4wNjE4NiAxNUgxMy45MzgxQzE1LjUyMjcgMTUgMTYuNTEzMyAxMy4zMzM4IDE1LjcyMTQgMTIuMDAwM0wxMy4zNDU5IDhMMTUuNzIxNCAzLjk5OTY4QzE2LjUxMzMgMi42NjYyNCAxNS41MjI3IDEgMTMuOTM4MSAxSDguMDAwNTFINy45OTk0OVpNNi4yMTcwNCAyLjAwMDA4SDIuMDYxODZDMS4yNjk1NyAyLjAwMDA4IDAuNzc0Mjg5IDIuODMzMiAxLjE3MDIxIDMuNDk5OTJMMy4yNDgzIDYuOTk5MzdMNi4yMTcwNCAyLjAwMDA4Wk0zLjI0ODMgOS4wMDA2M0wxLjE3MDIxIDEyLjUwMDFDMC43NzQyOSAxMy4xNjY4IDEuMjY5NTcgMTMuOTk5OSAyLjA2MTg2IDEzLjk5OTlINi4yMTcwNEwzLjI0ODMgOS4wMDA2M1pNOS43ODI5NiAxMy45OTk5SDEzLjkzODFDMTQuNzMwNCAxMy45OTk5IDE1LjIyNTcgMTMuMTY2OCAxNC44Mjk4IDEyLjUwMDFMMTIuNzUxNyA5LjAwMDYzTDkuNzgyOTYgMTMuOTk5OVpNMTIuMTU3NSA4TDguODkxNjQgMTMuNDk5NkM4LjQ5NTUgMTQuMTY2NyA3LjUwNDUgMTQuMTY2NyA3LjEwODM2IDEzLjQ5OTZMMy44NDI1MSA4TDcuMTA4MzYgMi41MDA0QzcuNTA0NSAxLjgzMzMxIDguNDk1NTEgMS44MzMzMSA4Ljg5MTY1IDIuNTAwNEwxMi4xNTc1IDhaTTEyLjc1MTcgNi45OTkzNkwxNC44Mjk4IDMuNDk5OTJDMTUuMjI1NyAyLjgzMzIgMTQuNzMwNCAyLjAwMDA4IDEzLjkzODEgMi4wMDAwOEg5Ljc4Mjk2TDEyLjc1MTcgNi45OTkzNloiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPgo=\"\n}], [\"public/todo-aip-app.svg\", {\n \"type\": \"base64\",\n \"body\": \"PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIHZpZXdCb3g9IjAgMCA1MCA1MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzM1NzJfNjIxOTUpIj4KPHJlY3Qgb3BhY2l0eT0iMC4xIiB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiM5ODgxRjMiLz4KPHJlY3QgeD0iNyIgeT0iMTEiIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgcng9IjIiIGZpbGw9IiM3OTYxREIiLz4KPHJlY3QgeD0iNy41IiB5PSIxMS41IiB3aWR0aD0iMTEiIGhlaWdodD0iMTEiIHJ4PSIxLjUiIHN0cm9rZT0id2hpdGUiIHN0cm9rZS1vcGFjaXR5PSIwLjEiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNiAxNC4zNzVDMTUuNzkgMTQuMzc1IDE1LjYwMjUgMTQuNDU3NSAxNS40Njc1IDE0LjU5MjVMMTIuMjUgMTcuODE3NUwxMC41MzI1IDE2LjA5MjVDMTAuMzk3NSAxNS45NTc1IDEwLjIxIDE1Ljg3NSAxMCAxNS44NzVDOS41ODc1IDE1Ljg3NSA5LjI1IDE2LjIxMjUgOS4yNSAxNi42MjVDOS4yNSAxNi44MzUgOS4zMzI1IDE3LjAyMjUgOS40Njc1IDE3LjE1NzVMMTEuNzE3NSAxOS40MDc1QzExLjg1MjUgMTkuNTQyNSAxMi4wNCAxOS42MjUgMTIuMjUgMTkuNjI1QzEyLjQ2IDE5LjYyNSAxMi42NDc1IDE5LjU0MjUgMTIuNzgyNSAxOS40MDc1TDE2LjUzMjUgMTUuNjU3NUMxNi42Njc1IDE1LjUyMjUgMTYuNzUgMTUuMzM1IDE2Ljc1IDE1LjEyNUMxNi43NSAxNC43MTI1IDE2LjQxMjUgMTQuMzc1IDE2IDE0LjM3NVoiIGZpbGw9IndoaXRlIi8+CjxyZWN0IG9wYWNpdHk9IjAuNSIgeD0iMjIiIHk9IjE1IiB3aWR0aD0iMTIiIGhlaWdodD0iNSIgcng9IjIuNSIgZmlsbD0iIzYzNERCRiIvPgo8cmVjdCBvcGFjaXR5PSIwLjUiIHg9IjM2IiB5PSIxNSIgd2lkdGg9IjkiIGhlaWdodD0iNSIgcng9IjIuNSIgZmlsbD0iIzYzNERCRiIvPgo8cmVjdCB4PSI3LjUiIHk9IjI4LjUiIHdpZHRoPSIxMSIgaGVpZ2h0PSIxMSIgcng9IjEuNSIgZmlsbD0iI0E3OUJEQSIgZmlsbC1vcGFjaXR5PSIwLjEiLz4KPHJlY3QgeD0iNy41IiB5PSIyOC41IiB3aWR0aD0iMTEiIGhlaWdodD0iMTEiIHJ4PSIxLjUiIHN0cm9rZT0iI0EzOUNDMSIvPgo8cmVjdCBvcGFjaXR5PSIwLjUiIHg9IjIzIiB5PSIzMiIgd2lkdGg9IjYiIGhlaWdodD0iNSIgcng9IjIuNSIgZmlsbD0iIzYzNERCRiIvPgo8cGF0aCBvcGFjaXR5PSIwLjUiIGQ9Ik0zMSAzNC41QzMxIDMzLjExOTMgMzIuMzIyOCAzMiAzMy45NTQ1IDMySDQxLjA0NTVDNDIuNjc3MiAzMiA0NCAzMy4xMTkzIDQ0IDM0LjVDNDQgMzUuODgwNyA0Mi42NzcyIDM3IDQxLjA0NTUgMzdIMzMuOTU0NUMzMi4zMjI4IDM3IDMxIDM1Ljg4MDcgMzEgMzQuNVoiIGZpbGw9IiM2MzREQkYiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8zNTcyXzYyMTk1Ij4KPHJlY3Qgd2lkdGg9IjUwIiBoZWlnaHQ9IjUwIiByeD0iNCIgZmlsbD0id2hpdGUiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K\"\n}], [\"src/AuthCallback.tsx\", {\n type: \"raw\",\n body: `import { useEffect, useState } from \"react\";\nimport { useNavigate } from \"react-router-dom\";\nimport client from \"./client\";\n\n/**\n * Component to render at \\`/auth/callback\\`\n * This calls signIn() again to save the token, and then navigates the user back to the home page.\n */\nfunction AuthCallback() {\n const [error, setError] = useState<string | undefined>(undefined);\n const navigate = useNavigate();\n\n // This effect conflicts with React 18 strict mode in development\n // https://react.dev/learn/synchronizing-with-effects#how-to-handle-the-effect-firing-twice-in-development\n useEffect(() => {\n client.auth\n .signIn()\n .then(() => navigate(\"/\", { replace: true }))\n .catch((e: unknown) => setError((e as Error).message ?? e));\n }, [navigate]);\n return <div>{error != null ? error : \"Authenticating…\"}</div>;\n}\n\nexport default AuthCallback;\n`\n}], [\"src/AuthenticatedRoute.tsx\", {\n type: \"raw\",\n body: `import { useEffect, useState } from \"react\";\nimport { Outlet, useNavigate } from \"react-router-dom\";\nimport client from \"./client\";\n\n/**\n * A component that can be used to wrap routes that require authentication.\n * Nested routes may assume that a valid token is present.\n */\nfunction AuthenticatedRoute() {\n const navigate = useNavigate();\n const [token, setToken] = useState(client.auth.token);\n useEffect(() => {\n if (client.auth.token == null || client.auth.token.isExpired) {\n client.auth\n .refresh()\n .then(() => {\n setToken(client.auth.token);\n })\n .catch(() => {\n // If we cannot refresh the token (i.e. the user is not logged in) we redirect to the login page\n navigate(\"/login\");\n });\n }\n }, [navigate]);\n\n if (token == null || token.isExpired) {\n return null;\n }\n\n return <Outlet />;\n}\n\nexport default AuthenticatedRoute;\n`\n}], [\"src/CreateProjectButton.module.css\", {\n \"type\": \"base64\",\n \"body\": \"LmJ1dHRvbiB7CiAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKfQo=\"\n}], [\"src/CreateProjectButton.tsx\", {\n type: \"raw\",\n body: `import { useCallback, useState } from \"react\";\nimport css from \"./CreateProjectButton.module.css\";\nimport CreateProjectDialog from \"./CreateProjectDialog\";\nimport useProjects from \"./useProjects\";\n\ninterface CreateProjectButtonProps {\n onProjectCreated?: (projectId: string) => void;\n}\n\nfunction CreateProjectButton({ onProjectCreated }: CreateProjectButtonProps) {\n const { isLoading: isLoadingProjects, isError: isErrorProjects } =\n useProjects();\n\n const [isOpen, setIsOpen] = useState(false);\n const handleOpen = useCallback(() => setIsOpen(true), []);\n const handleClose = useCallback(() => setIsOpen(false), []);\n\n if (isLoadingProjects || isErrorProjects) {\n return null;\n }\n\n return (\n <>\n <button onClick={handleOpen} className={css.button}>\n Create Project\n </button>\n <CreateProjectDialog\n isOpen={isOpen}\n onClose={handleClose}\n onProjectCreated={onProjectCreated}\n />\n </>\n );\n}\n\nexport default CreateProjectButton;\n`\n}], [\"src/CreateProjectDialog.module.css\", {\n \"type\": \"base64\",\n \"body\": \"LnByb2plY3QgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMHB4Owp9Ci5sYWJlbCB7CiAgZGlzcGxheTogZmxleDsKICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgZ2FwOiA1cHg7Cn0KCi5idXR0b24gewogIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7Cn0K\"\n}], [\"src/CreateProjectDialog.tsx\", {\n type: \"raw\",\n body: `import type { ChangeEvent } from \"react\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport css from \"./CreateProjectDialog.module.css\";\n\nimport Dialog from \"./Dialog\";\nimport useProjects from \"./useProjects\";\n\ninterface CreateProjectDialogProps {\n isOpen: boolean;\n onClose: () => void;\n onProjectCreated?: (projectId: string) => void;\n}\n\nfunction CreateProjectDialog({\n isOpen,\n onClose,\n onProjectCreated,\n}: CreateProjectDialogProps) {\n const { createProject } = useProjects();\n\n const [name, setName] = useState<string>(\"New project\");\n\n const handleChangeProjectName = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => setName(e.target.value),\n [],\n );\n\n useEffect(() => setName(\"New project\"), [isOpen]);\n\n const [isCreating, setIsCreating] = useState(false);\n\n const handleSubmit = useCallback(async () => {\n setIsCreating(true);\n try {\n const projectId = await createProject(name);\n onProjectCreated?.(projectId);\n } finally {\n setIsCreating(false);\n onClose();\n }\n }, [onProjectCreated, onClose, createProject, name]);\n\n return (\n <Dialog\n isOpen={isOpen}\n buttons={[\n <button\n disabled={isCreating}\n onClick={onClose}\n key=\"cancel\"\n className={css.button}\n >\n Cancel\n </button>,\n <button\n disabled={isCreating}\n onClick={handleSubmit}\n key=\"create\"\n className={css.button}\n >\n Create project\n </button>,\n ]}\n >\n <div className={css.project}>\n <label className={css.label}>\n Project name:{\" \"}\n <input type=\"text\" value={name} onChange={handleChangeProjectName} />\n </label>\n </div>\n </Dialog>\n );\n}\nexport default CreateProjectDialog;\n`\n}], [\"src/CreateTaskButton.module.css\", {\n \"type\": \"base64\",\n \"body\": \"LmJ1dHRvbiB7CiAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKfQo=\"\n}], [\"src/CreateTaskButton.tsx\", {\n type: \"raw\",\n body: `import { useCallback, useState } from \"react\";\nimport css from \"./CreateTaskButton.module.css\";\nimport CreateTaskDialog from \"./CreateTaskDialog\";\nimport type { MockProject } from \"./mocks\";\nimport { useProjectTasks } from \"./useProjectTasks\";\n\ninterface CreateTaskButtonProps {\n project: MockProject;\n onTaskCreated: (taskId: string) => void;\n}\n\nfunction CreateTaskButton({ project, onTaskCreated }: CreateTaskButtonProps) {\n const { isLoading: isLoadingTasks, isError: isErrorTasks } = useProjectTasks(\n project,\n );\n\n const [isOpen, setIsOpen] = useState(false);\n const handleOpen = useCallback(() => setIsOpen(true), []);\n const handleClose = useCallback(() => setIsOpen(false), []);\n\n if (isLoadingTasks || isErrorTasks) {\n return null;\n }\n\n return (\n <>\n <button onClick={handleOpen} className={css.button}>Create Task</button>\n <CreateTaskDialog\n project={project}\n isOpen={isOpen}\n onClose={handleClose}\n onTaskCreated={onTaskCreated}\n />\n </>\n );\n}\n\nexport default CreateTaskButton;\n`\n}], [\"src/CreateTaskDialog.module.css\", {\n \"type\": \"base64\",\n \"body\": \"LnRhc2sgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsKICAgIGdyaWQtdGVtcGxhdGUtcm93czogYXV0byBtaW4tY29udGVudDsKICAgIGdhcDogMTBweDsKICAgIHdpZHRoOiA1MDBweDsKfQoubGFiZWwgewogIGRpc3BsYXk6IGZsZXg7CiAgZ2FwOiA1cHg7CiAgcmVzaXplOiBub25lOwp9CgouaW5wdXQgewogIHdpZHRoOiAzMDBweDsKICBib3JkZXI6IDFweCBzb2xpZCBncmF5OwogIGJvcmRlci1yYWRpdXM6IDVweDsKfQoKLnRleHRBcmVhIHsKICB3aWR0aDogMzAwcHg7CiAgcmVzaXplOiB2ZXJ0aWNhbDsKICBib3JkZXI6IDFweCBzb2xpZCBncmF5OwogIGJvcmRlci1yYWRpdXM6IDVweDsKICBwYWRkaW5nOiA1cHg7Cn0KCi5haXAgewogIGJhY2tncm91bmQtY29sb3I6ICM3OTYxREI7CiAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICBwYWRkaW5nOiAycHggNXB4OwogIGRpc3BsYXk6IGZsZXg7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLnByb2Nlc3NpbmcgewogIGN1cnNvcjogcHJvZ3Jlc3M7Cn0KCi5pbWFnZSB7CiAgd2lkdGg6IDE2cHg7CiAgaGVpZ2h0OiAxNnB4Owp9CgouY29udGFpbmVyIHsKICBkaXNwbGF5OiBmbGV4OwogIGFsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7CiAgZ2FwOiA1cHg7Cn0KCi5kaWFsb2dDb250YWluZXIgewogIHBvc2l0aW9uOiBmaXhlZDsKICB0b3A6IDA7CiAgcmlnaHQ6IDA7CiAgYm90dG9tOiAwOwogIGxlZnQ6IDA7CiAgZGlzcGxheTogZmxleDsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41KTsgLyogT3B0aW9uYWw6IGZvciBkaW1tZWQgYmFja2dyb3VuZCAqLwp9CgouYnV0dG9uIHsKICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwp9Cg==\"\n}], [\"src/CreateTaskDialog.tsx\", {\n type: \"raw\",\n body: `import aipLogo from \"/aip-icon.svg\";\nimport type { ChangeEvent } from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport css from \"./CreateTaskDialog.module.css\";\nimport Dialog from \"./Dialog\";\nimport type { MockProject } from \"./mocks\";\nimport { useProjectTasks } from \"./useProjectTasks\";\n\ninterface CreateTaskDialogProps {\n project: MockProject;\n isOpen: boolean;\n onClose: () => void;\n onTaskCreated: (taskId: string) => void;\n}\n\nfunction CreateTaskDialog(\n { project, isOpen, onClose, onTaskCreated }: CreateTaskDialogProps,\n) {\n const { createTask, getRecommendedTaskDescription } = useProjectTasks(\n project,\n );\n\n const [name, setName] = useState<string>(\"New task\");\n const [description, setDescription] = useState<string>(\"\");\n const [isProcessing, setIsProcessing] = useState<boolean>(false);\n const [isCreating, setIsCreating] = useState(false);\n const textAreaRef = useRef<HTMLTextAreaElement>(null);\n\n const handleChangeTaskName = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => setName(e.target.value),\n [],\n );\n\n const handleChangeTaskDescription = useCallback(\n (e: ChangeEvent<HTMLTextAreaElement>) => setDescription(e.target.value),\n [],\n );\n\n const handleTaskDescriptionRecommendation = useCallback(async () => {\n setIsProcessing(true);\n const recommendedDescription = await getRecommendedTaskDescription(name);\n setDescription(recommendedDescription);\n setIsProcessing(false);\n }, [getRecommendedTaskDescription, name]);\n\n useEffect(() => {\n setName(\"New task\");\n setDescription(\"\");\n }, [isOpen]);\n useEffect(() => {\n if (textAreaRef.current) {\n const textArea = textAreaRef.current;\n textArea.style.height = \"auto\";\n textArea.style.height = \\`\\${textArea.scrollHeight}px\\`;\n }\n }, [description]);\n\n const handleSubmit = useCallback(async () => {\n setIsCreating(true);\n try {\n const taskId = await createTask(name, description);\n if (taskId != null) {\n onTaskCreated(taskId);\n }\n } finally {\n setIsCreating(false);\n onClose();\n }\n }, [onClose, createTask, onTaskCreated, name, description]);\n\n return (\n <>\n {isOpen && (\n <div className={css.dialogContainer}>\n <Dialog\n isOpen={isOpen}\n buttons={[\n <button\n disabled={isCreating}\n onClick={onClose}\n key=\"cancel\"\n className={css.button}\n >\n Cancel\n </button>,\n <button\n disabled={isCreating}\n onClick={handleSubmit}\n key=\"create\"\n className={css.button}\n >\n Create task\n </button>,\n ]}\n >\n <div className={css.task}>\n <label className={css.label}>\n Task name:{\" \"}\n </label>\n <input\n type=\"text\"\n value={name}\n onChange={handleChangeTaskName}\n className={css.input}\n />\n\n <label className={css.label}>\n Task description:{\" \"}\n </label>\n <div className={css.container}>\n <textarea\n ref={textAreaRef}\n value={description}\n onChange={handleChangeTaskDescription}\n className={css.textArea}\n rows={2}\n />\n <button\n disabled={isProcessing}\n className={\\`\\${css.aip} \\${isProcessing ? css.processing : \"\"}\\`}\n title=\"Click here to get AIP task description recommendation\"\n type=\"button\"\n onClick={handleTaskDescriptionRecommendation}\n >\n <img\n src={aipLogo}\n alt=\"AIP\"\n className={css.image}\n />\n </button>\n </div>\n </div>\n </Dialog>\n </div>\n )}\n </>\n );\n}\n\nexport default CreateTaskDialog;\n`\n}], [\"src/DeleteProjectButton.module.css\", {\n \"type\": \"base64\",\n \"body\": \"LmJ1dHRvbiB7CiAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKfQo=\"\n}], [\"src/DeleteProjectButton.tsx\", {\n type: \"raw\",\n body: `import { useCallback, useState } from \"react\";\nimport css from \"./DeleteProjectButton.module.css\";\nimport DeleteProjectDialog from \"./DeleteProjectDialog\";\nimport type { MockProject } from \"./mocks\";\nimport useProjects from \"./useProjects\";\n\ninterface DeleteProjectButtonProps {\n project: MockProject;\n}\n\nfunction DeleteProjectButton({ project }: DeleteProjectButtonProps) {\n const { isLoading: isLoadingProjects, isError: isErrorProjects } =\n useProjects();\n\n const [isOpen, setIsOpen] = useState(false);\n const handleOpen = useCallback(() => setIsOpen(true), []);\n const handleClose = useCallback(() => setIsOpen(false), []);\n\n if (isLoadingProjects || isErrorProjects) {\n return null;\n }\n\n return (\n <>\n <button onClick={handleOpen} className={css.button}>\n Delete Project\n </button>\n <DeleteProjectDialog\n project={project}\n isOpen={isOpen}\n onClose={handleClose}\n />\n </>\n );\n}\n\nexport default DeleteProjectButton;\n`\n}], [\"src/DeleteProjectDialog.module.css\", {\n \"type\": \"base64\",\n \"body\": \"LmJ1dHRvbiB7CiAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKfQo=\"\n}], [\"src/DeleteProjectDialog.tsx\", {\n type: \"raw\",\n body: `import { useCallback, useState } from \"react\";\nimport css from \"./DeleteProjectDialog.module.css\";\nimport Dialog from \"./Dialog\";\nimport type { MockProject } from \"./mocks\";\nimport useProjects from \"./useProjects\";\n\ninterface DeleteProjectDialogProps {\n project: MockProject;\n isOpen: boolean;\n onClose: () => void;\n}\n\nfunction DeleteProjectDialog({\n project,\n isOpen,\n onClose,\n}: DeleteProjectDialogProps) {\n const { deleteProject } = useProjects();\n\n const [isDeleting, setIsDeleting] = useState(false);\n const handleSubmit = useCallback(async () => {\n setIsDeleting(true);\n try {\n await deleteProject(project);\n } finally {\n setIsDeleting(false);\n onClose();\n }\n }, [deleteProject, onClose, project]);\n\n return (\n <Dialog\n isOpen={isOpen}\n buttons={[\n <button\n disabled={isDeleting}\n onClick={onClose}\n key=\"cancel\"\n className={css.button}\n >\n Cancel\n </button>,\n <button\n disabled={isDeleting}\n onClick={handleSubmit}\n key=\"delete\"\n className={css.button}\n >\n Delete\n </button>,\n ]}\n >\n Are you sure you want to delete this project?\n </Dialog>\n );\n}\nexport default DeleteProjectDialog;\n`\n}], [\"src/Dialog.module.css\", {\n \"type\": \"base64\",\n \"body\": \"LmJ1dHRvbnMgewogIGRpc3BsYXk6IGZsZXg7CiAgZ2FwOiAxZW07CiAgbWFyZ2luLXRvcDogMWVtOwogIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7Cn0KCi5kaWFsb2cgewogIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOwogIGJvcmRlci1yYWRpdXM6IDEwcHg7Cn0K\"\n}], [\"src/Dialog.tsx\", {\n type: \"raw\",\n body: `import { PropsWithChildren } from \"react\";\nimport css from \"./Dialog.module.css\";\n\ninterface DialogProps {\n isOpen: boolean;\n buttons?: React.ReactElement[];\n}\n\nfunction Dialog({ children, isOpen, buttons }: PropsWithChildren<DialogProps>) {\n return (\n <dialog open={isOpen} className={css.dialog}>\n {children}\n {buttons != null && buttons.length > 0 && (\n <div className={css.buttons}>{buttons}</div>\n )}\n </dialog>\n );\n}\nexport default Dialog;\n`\n}], [\"src/Home.module.css\", {\n \"type\": \"base64\",\n \"body\": \"LnR1dG9yaWFsQmFubmVyV3JhcHBlciB7CiAgZGlzcGxheTogZmxleDsKICBtYXJnaW46IDJlbTsKfQoKLnR1dG9yaWFsQmFubmVyIHsKICBmbGV4OiAxOwogIHdpZHRoOiAwOwogIGJhY2tncm91bmQ6IHJnYmEoMTIxLCA5NywgMjE5LCAwLjcpOwogIGNvbG9yOiAjZmZmZmZmOwogIGJvcmRlci1yYWRpdXM6IDFlbTsKICBwYWRkaW5nOiAxZW07CiAgYm94LXNoYWRvdzogMCAxMHB4IDE1cHggLTNweCByZ2IoMCAwIDAgLyAwLjEpLCAwIDRweCA2cHggLTRweCByZ2IoMCAwIDAgLyAwLjEpOwp9CgoudHV0b3JpYWxCYW5uZXJUaXRsZSB7CiAgbWFyZ2luLXRvcDogMDsKICBmb250LXdlaWdodDogNjAwOwp9CgoucHJvamVjdFNlbGVjdCB7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGdhcDogMWVtOwogIG1hcmdpbjogMmVtOwogIGZvbnQtd2VpZ2h0OiA2MDA7Cn0KCg==\"\n}], [\"src/Home.tsx\", {\n type: \"raw\",\n body: `import { useCallback, useEffect, useState } from \"react\";\nimport CreateProjectButton from \"./CreateProjectButton\";\nimport DeleteProjectButton from \"./DeleteProjectButton\";\nimport css from \"./Home.module.css\";\nimport Layout from \"./Layout\";\nimport type { MockProject } from \"./mocks\";\nimport { ProjectDetails } from \"./ProjectDetails\";\nimport ProjectSelect from \"./ProjectSelect\";\nimport useProjects from \"./useProjects\";\n\nfunction Home() {\n const [projectId, setProjectId] = useState<string | undefined>(undefined);\n const { projects } = useProjects();\n\n const project = projects?.find((p) => p.id === projectId);\n\n const handleSelectProject = useCallback(\n (p: MockProject) => setProjectId(p.id),\n [],\n );\n\n useEffect(() => {\n if (project == null && projects != null && projects.length > 0) {\n setProjectId(projects[0].id);\n }\n }, [project, projects]);\n\n const handleOnProjectCreated = useCallback(\n (projectId: string | undefined) => {\n setProjectId(projectId);\n },\n [],\n );\n\n return (\n <Layout>\n <div className={css.tutorialBannerWrapper}>\n <div className={css.tutorialBanner}>\n <p className={css.tutorialBannerTitle}>\n 💡 Welcome to the To Do AIP App tutorial!\n </p>\n <p>\n The application is implemented with mock in memory data.\n <br />Can you solve how to change it to use the Ontology SDK\n instead?\n </p>\n </div>\n </div>\n <div className={css.projectSelect}>\n <span>Project:</span>\n <ProjectSelect\n project={project}\n projects={projects ?? []}\n onSelectProject={handleSelectProject}\n />\n <CreateProjectButton onProjectCreated={handleOnProjectCreated} />\n {project != null && <DeleteProjectButton project={project} />}\n </div>\n {project != null && <ProjectDetails project={project} />}\n </Layout>\n );\n}\n\nexport default Home;\n`\n}], [\"src/Layout.module.css\", {\n \"type\": \"base64\",\n \"body\": \"LmhlYWRlciB7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIG1hcmdpbjogMmVtOwp9CgoubG9nbyB7CiAgaGVpZ2h0OiA0ZW07CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBtYXJnaW4tcmlnaHQ6IDFlbTsKfQoKLnRpdGxlIHsKICBmb250LXdlaWdodDogNjAwOwogIGZvbnQtc2l6ZTogMS41ZW07Cn0K\"\n}], [\"src/Layout.tsx\", {\n type: \"raw\",\n body: `import todoAppLogo from \"/todo-aip-app.svg\";\nimport React from \"react\";\nimport css from \"./Layout.module.css\";\n\ninterface LayoutProps {\n children?: React.ReactNode;\n}\n\nfunction Layout({ children }: LayoutProps) {\n return (\n <>\n <div className={css.header}>\n <img src={todoAppLogo} className={css.logo} alt=\"Todo App logo\" />\n <div className={css.title}>\n Ontology SDK Tutorial - To Do App Powered by AIP\n </div>\n </div>\n {children}\n </>\n );\n}\n\nexport default Layout;\n`\n}], [\"src/Login.module.css\", {\n \"type\": \"base64\",\n \"body\": \"LmxvZ2luQnV0dG9uIHsKICBkaXNwbGF5OiBmbGV4OwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIG1hcmdpbjogMmVtOwp9Cg==\"\n}], [\"src/Login.tsx\", {\n type: \"raw\",\n body: `import { useCallback, useState } from \"react\";\nimport { Navigate } from \"react-router-dom\";\nimport client from \"./client\";\nimport Layout from \"./Layout\";\nimport css from \"./Login.module.css\";\n\nfunction Login() {\n const [isLoggingIn, setIsLoggingIn] = useState(false);\n const [error, setError] = useState<string | undefined>(undefined);\n const token = client.auth.token;\n\n const handleLogin = useCallback(async () => {\n setIsLoggingIn(true);\n try {\n // Initiate the OAuth flow, which will redirect the user to log into Foundry\n // Once the login has completed, the user will be redirected back to the route defined via the\n // FOUNDRY_REDIRECT_URL variable in .env.development\n await client.auth.signIn();\n } catch (e: unknown) {\n console.error(e);\n setError((e as Error).message ?? e);\n } finally {\n setIsLoggingIn(false);\n }\n }, []);\n\n // If the token exists but a user tries to load /login, redirect to the home page instead\n if (token != null) {\n return <Navigate to=\"/\" replace={true} />;\n }\n\n return (\n <Layout>\n <div className={css.loginButton}>\n <button onClick={handleLogin}>\n {isLoggingIn ? \"Logging in…\" : \"Log in \"}\n </button>\n </div>\n {error && <div>Unable to log in: {error}</div>}\n </Layout>\n );\n}\n\nexport default Login;\n`\n}], [\"src/ProjectDetails.module.css\", {\n \"type\": \"base64\",\n \"body\": \"LnByb2plY3RDYXJkIHsKICBtYXJnaW46IDJlbTsKICBwYWRkaW5nOiAwLjVlbTsKICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogIC8qIG1hcmdpbjogMC41ZW07ICovCiAgZ2FwOiAwLjVlbTsKICBib3JkZXItcmFkaXVzOiA1cHg7Cgp9CgoucHJvamVjdFRpdGxlIHsKICBmb250LXNpemU6IDEuNWVtOwp9CgouZGVzY3JpcHRpb24gewogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBnYXA6IDVweDsKfQoKLmltYWdlIHsKICBoZWlnaHQ6IDE2cHg7CiAgd2lkdGg6IDE2cHg7Cn0KCi5haXAgewogIGJhY2tncm91bmQtY29sb3I6ICM3OTYxREI7CiAgY29sb3I6ICNmZmZmZmY7CiAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICBwYWRkaW5nOiAycHg7CiAgZ2FwOiAxMHB4OwogIGhlaWdodDogMzBweDsKfQoKLnByb2Nlc3NpbmcgewogIGN1cnNvcjogcHJvZ3Jlc3M7Cn0KCi5haXBUZXh0IHsKICBkaXNwbGF5OiBmbGV4OwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIGdhcDogMTBweDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIHBhZGRpbmc6IDAgMTBweDsKfQoKLnRleHRBcmVhIHsKICBib3JkZXI6IG5vbmU7CiAgY29sb3I6IGdyYXk7CiAgcmVzaXplOiBub25lOwogIG92ZXJmbG93OiBoaWRkZW47CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0K\"\n}], [\"src/ProjectDetails.tsx\", {\n type: \"raw\",\n body: `import aipLogo from \"/aip-icon.svg\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport CreateTaskButton from \"./CreateTaskButton\";\nimport type { MockProject } from \"./mocks\";\nimport css from \"./ProjectDetails.module.css\";\nimport TaskList from \"./TaskList\";\nimport useProjects from \"./useProjects\";\nimport { useProjectTasks } from \"./useProjectTasks\";\n\ninterface ProjectDetailsProps {\n project: MockProject;\n}\n\nexport function ProjectDetails({ project }: ProjectDetailsProps) {\n const [projectHasTasks, setProjectHasTasks] = useState<boolean>(false);\n const [isProcessing, setIsProcessing] = useState<boolean>(false);\n const { updateProjectDescription } = useProjects();\n const tasks = useProjectTasks(project).tasks;\n const textAreaRef = useRef<HTMLTextAreaElement>(null);\n\n useEffect(() => {\n setProjectHasTasks(tasks == null ? false : tasks.length > 0);\n }, [project, tasks]);\n\n const handleProjectDescriptionRecommendation = useCallback(async () => {\n if (project == null) {\n return;\n }\n setIsProcessing(true);\n await updateProjectDescription(project);\n setIsProcessing(false);\n }, [project, updateProjectDescription]);\n\n useEffect(() => {\n if (textAreaRef.current) {\n const textArea = textAreaRef.current;\n textArea.style.height = \"auto\";\n textArea.style.height = \\`\\${textArea.scrollHeight}px\\`;\n }\n }, [project.description]);\n\n const handleOnTaskCreated = useCallback(() => {\n setProjectHasTasks(true);\n }, []);\n\n const handleOnTaskDeleted = useCallback(() => {\n if (tasks?.length === 0) {\n setProjectHasTasks(false);\n }\n }, [tasks]);\n\n return (\n <div className={css.projectCard} key={project.id}>\n <h1 className={css.projectTitle}>{project.name}</h1>\n {projectHasTasks && (\n <div className={css.description}>\n <textarea\n ref={textAreaRef}\n readOnly\n value={project.description}\n className={css.textArea}\n />\n <button\n disabled={isProcessing}\n className={\\`\\${css.aip} \\${isProcessing ? css.processing : \"\"}\\`}\n title=\"Click here to update project description based on AIP Logic\"\n type=\"button\"\n onClick={handleProjectDescriptionRecommendation}\n >\n <div className={css.aipText}>\n <img\n src={aipLogo}\n alt=\"AIP\"\n className={css.image}\n />\n Get description recommendation\n </div>\n </button>\n </div>\n )}\n <TaskList project={project} onTaskDeleted={handleOnTaskDeleted} />\n <CreateTaskButton\n project={project}\n onTaskCreated={handleOnTaskCreated}\n />\n </div>\n );\n}\n`\n}], [\"src/ProjectSelect.tsx\", {\n type: \"raw\",\n body: `import { ChangeEvent, useCallback } from \"react\";\nimport { MockProject } from \"./mocks\";\n\ninterface ProjectSelectProps {\n project: MockProject | undefined;\n projects: MockProject[];\n onSelectProject: (project: MockProject) => void;\n}\n\nfunction ProjectSelect({\n project,\n projects,\n onSelectProject,\n}: ProjectSelectProps) {\n const handleSelect = useCallback(\n (e: ChangeEvent<HTMLSelectElement>) => {\n const nextProject = projects.find((p) => \\`\\${p.id}\\` === e.target.value);\n if (nextProject != null) {\n onSelectProject(nextProject);\n }\n },\n [projects, onSelectProject],\n );\n\n return (\n <select value={project?.id} onChange={handleSelect}>\n <option hidden disabled value=\"\">\n -- select a project --\n </option>\n\n {projects.map((p) => (\n <option key={p.id} value={p.id}>\n {p.name}\n </option>\n ))}\n </select>\n );\n}\n\nexport default ProjectSelect;\n`\n}], [\"src/TaskList.module.css\", {\n \"type\": \"base64\",\n \"body\": \"LnRhc2tMaXN0IHsKICBsaXN0LXN0eWxlOiBub25lOwogIHBhZGRpbmc6IDA7CiAgbWFyZ2luLXRvcDogMWVtOwogIG1hcmdpbi1ib3R0b206IDFlbTsKICB3aWR0aDogMTAwJTsKfQo=\"\n}], [\"src/TaskList.tsx\", {\n type: \"raw\",\n body: `import type { MockProject } from \"./mocks\";\nimport css from \"./TaskList.module.css\";\nimport TaskListItem from \"./TaskListItem\";\nimport { useProjectTasks } from \"./useProjectTasks\";\n\ninterface TaskListProps {\n project: MockProject;\n onTaskDeleted: (taskId: string | undefined) => void;\n}\n\nfunction TaskList({ project, onTaskDeleted }: TaskListProps) {\n const {\n tasks,\n isLoading: isLoadingTasks,\n isError: isErrorTasks,\n deleteTask,\n } = useProjectTasks(project);\n\n if (isErrorTasks) {\n return <div className={css.taskList}>Error loading tasks!</div>;\n } else if (isLoadingTasks) {\n return null;\n }\n\n const data = tasks ?? [];\n if (data.length === 0) {\n return <div className={css.taskList}>No tasks found</div>;\n }\n\n return (\n <ul className={css.taskList}>\n {data.map((task) => (\n <TaskListItem\n key={task.id}\n task={task}\n deleteTask={deleteTask}\n onTaskDeleted={onTaskDeleted}\n />\n ))}\n </ul>\n );\n}\n\nexport default TaskList;\n`\n}], [\"src/TaskListItem.module.css\", {\n \"type\": \"base64\",\n \"body\": \"LmxpIHsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgcGFkZGluZzogNXB4OwogIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgZ2FwOiA1cHg7CiAgYm9yZGVyLXJhZGl1czogNXB4OwogIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7CiAgbWFyZ2luOiAxMHB4IDA7Cn0KCi5jaGVja2VkIHsKICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDsKfQoKLmRlbGV0ZSB7CiAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICBwYWRkaW5nOiAycHg7Cn0KCi50YXNrIHsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgd2lkdGg6IDEwMCU7Cn0KCi50ZXh0QXJlYSB7CiAgYm9yZGVyOiBub25lOwogIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7CiAgY29sb3I6IGdyYXk7CiAgcmVzaXplOiBub25lOwogIG92ZXJmbG93OiBoaWRkZW47CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0K\"\n}], [\"src/TaskListItem.tsx\", {\n type: \"raw\",\n body: `import { useCallback, useEffect, useRef, useState } from \"react\";\nimport type { MockTask } from \"./mocks\";\nimport css from \"./TaskListItem.module.css\";\n\ninterface TaskListItemProps {\n task: MockTask;\n deleteTask: (task: MockTask) => Promise<void>;\n onTaskDeleted: (taskId: string | undefined) => void;\n}\n\nfunction TaskListItem({ task, deleteTask, onTaskDeleted }: TaskListItemProps) {\n const [isDeleting, setIsDeleting] = useState(false);\n const textAreaRef = useRef<HTMLTextAreaElement>(null);\n\n const handleClick = useCallback(async () => {\n setIsDeleting(true);\n try {\n await deleteTask(task);\n } finally {\n onTaskDeleted(task.id);\n setIsDeleting(false);\n }\n }, [deleteTask, task, onTaskDeleted]);\n\n useEffect(() => {\n if (textAreaRef.current) {\n const textArea = textAreaRef.current;\n textArea.style.height = \"auto\";\n textArea.style.height = \\`\\${textArea.scrollHeight}px\\`;\n }\n }, [task.description]);\n const cleanDescription = task.description?.trim();\n return (\n <li className={css.li}>\n <input\n type=\"checkbox\"\n onChange={handleClick}\n checked={isDeleting}\n className={css.delete}\n title=\"Delete task\"\n />\n <div className={\\`\\${css.task} \\${isDeleting ? css.checked : \"\"}\\`}>\n <span>{task.title}</span>\n {cleanDescription != null && (\n <textarea\n ref={textAreaRef}\n readOnly\n value={task.description}\n className={css.textArea}\n rows={1}\n />\n )}\n </div>\n </li>\n );\n}\n\nexport default TaskListItem;\n`\n}], [\"src/client.ts.hbs\", {\n type: \"raw\",\n body: `import { FoundryClient, PublicClientAuth } from \"{{osdkPackage}}\";\n\nconst url = import.meta.env.VITE_FOUNDRY_API_URL;\nconst clientId = import.meta.env.VITE_FOUNDRY_CLIENT_ID;\nconst redirectUrl = import.meta.env.VITE_FOUNDRY_REDIRECT_URL;\ncheckEnv(url, \"VITE_FOUNDRY_API_URL\");\ncheckEnv(clientId, \"VITE_FOUNDRY_CLIENT_ID\");\ncheckEnv(redirectUrl, \"VITE_FOUNDRY_REDIRECT_URL\");\n\nfunction checkEnv(\n value: string | undefined,\n name: string,\n): asserts value is string {\n if (value == null) {\n throw new Error(\\`Missing environment variable: \\${name}\\`);\n }\n}\n\n/**\n * Initialize the client to interact with the Ontology SDK\n */\nconst client = new FoundryClient({\n url,\n auth: new PublicClientAuth({\n clientId,\n url,\n redirectUrl,\n {{#if scopes}}\n scopes: [\n {{#each scopes}}\n \"{{this}}\",\n {{/each}}\n ],\n {{/if}}\n }),\n});\n\nexport default client;\n`\n}], [\"src/env.test.ts\", {\n \"type\": \"base64\",\n \"body\": \"aW1wb3J0IHsgbG9hZEVudiB9IGZyb20gInZpdGUiOwppbXBvcnQgeyBleHBlY3QsIHRlc3QgfSBmcm9tICJ2aXRlc3QiOwoKY29uc3QgRU5WX1ZBUlMgPSBbCiAgIlZJVEVfRk9VTkRSWV9BUElfVVJMIiwKICAiVklURV9GT1VORFJZX0NMSUVOVF9JRCIsCiAgIlZJVEVfRk9VTkRSWV9SRURJUkVDVF9VUkwiLApdOwoKZm9yIChjb25zdCBlbnZWYXIgb2YgRU5WX1ZBUlMpIHsKICB0ZXN0LnNraXBJZihwcm9jZXNzLmVudi5WRVJJRllfRU5WX1BST0RVQ1RJT04gIT09ICJ0cnVlIikoCiAgICBgcHJvZHVjdGlvbiBlbnYgc2hvdWxkIGNvbnRhaW4gJHtlbnZWYXJ9YCwKICAgICgpID0+IHsKICAgICAgY29uc3QgZW52ID0gbG9hZEVudigicHJvZHVjdGlvbiIsIHByb2Nlc3MuY3dkKCkpOwogICAgICBleHBlY3QoZW52W2VudlZhcl0sIGAke2VudlZhcn0gc2hvdWxkIGJlIGRlZmluZWRgKS50b0JlRGVmaW5lZCgpOwogICAgICBleHBlY3QoCiAgICAgICAgZW52W2VudlZhcl0sCiAgICAgICAgYCR7ZW52VmFyfSBzaG91bGQgbm90IGNvbnRhaW4gcGxhY2Vob2xkZXIgdmFsdWVgLAogICAgICApLm5vdC50b01hdGNoKC88Lio+Lyk7CiAgICB9LAogICk7Cn0K\"\n}], [\"src/index.css\", {\n \"type\": \"base64\",\n \"body\": \"OnJvb3QgewogIGZvbnQtZmFtaWx5OiBJbnRlciwgc3lzdGVtLXVpLCBBdmVuaXIsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CiAgbGluZS1oZWlnaHQ6IDEuNTsKICBmb250LXdlaWdodDogNDAwOwoKICBmb250LXN5bnRoZXNpczogbm9uZTsKICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5OwogIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7Cn0KCiNyb290LWNvbnRhaW5lciB7CiAgZGlzcGxheTogZmxleDsKICBmbGV4OiAxOwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCiNyb290IHsKICBtYXgtd2lkdGg6IDEyODBweDsKICBtYXJnaW46IDJyZW0gYXV0bzsKICBwYWRkaW5nOiAycmVtOwp9CgphIHsKICBmb250LXdlaWdodDogNTAwOwogIGNvbG9yOiAjNjQ2Y2ZmOwogIHRleHQtZGVjb3JhdGlvbjogaW5oZXJpdDsKfQphOmhvdmVyIHsKICBjb2xvcjogIzUzNWJmMjsKfQoKYm9keSB7CiAgbWFyZ2luOiAwOwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBtaW4td2lkdGg6IDMyMHB4OwogIG1pbi1oZWlnaHQ6IDEwMHZoOwp9CgpoMSB7CiAgZm9udC1zaXplOiAzLjJlbTsKICBsaW5lLWhlaWdodDogMS4xOwp9CgpidXR0b24gewogIGJvcmRlci1yYWRpdXM6IDhweDsKICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICBwYWRkaW5nOiAwLjZlbSAxLjJlbTsKICBmb250LXNpemU6IDFlbTsKICBmb250LXdlaWdodDogNTAwOwogIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogIGN1cnNvcjogcG9pbnRlcjsKICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4yNXM7Cn0KYnV0dG9uOmhvdmVyIHsKICBib3JkZXItY29sb3I6ICM2NDZjZmY7Cn0KYnV0dG9uOmZvY3VzLApidXR0b246Zm9jdXMtdmlzaWJsZSB7CiAgb3V0bGluZTogNHB4IGF1dG8gLXdlYmtpdC1mb2N1cy1yaW5nLWNvbG9yOwp9CgpAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBsaWdodCkgewogIDpyb290IHsKICAgIGNvbG9yOiAjMjEzNTQ3OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKICB9CiAgYTpob3ZlciB7CiAgICBjb2xvcjogIzc0N2JmZjsKICB9CiAgYnV0dG9uIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7CiAgfQp9Cg==\"\n}], [\"src/main.tsx\", {\n type: \"raw\",\n body: `import ReactDOM from \"react-dom/client\";\nimport { createBrowserRouter, RouterProvider } from \"react-router-dom\";\nimport AuthCallback from \"./AuthCallback\";\nimport AuthenticatedRoute from \"./AuthenticatedRoute\";\nimport Home from \"./Home\";\nimport Login from \"./Login\";\nimport \"./index.css\";\n\nconst router = createBrowserRouter(\n [\n {\n path: \"/\",\n element: <AuthenticatedRoute />,\n children: [\n {\n path: \"/\",\n element: <Home />,\n },\n ],\n },\n {\n path: \"/login\",\n element: <Login />,\n },\n {\n // This is the route defined in your application's redirect URL\n path: \"/auth/callback\",\n element: <AuthCallback />,\n },\n ],\n { basename: import.meta.env.BASE_URL },\n);\n\nReactDOM.createRoot(document.getElementById(\"root\")!).render(\n <RouterProvider router={router} />,\n);\n`\n}], [\"src/mocks.ts\", {\n \"type\": \"base64\",\n \"body\": \"ZXhwb3J0IGludGVyZmFjZSBNb2NrUHJvamVjdCB7CiAgJGFwaU5hbWU6IHN0cmluZzsKICAkcHJpbWFyeUtleTogc3RyaW5nOwogIGlkOiBzdHJpbmc7CiAgbmFtZTogc3RyaW5nOwogIGRlc2NyaXB0aW9uOiBzdHJpbmc7CiAgdGFza3M6IE1vY2tUYXNrW107Cn0KCmV4cG9ydCBpbnRlcmZhY2UgTW9ja1Rhc2sgewogICRhcGlOYW1lOiBzdHJpbmc7CiAgJHByaW1hcnlLZXk6IHN0cmluZzsKICBpZDogc3RyaW5nOwogIHRpdGxlOiBzdHJpbmc7CiAgZGVzY3JpcHRpb246IHN0cmluZzsKfQoKY29uc3QgcHJvamVjdHM6IE1vY2tQcm9qZWN0W10gPSBbCiAgewogICAgJGFwaU5hbWU6ICJNb2NrUHJvamVjdCIsCiAgICAkcHJpbWFyeUtleTogIjEiLAogICAgaWQ6ICIxIiwKICAgIG5hbWU6ICJNb2NrIHByb2plY3QiLAogICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIGEgbW9jayBkZXNjcmlwdGlvbiIsCiAgICB0YXNrczogWwogICAgICB7CiAgICAgICAgJGFwaU5hbWU6ICJNb2NrVGFzayIsCiAgICAgICAgJHByaW1hcnlLZXk6ICIxIiwKICAgICAgICBpZDogIjEiLAogICAgICAgIHRpdGxlOiAiVHJ5IHRvIiwKICAgICAgICBkZXNjcmlwdGlvbjogInRhc2sgZGVzY3JpcHRpb24gMSIsCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAkYXBpTmFtZTogIk1vY2tUYXNrIiwKICAgICAgICAkcHJpbWFyeUtleTogIjIiLAogICAgICAgIGlkOiAiMiIsCiAgICAgICAgdGl0bGU6ICJJbXBsZW1lbnQgdGhpcyIsCiAgICAgICAgZGVzY3JpcHRpb246ICJ0YXNrIGRlc2NyaXB0aW9uIDIiLAogICAgICB9LAogICAgICB7CiAgICAgICAgJGFwaU5hbWU6ICJNb2NrVGFzayIsCiAgICAgICAgJHByaW1hcnlLZXk6ICIzIiwKICAgICAgICBpZDogIjMiLAogICAgICAgIHRpdGxlOiAiV2l0aCB0aGUgT250b2xvZ3kgU0RLISIsCiAgICAgICAgZGVzY3JpcHRpb246ICJ0YXNrIGRlc2NyaXB0aW9uIDMiLAogICAgICB9LAogICAgXSwKICB9LAogIHsKICAgICRhcGlOYW1lOiAiTW9ja1Byb2plY3QiLAogICAgJHByaW1hcnlLZXk6ICIyIiwKICAgIGlkOiAiMiIsCiAgICBuYW1lOiAiWWV0IGFub3RoZXIgbW9jayBwcm9qZWN0IiwKICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBpcyBhbm90aGVyIG1vY2sgZGVzY3JpcHRpb24iLAogICAgdGFza3M6IFsKICAgICAgewogICAgICAgICRhcGlOYW1lOiAiTW9ja1Rhc2siLAogICAgICAgICRwcmltYXJ5S2V5OiAiNCIsCiAgICAgICAgaWQ6ICI0IiwKICAgICAgICB0aXRsZTogIk1vcmUgdGFza3MgaGVyZSIsCiAgICAgICAgZGVzY3JpcHRpb246ICJNb3JlIHRhc2sgZGVzY3JpcHRpb24iLAogICAgICB9LAogICAgXSwKICB9LApdOwoKYXN5bmMgZnVuY3Rpb24gZGVsYXkoKTogUHJvbWlzZTx2b2lkPiB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PgogICAgc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIDUwMCArIE1hdGgucmFuZG9tKCkgKiAxMDAwKQogICk7Cn0KCi8vIEdvb2QgZW5vdWdoIHJhbmRvbSBpZCBmb3IgbW9ja3MKZnVuY3Rpb24gcmFuZG9tSWQoKTogc3RyaW5nIHsKICByZXR1cm4gYCR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMiAqKiAzMSl9YDsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0UHJvamVjdHMoKTogUHJvbWlzZTxNb2NrUHJvamVjdFtdPiB7CiAgYXdhaXQgZGVsYXkoKTsKICBjb25zdCByZXN1bHQgPSBbLi4ucHJvamVjdHNdOwogIHJlc3VsdC5zb3J0KChwMSwgcDIpID0+IHAxLm5hbWUubG9jYWxlQ29tcGFyZShwMi5uYW1lKSk7CiAgcmV0dXJuIHJlc3VsdDsKfQoKYXN5bmMgZnVuY3Rpb24gY3JlYXRlUHJvamVjdCh7CiAgbmFtZSwKICBkZXNjcmlwdGlvbiA9ICIiLAp9OiB7CiAgbmFtZTogc3RyaW5nOwogIGRlc2NyaXB0aW9uPzogc3RyaW5nOwp9KTogUHJvbWlzZTxNb2NrUHJvamVjdFsiJHByaW1hcnlLZXkiXT4gewogIGF3YWl0IGRlbGF5KCk7CiAgY29uc3QgaWQgPSByYW5kb21JZCgpOwogIHByb2plY3RzLnB1c2goewogICAgJGFwaU5hbWU6ICJNb2NrUHJvamVjdCIsCiAgICAkcHJpbWFyeUtleTogaWQsCiAgICBpZCwKICAgIG5hbWUsCiAgICBkZXNjcmlwdGlvbiwKICAgIHRhc2tzOiBbXSwKICB9KTsKICByZXR1cm4gaWQ7Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldFJlY29tbWVuZGVkUHJvamVjdERlc2NyaXB0aW9uKAogIHByb2plY3Q6IE1vY2tQcm9qZWN0LAopOiBQcm9taXNlPHN0cmluZz4gewogIGF3YWl0IGRlbGF5KCk7CiAgaWYgKHByb2plY3QudGFza3MgIT0gbnVsbCAmJiBwcm9qZWN0LnRhc2tzLmxlbmd0aCA9PT0gMCkgewogICAgdGhyb3cgbmV3IEVycm9yKCJQcm9qZWN0IGRlc2NyaXB0aW9uIHJlY29tbWVuZGF0aW9uIHJlcXVpcmVzIHRhc2tzIik7CiAgfQogIHJldHVybiBgQUlQIExvZ2ljIG1vY2sgZGVzY3JpcHRpb24gZm9yIHByb2plY3RgOwp9Cgphc3luYyBmdW5jdGlvbiB1cGRhdGVQcm9qZWN0RGVzY3JpcHRpb24oCiAgcHJvamVjdDogTW9ja1Byb2plY3QsCik6IFByb21pc2U8dm9pZD4gewogIGF3YWl0IGRlbGF5KCk7CiAgcHJvamVjdC5kZXNjcmlwdGlvbiA9IGF3YWl0IGdldFJlY29tbWVuZGVkUHJvamVjdERlc2NyaXB0aW9uKHByb2plY3QpOwp9Cgphc3luYyBmdW5jdGlvbiBkZWxldGVQcm9qZWN0KGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHsKICBhd2FpdCBkZWxheSgpOwogIGNvbnN0IGlkeCA9IHByb2plY3RzLmZpbmRJbmRleCgocCkgPT4gcC5pZCA9PT0gaWQpOwogIGlmIChpZHggIT09IC0xKSB7CiAgICBwcm9qZWN0cy5zcGxpY2UoaWR4LCAxKTsKICB9Cn0KCmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRhc2soewogIHRpdGxlLAogIGRlc2NyaXB0aW9uID0gIiIsCiAgcHJvamVjdElkLAp9OiB7CiAgdGl0bGU6IHN0cmluZzsKICBkZXNjcmlwdGlvbjogc3RyaW5nOwogIHByb2plY3RJZDogc3RyaW5nOwp9KTogUHJvbWlzZTxNb2NrVGFza1siJHByaW1hcnlLZXkiXT4gewogIGF3YWl0IGRlbGF5KCk7CiAgY29uc3QgcHJvamVjdCA9IHByb2plY3RzLmZpbmQoKHApID0+IHAuaWQgPT09IHByb2plY3RJZCk7CiAgaWYgKHByb2plY3QgPT0gbnVsbCkgewogICAgdGhyb3cgbmV3IEVycm9yKGBQcm9qZWN0ICR7cHJvamVjdElkfSBub3QgZm91bmQhYCk7CiAgfQogIGNvbnN0IGlkID0gcmFuZG9tSWQoKTsKICBwcm9qZWN0LnRhc2tzLnVuc2hpZnQoewogICAgJGFwaU5hbWU6ICJNb2NrVGFzayIsCiAgICAkcHJpbWFyeUtleTogaWQsCiAgICBpZCwKICAgIHRpdGxlLAogICAgZGVzY3JpcHRpb24sCiAgfSk7CiAgcmV0dXJuIGlkOwp9Cgphc3luYyBmdW5jdGlvbiBnZXRSZWNvbW1lbmRlZFRhc2tEZXNjcmlwdGlvbigKICB0YXNrTmFtZTogc3RyaW5nLAopOiBQcm9taXNlPHN0cmluZz4gewogIGF3YWl0IGRlbGF5KCk7CiAgaWYgKHRhc2tOYW1lLmxlbmd0aCA9PT0gMCkgewogICAgdGhyb3cgbmV3IEVycm9yKCJUYXNrIG5hbWUgbXVzdCBub3QgYmUgZW1wdHkiKTsKICB9CiAgcmV0dXJuIGBNb2NrIEFJUCBkZXNjcmlwdGlvbiBmb3IgdGFza2A7Cn0KCmFzeW5jIGZ1bmN0aW9uIGRlbGV0ZVRhc2soaWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4gewogIGF3YWl0IGRlbGF5KCk7CiAgZm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7CiAgICBjb25zdCBpZHggPSBwcm9qZWN0LnRhc2tzLmZpbmRJbmRleCgodCkgPT4gdC5pZCA9PT0gaWQpOwogICAgaWYgKGlkeCAhPT0gLTEpIHsKICAgICAgcHJvamVjdC50YXNrcy5zcGxpY2UoaWR4LCAxKTsKICAgIH0KICB9Cn0KCmNvbnN0IE1vY2tzID0gewogIGdldFByb2plY3RzLAogIGNyZWF0ZVByb2plY3QsCiAgZ2V0UmVjb21tZW5kZWRQcm9qZWN0RGVzY3JpcHRpb24sCiAgZGVsZXRlUHJvamVjdCwKICBjcmVhdGVUYXNrLAogIGRlbGV0ZVRhc2ssCiAgZ2V0UmVjb21tZW5kZWRUYXNrRGVzY3JpcHRpb24sCiAgdXBkYXRlUHJvamVjdERlc2NyaXB0aW9uLAp9OwoKZXhwb3J0IGRlZmF1bHQgTW9ja3M7Cg==\"\n}], [\"src/useProjectTasks.ts\", {\n \"type\": \"base64\",\n \"body\": \"aW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICJyZWFjdCI7CmltcG9ydCB1c2VTV1IgZnJvbSAic3dyIjsKaW1wb3J0IE1vY2tzLCB7IE1vY2tQcm9qZWN0LCBNb2NrVGFzayB9IGZyb20gIi4vbW9ja3MiOwoKZXhwb3J0IGZ1bmN0aW9uIHVzZVByb2plY3RUYXNrcyhwcm9qZWN0OiBNb2NrUHJvamVjdCB8IHVuZGVmaW5lZCkgewogIGNvbnN0IHsgZGF0YSwgaXNMb2FkaW5nLCBpc1ZhbGlkYXRpbmcsIGVycm9yLCBtdXRhdGUgfSA9IHVzZVNXUjxNb2NrVGFza1tdPigKICAgIHByb2plY3QgIT0gbnVsbCA\\u002FIGBwcm9qZWN0cy8ke3Byb2plY3QuaWR9L3Rhc2tzYCA6IG51bGwsCiAgICAvLyBUcnkgdG8gaW1wbGVtZW50IHRoaXMgd2l0aCB0aGUgT250b2xvZ3kgU0RLIQogICAgYXN5bmMgKCkgPT4gewogICAgICBpZiAocHJvamVjdCA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIFtdOwogICAgICB9CiAgICAgIHJldHVybiBwcm9qZWN0LnRhc2tzOwogICAgfSwKICApOwoKICBjb25zdCBjcmVhdGVUYXNrOiAoCiAgICB0aXRsZTogc3RyaW5nLAogICAgZGVzY3JpcHRpb246IHN0cmluZywKICApID0+IFByb21pc2U8TW9ja1Rhc2tbIiRwcmltYXJ5S2V5Il0gfCB1bmRlZmluZWQ+ID0gdXNlQ2FsbGJhY2soCiAgICBhc3luYyAodGl0bGU6IHN0cmluZywgZGVzY3JpcHRpb246IHN0cmluZykgPT4gewogICAgICBpZiAocHJvamVjdCA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgfQogICAgICAvLyBUcnkgdG8gaW1wbGVtZW50IHRoaXMgd2l0aCB0aGUgT250b2xvZ3kgU0RLIQogICAgICBjb25zdCBpZCA9IGF3YWl0IE1vY2tzLmNyZWF0ZVRhc2soewogICAgICAgIHRpdGxlLAogICAgICAgIGRlc2NyaXB0aW9uLAogICAgICAgIHByb2plY3RJZDogcHJvamVjdC4kcHJpbWFyeUtleSwKICAgICAgfSk7CiAgICAgIGF3YWl0IG11dGF0ZSgpOwogICAgICByZXR1cm4gaWQ7CiAgICB9LAogICAgW3Byb2plY3QsIG11dGF0ZV0sCiAgKTsKCiAgY29uc3QgZGVsZXRlVGFzazogKHRhc2s6IE1vY2tUYXNrKSA9PiBQcm9taXNlPHZvaWQ+ID0gdXNlQ2FsbGJhY2soCiAgICBhc3luYyAodGFzaykgPT4gewogICAgICBpZiAocHJvamVjdCA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGF3YWl0IHNsZWVwKDEwMDApOwogICAgICAvLyBUcnkgdG8gaW1wbGVtZW50IHRoaXMgd2l0aCB0aGUgT250b2xvZ3kgU0RLIQogICAgICBhd2FpdCBNb2Nrcy5kZWxldGVUYXNrKHRhc2suJHByaW1hcnlLZXkpOwogICAgICBhd2FpdCBtdXRhdGUoKTsKICAgIH0sCiAgICBbcHJvamVjdCwgbXV0YXRlXSwKICApOwoKICBjb25zdCBnZXRSZWNvbW1lbmRlZFRhc2tEZXNjcmlwdGlvbjogKHRhc2tOYW1lOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPiA9CiAgICB1c2VDYWxsYmFjaygKICAgICAgYXN5bmMgKHRhc2tOYW1lOiBzdHJpbmcpID0+IHsKICAgICAgICAvLyBUcnkgdG8gaW1wbGVtZW50IHRoaXMgd2l0aCB0aGUgT250b2xvZ3kgU0RLIQogICAgICAgIGNvbnN0IHJlY29tbWVuZGVkVGFza0Rlc2NyaXB0aW9uID0gYXdhaXQgTW9ja3MKICAgICAgICAgIC5nZXRSZWNvbW1lbmRlZFRhc2tEZXNjcmlwdGlvbih0YXNrTmFtZSk7CiAgICAgICAgYXdhaXQgbXV0YXRlKCk7CiAgICAgICAgcmV0dXJuIHJlY29tbWVuZGVkVGFza0Rlc2NyaXB0aW9uOwogICAgICB9LAogICAgICBbbXV0YXRlXSwKICAgICk7CgogIHJldHVybiB7CiAgICB0YXNrczogZGF0YSwKICAgIGlzTG9hZGluZywKICAgIGlzVmFsaWRhdGluZywKICAgIGlzRXJyb3I6IGVycm9yLAogICAgY3JlYXRlVGFzaywKICAgIGRlbGV0ZVRhc2ssCiAgICBnZXRSZWNvbW1lbmRlZFRhc2tEZXNjcmlwdGlvbiwKICB9Owp9CgpmdW5jdGlvbiBzbGVlcChtczogbnVtYmVyKSB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpOwp9Cg==\"\n}], [\"src/useProjects.ts\", {\n \"type\": \"base64\",\n \"body\": \"aW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICJyZWFjdCI7CmltcG9ydCB1c2VTV1IgZnJvbSAic3dyIjsKaW1wb3J0IHR5cGUgeyBNb2NrUHJvamVjdCB9IGZyb20gIi4vbW9ja3MiOwppbXBvcnQgTW9ja3MgZnJvbSAiLi9tb2NrcyI7CgpmdW5jdGlvbiB1c2VQcm9qZWN0cygpIHsKICBjb25zdCB7IGRhdGEsIGlzTG9hZGluZywgaXNWYWxpZGF0aW5nLCBlcnJvciwgbXV0YXRlIH0gPSB1c2VTV1I8CiAgICBNb2NrUHJvamVjdFtdCiAgPigicHJvamVjdHMiLCBhc3luYyAoKSA9PiB7CiAgICAvLyBUcnkgdG8gaW1wbGVtZW50IHRoaXMgd2l0aCB0aGUgT250b2xvZ3kgU0RLIQogICAgcmV0dXJuIE1vY2tzLmdldFByb2plY3RzKCk7CiAgfSk7CgogIGNvbnN0IGNyZWF0ZVByb2plY3Q6ICgKICAgIG5hbWU6IHN0cmluZywKICApID0+IFByb21pc2U8TW9ja1Byb2plY3RbIiRwcmltYXJ5S2V5Il0+ID0gdXNlQ2FsbGJhY2soCiAgICBhc3luYyAobmFtZTogc3RyaW5nKSA9PiB7CiAgICAgIC8vIFRyeSB0byBpbXBsZW1lbnQgdGhpcyB3aXRoIHRoZSBPbnRvbG9neSBTREshCiAgICAgIGNvbnN0IGlkID0gYXdhaXQgTW9ja3MuY3JlYXRlUHJvamVjdCh7IG5hbWUgfSk7CiAgICAgIGF3YWl0IG11dGF0ZSgpOwogICAgICByZXR1cm4gaWQ7CiAgICB9LAogICAgW211dGF0ZV0sCiAgKTsKCiAgY29uc3QgdXBkYXRlUHJvamVjdERlc2NyaXB0aW9uOiAoCiAgICBwcm9qZWN0OiBNb2NrUHJvamVjdCwKICApID0+IFByb21pc2U8dm9pZD4gPSB1c2VDYWxsYmFjaygKICAgIGFzeW5jIChwcm9qZWN0KSA9PiB7CiAgICAgIC8vIFRyeSB0byBpbXBsZW1lbnQgdGhpcyB3aXRoIHRoZSBPbnRvbG9neSBTREshCiAgICAgIGF3YWl0IE1vY2tzLnVwZGF0ZVByb2plY3REZXNjcmlwdGlvbihwcm9qZWN0KTsKICAgICAgYXdhaXQgbXV0YXRlKCk7CiAgICB9LAogICAgW211dGF0ZV0sCiAgKTsKCiAgY29uc3QgZGVsZXRlUHJvamVjdDogKHByb2plY3Q6IE1vY2tQcm9qZWN0KSA9PiBQcm9taXNlPHZvaWQ+ID0gdXNlQ2FsbGJhY2soCiAgICBhc3luYyAocHJvamVjdCkgPT4gewogICAgICAvLyBUcnkgdG8gaW1wbGVtZW50IHRoaXMgd2l0aCB0aGUgT250b2xvZ3kgU0RLIQogICAgICBhd2FpdCBNb2Nrcy5kZWxldGVQcm9qZWN0KHByb2plY3QuJHByaW1hcnlLZXkpOwogICAgICBhd2FpdCBtdXRhdGUoKTsKICAgIH0sCiAgICBbbXV0YXRlXSwKICApOwoKICByZXR1cm4gewogICAgcHJvamVjdHM6IGRhdGEsCiAgICBpc0xvYWRpbmcsCiAgICBpc1ZhbGlkYXRpbmcsCiAgICBpc0Vycm9yOiBlcnJvciwKICAgIGNyZWF0ZVByb2plY3QsCiAgICBkZWxldGVQcm9qZWN0LAogICAgdXBkYXRlUHJvamVjdERlc2NyaXB0aW9uLAogIH07Cn0KCmV4cG9ydCBkZWZhdWx0IHVzZVByb2plY3RzOwo=\"\n}], [\"src/vite-env.d.ts\", {\n \"type\": \"base64\",\n \"body\": \"Ly8vIDxyZWZlcmVuY2UgdHlwZXM9InZpdGUvY2xpZW50IiAvPgo=\"\n}], [\"tsconfig.json\", {\n \"type\": \"base64\",\n \"body\": \"ewogICJjb21waWxlck9wdGlvbnMiOiB7CiAgICAidGFyZ2V0IjogIkVTMjAyMCIsCiAgICAidXNlRGVmaW5lRm9yQ2xhc3NGaWVsZHMiOiB0cnVlLAogICAgImxpYiI6IFsiRVMyMDIwIiwgIkRPTSIsICJET00uSXRlcmFibGUiXSwKICAgICJtb2R1bGUiOiAiRVNOZXh0IiwKICAgICJza2lwTGliQ2hlY2siOiB0cnVlLAoKICAgIC8qIEJ1bmRsZXIgbW9kZSAqLwogICAgIm1vZHVsZVJlc29sdXRpb24iOiAiYnVuZGxlciIsCiAgICAiYWxsb3dJbXBvcnRpbmdUc0V4dGVuc2lvbnMiOiB0cnVlLAogICAgInJlc29sdmVKc29uTW9kdWxlIjogdHJ1ZSwKICAgICJpc29sYXRlZE1vZHVsZXMiOiB0cnVlLAogICAgIm5vRW1pdCI6IHRydWUsCiAgICAianN4IjogInJlYWN0LWpzeCIsCgogICAgLyogTGludGluZyAqLwogICAgInN0cmljdCI6IHRydWUsCiAgICAibm9VbnVzZWRMb2NhbHMiOiB0cnVlLAogICAgIm5vVW51c2VkUGFyYW1ldGVycyI6IHRydWUsCiAgICAibm9GYWxsdGhyb3VnaENhc2VzSW5Td2l0Y2giOiB0cnVlCiAgfSwKICAiaW5jbHVkZSI6IFsic3JjIl0sCiAgInJlZmVyZW5jZXMiOiBbeyAicGF0aCI6ICIuL3RzY29uZmlnLm5vZGUuanNvbiIgfV0KfQo=\"\n}], [\"tsconfig.node.json\", {\n \"type\": \"base64\",\n \"body\": \"ewogICJjb21waWxlck9wdGlvbnMiOiB7CiAgICAiY29tcG9zaXRlIjogdHJ1ZSwKICAgICJza2lwTGliQ2hlY2siOiB0cnVlLAogICAgIm1vZHVsZSI6ICJFU05leHQiLAogICAgIm1vZHVsZVJlc29sdXRpb24iOiAiYnVuZGxlciIsCiAgICAiYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0cyI6IHRydWUKICB9LAogICJpbmNsdWRlIjogWyJ2aXRlLmNvbmZpZy50cyJdCn0K\"\n}], [\"vite.config.ts.hbs\", {\n type: \"raw\",\n body: `import react from \"@vitejs/plugin-react\";\nimport { defineConfig } from \"vite\";\n\n// https://vitejs.dev/config/\nexport default defineConfig({\n plugins: [react()],\n server: {\n port: 8080,\n {{#if corsProxy}}\n proxy: {\n \"^(/multipass/api|/api)\": {\n target: \"{{foundryUrl}}\",\n changeOrigin: true,\n secure: true,\n },\n },\n {{/if}}\n },\n});\n`\n}]]);"]}
|
package/build/esm/index.js
CHANGED
|
@@ -216,6 +216,44 @@ async function promptProject({
|
|
|
216
216
|
return project;
|
|
217
217
|
}
|
|
218
218
|
|
|
219
|
+
// src/prompts/promptScopes.ts
|
|
220
|
+
var scopeNameRegex = /^[a-zA-Z-_:]+$/;
|
|
221
|
+
async function promptScopes({
|
|
222
|
+
scopes
|
|
223
|
+
}) {
|
|
224
|
+
if (scopes == null) {
|
|
225
|
+
return void 0;
|
|
226
|
+
}
|
|
227
|
+
while (true) {
|
|
228
|
+
const invalidScopes = scopes.filter((scope) => !scopeNameRegex.test(scope));
|
|
229
|
+
const allValidScopes = invalidScopes.length === 0;
|
|
230
|
+
if (allValidScopes) {
|
|
231
|
+
break;
|
|
232
|
+
}
|
|
233
|
+
const joinedInvalidScopes = invalidScopes.join(", ");
|
|
234
|
+
consola.fail(`Scopes [ ${joinedInvalidScopes} ] are invalid. Scope names can only contain letters, hyphens, underscores, and colons`);
|
|
235
|
+
const stringScopes = await consola.prompt("Scopes:", {
|
|
236
|
+
type: "text",
|
|
237
|
+
placeholder: "api:ontologies-read api:ontologies-write",
|
|
238
|
+
default: "api:ontologies-read api:ontologies-write"
|
|
239
|
+
});
|
|
240
|
+
scopes = stringScopes.split(" ");
|
|
241
|
+
}
|
|
242
|
+
return deduplicateScopes(scopes);
|
|
243
|
+
}
|
|
244
|
+
function deduplicateScopes(scopes) {
|
|
245
|
+
const dedupedScopes = [];
|
|
246
|
+
const seen = /* @__PURE__ */ new Set();
|
|
247
|
+
for (const scope of scopes) {
|
|
248
|
+
if (seen.has(scope)) {
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
dedupedScopes.push(scope);
|
|
252
|
+
seen.add(scope);
|
|
253
|
+
}
|
|
254
|
+
return dedupedScopes;
|
|
255
|
+
}
|
|
256
|
+
|
|
219
257
|
// src/prompts/promptSdkVersion.ts
|
|
220
258
|
async function promptSdkVersion({
|
|
221
259
|
sdkVersion,
|
|
@@ -254,8 +292,8 @@ var TEMPLATES = [
|
|
|
254
292
|
envPrefix: "VITE_",
|
|
255
293
|
buildDirectory: "./dist",
|
|
256
294
|
files: {
|
|
257
|
-
"1.x": getPackageFiles(import('./esm-
|
|
258
|
-
"2.x": getPackageFiles(import('./esm-
|
|
295
|
+
"1.x": getPackageFiles(import('./esm-IWXD7ZFP.js')),
|
|
296
|
+
"2.x": getPackageFiles(import('./esm-S2OWTMMF.js'))
|
|
259
297
|
}
|
|
260
298
|
},
|
|
261
299
|
// Vue
|
|
@@ -265,8 +303,8 @@ var TEMPLATES = [
|
|
|
265
303
|
envPrefix: "VITE_",
|
|
266
304
|
buildDirectory: "./dist",
|
|
267
305
|
files: {
|
|
268
|
-
"1.x": getPackageFiles(import('./esm-
|
|
269
|
-
"2.x": getPackageFiles(import('./esm-
|
|
306
|
+
"1.x": getPackageFiles(import('./esm-F6Y6OKER.js')),
|
|
307
|
+
"2.x": getPackageFiles(import('./esm-G7B67PJ6.js'))
|
|
270
308
|
}
|
|
271
309
|
},
|
|
272
310
|
// Next (static export)
|
|
@@ -276,8 +314,8 @@ var TEMPLATES = [
|
|
|
276
314
|
envPrefix: "NEXT_PUBLIC_",
|
|
277
315
|
buildDirectory: "./out",
|
|
278
316
|
files: {
|
|
279
|
-
"1.x": getPackageFiles(import('./esm-
|
|
280
|
-
"2.x": getPackageFiles(import('./esm-
|
|
317
|
+
"1.x": getPackageFiles(import('./esm-LF7OTAKA.js')),
|
|
318
|
+
"2.x": getPackageFiles(import('./esm-FXURBNU2.js'))
|
|
281
319
|
}
|
|
282
320
|
},
|
|
283
321
|
// Tutorial: To do App
|
|
@@ -287,8 +325,8 @@ var TEMPLATES = [
|
|
|
287
325
|
envPrefix: "VITE_",
|
|
288
326
|
buildDirectory: "./dist",
|
|
289
327
|
files: {
|
|
290
|
-
"1.x": getPackageFiles(import('./esm-
|
|
291
|
-
"2.x": getPackageFiles(import('./esm-
|
|
328
|
+
"1.x": getPackageFiles(import('./esm-PQDKPDBA.js')),
|
|
329
|
+
"2.x": getPackageFiles(import('./esm-4QSCBEZC.js'))
|
|
292
330
|
}
|
|
293
331
|
},
|
|
294
332
|
// Tutorial: To do AIP App
|
|
@@ -298,8 +336,8 @@ var TEMPLATES = [
|
|
|
298
336
|
envPrefix: "VITE_",
|
|
299
337
|
buildDirectory: "./dist",
|
|
300
338
|
files: {
|
|
301
|
-
"1.x": getPackageFiles(import('./esm-
|
|
302
|
-
"2.x": getPackageFiles(import('./esm-
|
|
339
|
+
"1.x": getPackageFiles(import('./esm-Y7D2PCM4.js')),
|
|
340
|
+
"2.x": getPackageFiles(import('./esm-H2IADGOR.js'))
|
|
303
341
|
}
|
|
304
342
|
}
|
|
305
343
|
];
|
|
@@ -428,7 +466,8 @@ async function run({
|
|
|
428
466
|
clientId,
|
|
429
467
|
osdkPackage,
|
|
430
468
|
osdkRegistryUrl,
|
|
431
|
-
corsProxy
|
|
469
|
+
corsProxy,
|
|
470
|
+
scopes
|
|
432
471
|
}) {
|
|
433
472
|
consola.log("");
|
|
434
473
|
consola.start(`Creating project ${green(project)} using template ${green(template.id)}`);
|
|
@@ -470,13 +509,14 @@ async function run({
|
|
|
470
509
|
cwd: fileURLToPath(import.meta.url)
|
|
471
510
|
});
|
|
472
511
|
ourPackageJsonPath ? JSON.parse(fs2.readFileSync(ourPackageJsonPath, "utf-8")).version : void 0;
|
|
473
|
-
const clientVersion = "2.1.0-beta.
|
|
512
|
+
const clientVersion = "2.1.0-beta.8";
|
|
474
513
|
const templateContext = {
|
|
475
514
|
project,
|
|
476
515
|
foundryUrl,
|
|
477
516
|
osdkPackage,
|
|
478
517
|
corsProxy,
|
|
479
|
-
clientVersion: changeVersionPrefix(clientVersion, "^")
|
|
518
|
+
clientVersion: changeVersionPrefix(clientVersion, "^"),
|
|
519
|
+
scopes
|
|
480
520
|
};
|
|
481
521
|
const processFiles = function(dir) {
|
|
482
522
|
fs2.readdirSync(dir).forEach(function(file) {
|
|
@@ -543,7 +583,7 @@ async function run({
|
|
|
543
583
|
|
|
544
584
|
// src/cli.ts
|
|
545
585
|
async function cli(args = process.argv) {
|
|
546
|
-
const base = yargs(hideBin(args)).version("2.1.0-beta.
|
|
586
|
+
const base = yargs(hideBin(args)).version("2.1.0-beta.8").wrap(Math.min(150, yargs().terminalWidth())).strict().help().command("$0 [project] [--<option>]", "Create a new OSDK application based on framework templates. Information may be provided through options to skip interactive prompts.", (yargs2) => yargs2.positional("project", {
|
|
547
587
|
type: "string",
|
|
548
588
|
describe: "Project name to create"
|
|
549
589
|
}).option("overwrite", {
|
|
@@ -583,6 +623,10 @@ async function cli(args = process.argv) {
|
|
|
583
623
|
}).option("corsProxy", {
|
|
584
624
|
type: "boolean",
|
|
585
625
|
describe: "Include a CORS proxy for Foundry API requests during local development"
|
|
626
|
+
}).option("scopes", {
|
|
627
|
+
type: "string",
|
|
628
|
+
array: true,
|
|
629
|
+
describe: "List of client-side scopes to be used when creating a client"
|
|
586
630
|
}));
|
|
587
631
|
const parsed = base.parseSync();
|
|
588
632
|
const project = await promptProject(parsed);
|
|
@@ -602,6 +646,7 @@ async function cli(args = process.argv) {
|
|
|
602
646
|
const osdkPackage = await promptOsdkPackage(parsed);
|
|
603
647
|
const osdkRegistryUrl = await promptOsdkRegistryUrl(parsed);
|
|
604
648
|
const corsProxy = await promptCorsProxy(parsed);
|
|
649
|
+
const scopes = await promptScopes(parsed);
|
|
605
650
|
await run({
|
|
606
651
|
project,
|
|
607
652
|
overwrite,
|
|
@@ -613,7 +658,8 @@ async function cli(args = process.argv) {
|
|
|
613
658
|
clientId,
|
|
614
659
|
osdkPackage,
|
|
615
660
|
osdkRegistryUrl,
|
|
616
|
-
corsProxy
|
|
661
|
+
corsProxy,
|
|
662
|
+
scopes
|
|
617
663
|
});
|
|
618
664
|
}
|
|
619
665
|
|