@osdk/create-app 2.8.0-beta.2 → 2.8.0-beta.20

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.
Files changed (51) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +16 -16
  3. package/build/esm/index.js +13 -27
  4. package/build/esm/index.js.map +1 -1
  5. package/package.json +11 -11
  6. package/build/esm/esm-ANPPBOCI.js +0 -494
  7. package/build/esm/esm-ANPPBOCI.js.map +0 -1
  8. package/build/esm/esm-BPDOE2XQ.js +0 -274
  9. package/build/esm/esm-BPDOE2XQ.js.map +0 -1
  10. package/build/esm/esm-BZCH5TWU.js +0 -1185
  11. package/build/esm/esm-BZCH5TWU.js.map +0 -1
  12. package/build/esm/esm-DRNISRMJ.js +0 -1394
  13. package/build/esm/esm-DRNISRMJ.js.map +0 -1
  14. package/build/esm/esm-HEF4SCJP.js +0 -610
  15. package/build/esm/esm-HEF4SCJP.js.map +0 -1
  16. package/build/esm/esm-HPTIRCUT.js +0 -827
  17. package/build/esm/esm-HPTIRCUT.js.map +0 -1
  18. package/build/esm/esm-QTVEFJ72.js +0 -917
  19. package/build/esm/esm-QTVEFJ72.js.map +0 -1
  20. package/build/esm/esm-RRX43VDZ.js +0 -468
  21. package/build/esm/esm-RRX43VDZ.js.map +0 -1
  22. package/build/esm/esm-VF46BQ3A.js +0 -1094
  23. package/build/esm/esm-VF46BQ3A.js.map +0 -1
  24. package/build/types/cli.test.d.ts +0 -1
  25. package/build/types/cli.test.d.ts.map +0 -1
  26. package/build/types/generate/generateEnv.test.d.ts +0 -1
  27. package/build/types/generate/generateEnv.test.d.ts.map +0 -1
  28. package/build/types/generate/generateFoundryConfigJson.test.d.ts +0 -1
  29. package/build/types/generate/generateFoundryConfigJson.test.d.ts.map +0 -1
  30. package/build/types/generate/generateNpmRc.test.d.ts +0 -1
  31. package/build/types/generate/generateNpmRc.test.d.ts.map +0 -1
  32. package/build/types/prompts/promptApplicationRid.test.d.ts +0 -1
  33. package/build/types/prompts/promptApplicationRid.test.d.ts.map +0 -1
  34. package/build/types/prompts/promptApplicationUrl.test.d.ts +0 -1
  35. package/build/types/prompts/promptApplicationUrl.test.d.ts.map +0 -1
  36. package/build/types/prompts/promptClientId.test.d.ts +0 -1
  37. package/build/types/prompts/promptClientId.test.d.ts.map +0 -1
  38. package/build/types/prompts/promptCorsProxy.test.d.ts +0 -1
  39. package/build/types/prompts/promptCorsProxy.test.d.ts.map +0 -1
  40. package/build/types/prompts/promptFoundryUrl.test.d.ts +0 -1
  41. package/build/types/prompts/promptFoundryUrl.test.d.ts.map +0 -1
  42. package/build/types/prompts/promptOntologyAndOsdkPackageAndOsdkRegistryUrl.test.d.ts +0 -1
  43. package/build/types/prompts/promptOntologyAndOsdkPackageAndOsdkRegistryUrl.test.d.ts.map +0 -1
  44. package/build/types/prompts/promptOverwrite.test.d.ts +0 -1
  45. package/build/types/prompts/promptOverwrite.test.d.ts.map +0 -1
  46. package/build/types/prompts/promptProject.test.d.ts +0 -1
  47. package/build/types/prompts/promptProject.test.d.ts.map +0 -1
  48. package/build/types/prompts/promptScopes.test.d.ts +0 -1
  49. package/build/types/prompts/promptScopes.test.d.ts.map +0 -1
  50. package/build/types/prompts/promptTemplate.test.d.ts +0 -1
  51. package/build/types/prompts/promptTemplate.test.d.ts.map +0 -1
@@ -1,1094 +0,0 @@
1
- // ../create-app.template.tutorial-todo-aip-app.beta/build/esm/generatedNoCheck/index.js
2
- var files = /* @__PURE__ */ new Map([["README.md.hbs", {
3
- type: "raw",
4
- body: `# {{project}}
5
-
6
- This 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.
7
-
8
- ## Developing
9
-
10
- Run the following command or equivalent with your preferred package manager to start a local development server on \`http://localhost:8080\`:
11
-
12
- \`\`\`sh
13
- npm run dev
14
- \`\`\`
15
-
16
- Development configuration is stored in \`.env.development\`.
17
-
18
- {{#if corsProxy}}
19
- In 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.
20
- {{else}}
21
- In 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.
22
- {{/if}}
23
-
24
- ## Deploying
25
-
26
- Run the following command or equivalent with your preferred package manager to create a production build of your application:
27
-
28
- \`\`\`sh
29
- npm run build
30
- \`\`\`
31
-
32
- Production configuration is stored in \`.env.production\`.
33
-
34
- If 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\`.
35
-
36
- In 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.
37
-
38
- A \`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.
39
- `
40
- }], [".gitignore", {
41
- type: "raw",
42
- body: `# Logs
43
- logs
44
- *.log
45
- npm-debug.log*
46
- yarn-debug.log*
47
- yarn-error.log*
48
- pnpm-debug.log*
49
- lerna-debug.log*
50
-
51
- node_modules
52
- dist
53
- dist-ssr
54
- *.local
55
-
56
- # Editor directories and files
57
- .vscode/*
58
- !.vscode/extensions.json
59
- .idea
60
- .DS_Store
61
- *.suo
62
- *.ntvs*
63
- *.njsproj
64
- *.sln
65
- *.sw?
66
- `
67
- }], ["eslint.config.mjs", {
68
- "type": "base64",
69
- "body": "Ly8gQHRzLWNoZWNrCmltcG9ydCBlc2xpbnQgZnJvbSAiQGVzbGludC9qcyI7CmltcG9ydCB0c1BhcnNlciBmcm9tICJAdHlwZXNjcmlwdC1lc2xpbnQvcGFyc2VyIjsKaW1wb3J0ICogYXMgaW1wb3J0UGx1Z2luIGZyb20gImVzbGludC1wbHVnaW4taW1wb3J0IjsKaW1wb3J0IGpzeEExMXlQbHVnaW4gZnJvbSAiZXNsaW50LXBsdWdpbi1qc3gtYTExeSI7CmltcG9ydCByZWFjdFBsdWdpbiBmcm9tICJlc2xpbnQtcGx1Z2luLXJlYWN0IjsKaW1wb3J0IHJlYWN0SG9va3NQbHVnaW4gZnJvbSAiZXNsaW50LXBsdWdpbi1yZWFjdC1ob29rcyI7CmltcG9ydCByZWFjdFJlZnJlc2ggZnJvbSAiZXNsaW50LXBsdWdpbi1yZWFjdC1yZWZyZXNoIjsKaW1wb3J0IGdsb2JhbHMgZnJvbSAiZ2xvYmFscyI7CmltcG9ydCB0c2VzbGludCBmcm9tICJ0eXBlc2NyaXB0LWVzbGludCI7CgpleHBvcnQgZGVmYXVsdCB0c2VzbGludC5jb25maWcoewogIGZpbGVzOiBbImVzbGludC5jb25maWcubWpzIiwgInNyYy8qKi8qLntqcyxtanMsY2pzLHRzLGpzeCx0c3h9Il0sCiAgc2V0dGluZ3M6IHsKICAgIHJlYWN0OiB7CiAgICAgIHZlcnNpb246ICJkZXRlY3QiLAogICAgfSwKCiAgICAiaW1wb3J0L3Jlc29sdmVyIjogewogICAgICBub2RlOiB7CiAgICAgICAgZXh0ZW5zaW9uczogWyIuanMiLCAiLmpzeCIsICIudHMiLCAiLnRzeCJdLAogICAgICB9LAogICAgfSwKICB9LAogIGxhbmd1YWdlT3B0aW9uczogewogICAgZ2xvYmFsczogewogICAgICAuLi5nbG9iYWxzLmJyb3dzZXIsCiAgICB9LAoKICAgIHBhcnNlcjogdHNQYXJzZXIsCiAgfSwKICBleHRlbmRzOiBbCiAgICBlc2xpbnQuY29uZmlncy5yZWNvbW1lbmRlZCwKICAgIC4uLnRzZXNsaW50LmNvbmZpZ3MucmVjb21tZW5kZWQsCiAgXSwKICBwbHVnaW5zOiB7CiAgICAicmVhY3QiOiAvKiogQHR5cGUgaW1wb3J0KCJlc2xpbnQiKS5FU0xpbnQuUGx1Z2luICovIChyZWFjdFBsdWdpbiksCiAgICAicmVhY3QtcmVmcmVzaCI6IHJlYWN0UmVmcmVzaCwKICAgICJyZWFjdC1ob29rcyI6CiAgICAgIC8qKiBAdHlwZSBpbXBvcnQoImVzbGludCIpLkVTTGludC5QbHVnaW4gKi8gKHJlYWN0SG9va3NQbHVnaW4pLAogICAgImpzeC1hMTF5IjoganN4QTExeVBsdWdpbiwKICAgICJpbXBvcnQiOiBpbXBvcnRQbHVnaW4sCiAgfSwKICBydWxlczogewogICAgLi4uKAogICAgICAvKiogQHR5cGUgaW1wb3J0KCJlc2xpbnQiKS5MaW50ZXIuUnVsZXNSZWNvcmQgKi8KICAgICAgKHJlYWN0UGx1Z2luLmNvbmZpZ3MuZmxhdD8ucmVjb21tZW5kZWQucnVsZXMpCiAgICApLAogICAgInJlYWN0LWhvb2tzL3J1bGVzLW9mLWhvb2tzIjogImVycm9yIiwKICAgICJyZWFjdC1ob29rcy9leGhhdXN0aXZlLWRlcHMiOiAid2FybiIsCiAgICAuLi5qc3hBMTF5UGx1Z2luLmNvbmZpZ3MucmVjb21tZW5kZWQucnVsZXMsCiAgICAicmVhY3QtcmVmcmVzaC9vbmx5LWV4cG9ydC1jb21wb25lbnRzIjogWyJ3YXJuIiwgewogICAgICBhbGxvd0NvbnN0YW50RXhwb3J0OiB0cnVlLAogICAgfV0sCgogICAgImltcG9ydC9uYW1lZCI6ICJlcnJvciIsCiAgICAiaW1wb3J0L2RlZmF1bHQiOiAiZXJyb3IiLAogICAgImltcG9ydC9uYW1lc3BhY2UiOiAiZXJyb3IiLAogICAgImltcG9ydC9uby1kdXBsaWNhdGVzIjogImVycm9yIiwKICAgICJpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXMiOiAiZXJyb3IiLAoKICAgICJyZWFjdC9yZWFjdC1pbi1qc3gtc2NvcGUiOiAib2ZmIiwKICB9LAp9KTsK"
70
- }], ["index.html", {
71
- type: "raw",
72
- body: `<!doctype html>
73
- <html lang="en">
74
- <head>
75
- <meta charset="UTF-8" />
76
- <link rel="icon" type="image/svg+xml" href="/todo-aip-app.svg" />
77
- <meta name="viewport" content="width=device-width, initial-scale=1.0" />
78
- <meta name="osdk-clientId" content="%VITE_FOUNDRY_CLIENT_ID%" />
79
- <meta name="osdk-redirectUrl" content="%VITE_FOUNDRY_REDIRECT_URL%" />
80
- <meta name="osdk-foundryUrl" content="%VITE_FOUNDRY_API_URL%" />
81
- <meta name="osdk-ontologyRid" content="%VITE_FOUNDRY_ONTOLOGY_RID%" />
82
- <title>Ontology SDK Tutorial - To do AIP App</title>
83
- </head>
84
- <body>
85
- <div id="root-container">
86
- <div id="root"></div>
87
- </div>
88
- <script type="module" src="/src/main.tsx"></script>
89
- </body>
90
- </html>
91
- `
92
- }], ["package.json.hbs", {
93
- type: "raw",
94
- body: `{
95
- "name": "{{project}}",
96
- "private": true,
97
- "version": "0.0.0",
98
- "type": "module",
99
- "scripts": {
100
- "dev": "vite",
101
- "build": "tsc && vite build",
102
- "lint": "eslint . --report-unused-disable-directives --max-warnings 0",
103
- "test": "vitest run",
104
- "preview": "vite preview"
105
- },
106
- "dependencies": {
107
- "{{osdkPackage}}": "latest",
108
- "@osdk/client": "{{clientVersion}}",
109
- "@osdk/oauth": "^1.1.0",
110
- "@osdk/react": "^0.3.0",
111
- "react": "^18",
112
- "react-dom": "^18",
113
- "react-router-dom": "^6.30.1",
114
- "swr": "^2.3.6"
115
- },
116
- "devDependencies": {
117
- "@eslint/js": "^9.35.0",
118
- "@types/react": "^18",
119
- "@types/react-dom": "^18",
120
- "@typescript-eslint/eslint-plugin": "^8.43.0",
121
- "@typescript-eslint/parser": "^8.43.0",
122
- "@vitejs/plugin-react": "^4.7.0",
123
- "eslint": "^9.35.0",
124
- "eslint-plugin-import": "^2.32.0",
125
- "eslint-plugin-jsx-a11y": "^6.10.2",
126
- "eslint-plugin-react": "^7.37.5",
127
- "eslint-plugin-react-hooks": "^5.2.0",
128
- "eslint-plugin-react-refresh": "^0.4.20",
129
- "globals": "^15.15.0",
130
- "typescript": "~5.5.4",
131
- "typescript-eslint": "^8.43.0",
132
- "vite": "^6.3.6",
133
- "vitest": "^3.2.4"
134
- }
135
- }`
136
- }], ["public/aip-icon.svg", {
137
- "type": "base64",
138
- "body": "PHN2ZyB3aWR0aD0iMTYiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAxNiAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik03Ljk5OTQ5IDFIMi4wNjE4NkMwLjQ3NzI5NCAxIC0wLjUxMzI3NiAyLjY2NjI0IDAuMjc4NTY1IDMuOTk5NjhMMi42NTQwOSA4TDAuMjc4NTY1IDEyLjAwMDNDLTAuNTEzMjc2IDEzLjMzMzggMC40NzcyOTUgMTUgMi4wNjE4NiAxNUgxMy45MzgxQzE1LjUyMjcgMTUgMTYuNTEzMyAxMy4zMzM4IDE1LjcyMTQgMTIuMDAwM0wxMy4zNDU5IDhMMTUuNzIxNCAzLjk5OTY4QzE2LjUxMzMgMi42NjYyNCAxNS41MjI3IDEgMTMuOTM4MSAxSDguMDAwNTFINy45OTk0OVpNNi4yMTcwNCAyLjAwMDA4SDIuMDYxODZDMS4yNjk1NyAyLjAwMDA4IDAuNzc0Mjg5IDIuODMzMiAxLjE3MDIxIDMuNDk5OTJMMy4yNDgzIDYuOTk5MzdMNi4yMTcwNCAyLjAwMDA4Wk0zLjI0ODMgOS4wMDA2M0wxLjE3MDIxIDEyLjUwMDFDMC43NzQyOSAxMy4xNjY4IDEuMjY5NTcgMTMuOTk5OSAyLjA2MTg2IDEzLjk5OTlINi4yMTcwNEwzLjI0ODMgOS4wMDA2M1pNOS43ODI5NiAxMy45OTk5SDEzLjkzODFDMTQuNzMwNCAxMy45OTk5IDE1LjIyNTcgMTMuMTY2OCAxNC44Mjk4IDEyLjUwMDFMMTIuNzUxNyA5LjAwMDYzTDkuNzgyOTYgMTMuOTk5OVpNMTIuMTU3NSA4TDguODkxNjQgMTMuNDk5NkM4LjQ5NTUgMTQuMTY2NyA3LjUwNDUgMTQuMTY2NyA3LjEwODM2IDEzLjQ5OTZMMy44NDI1MSA4TDcuMTA4MzYgMi41MDA0QzcuNTA0NSAxLjgzMzMxIDguNDk1NTEgMS44MzMzMSA4Ljg5MTY1IDIuNTAwNEwxMi4xNTc1IDhaTTEyLjc1MTcgNi45OTkzNkwxNC44Mjk4IDMuNDk5OTJDMTUuMjI1NyAyLjgzMzIgMTQuNzMwNCAyLjAwMDA4IDEzLjkzODEgMi4wMDAwOEg5Ljc4Mjk2TDEyLjc1MTcgNi45OTkzNloiIGZpbGw9IndoaXRlIi8+Cjwvc3ZnPgo="
139
- }], ["public/todo-aip-app.svg", {
140
- "type": "base64",
141
- "body": "PHN2ZyB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIHZpZXdCb3g9IjAgMCA1MCA1MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPGcgY2xpcC1wYXRoPSJ1cmwoI2NsaXAwXzM1NzJfNjIxOTUpIj4KPHJlY3Qgb3BhY2l0eT0iMC4xIiB3aWR0aD0iNTAiIGhlaWdodD0iNTAiIGZpbGw9IiM5ODgxRjMiLz4KPHJlY3QgeD0iNyIgeT0iMTEiIHdpZHRoPSIxMiIgaGVpZ2h0PSIxMiIgcng9IjIiIGZpbGw9IiM3OTYxREIiLz4KPHJlY3QgeD0iNy41IiB5PSIxMS41IiB3aWR0aD0iMTEiIGhlaWdodD0iMTEiIHJ4PSIxLjUiIHN0cm9rZT0id2hpdGUiIHN0cm9rZS1vcGFjaXR5PSIwLjEiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNiAxNC4zNzVDMTUuNzkgMTQuMzc1IDE1LjYwMjUgMTQuNDU3NSAxNS40Njc1IDE0LjU5MjVMMTIuMjUgMTcuODE3NUwxMC41MzI1IDE2LjA5MjVDMTAuMzk3NSAxNS45NTc1IDEwLjIxIDE1Ljg3NSAxMCAxNS44NzVDOS41ODc1IDE1Ljg3NSA5LjI1IDE2LjIxMjUgOS4yNSAxNi42MjVDOS4yNSAxNi44MzUgOS4zMzI1IDE3LjAyMjUgOS40Njc1IDE3LjE1NzVMMTEuNzE3NSAxOS40MDc1QzExLjg1MjUgMTkuNTQyNSAxMi4wNCAxOS42MjUgMTIuMjUgMTkuNjI1QzEyLjQ2IDE5LjYyNSAxMi42NDc1IDE5LjU0MjUgMTIuNzgyNSAxOS40MDc1TDE2LjUzMjUgMTUuNjU3NUMxNi42Njc1IDE1LjUyMjUgMTYuNzUgMTUuMzM1IDE2Ljc1IDE1LjEyNUMxNi43NSAxNC43MTI1IDE2LjQxMjUgMTQuMzc1IDE2IDE0LjM3NVoiIGZpbGw9IndoaXRlIi8+CjxyZWN0IG9wYWNpdHk9IjAuNSIgeD0iMjIiIHk9IjE1IiB3aWR0aD0iMTIiIGhlaWdodD0iNSIgcng9IjIuNSIgZmlsbD0iIzYzNERCRiIvPgo8cmVjdCBvcGFjaXR5PSIwLjUiIHg9IjM2IiB5PSIxNSIgd2lkdGg9IjkiIGhlaWdodD0iNSIgcng9IjIuNSIgZmlsbD0iIzYzNERCRiIvPgo8cmVjdCB4PSI3LjUiIHk9IjI4LjUiIHdpZHRoPSIxMSIgaGVpZ2h0PSIxMSIgcng9IjEuNSIgZmlsbD0iI0E3OUJEQSIgZmlsbC1vcGFjaXR5PSIwLjEiLz4KPHJlY3QgeD0iNy41IiB5PSIyOC41IiB3aWR0aD0iMTEiIGhlaWdodD0iMTEiIHJ4PSIxLjUiIHN0cm9rZT0iI0EzOUNDMSIvPgo8cmVjdCBvcGFjaXR5PSIwLjUiIHg9IjIzIiB5PSIzMiIgd2lkdGg9IjYiIGhlaWdodD0iNSIgcng9IjIuNSIgZmlsbD0iIzYzNERCRiIvPgo8cGF0aCBvcGFjaXR5PSIwLjUiIGQ9Ik0zMSAzNC41QzMxIDMzLjExOTMgMzIuMzIyOCAzMiAzMy45NTQ1IDMySDQxLjA0NTVDNDIuNjc3MiAzMiA0NCAzMy4xMTkzIDQ0IDM0LjVDNDQgMzUuODgwNyA0Mi42NzcyIDM3IDQxLjA0NTUgMzdIMzMuOTU0NUMzMi4zMjI4IDM3IDMxIDM1Ljg4MDcgMzEgMzQuNVoiIGZpbGw9IiM2MzREQkYiLz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF8zNTcyXzYyMTk1Ij4KPHJlY3Qgd2lkdGg9IjUwIiBoZWlnaHQ9IjUwIiByeD0iNCIgZmlsbD0id2hpdGUiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K"
142
- }], ["src/AuthCallback.tsx", {
143
- type: "raw",
144
- body: `import { useEffect, useState } from "react";
145
- import { useNavigate } from "react-router-dom";
146
- import { auth } from "./client";
147
-
148
- /**
149
- * Component to render at \`/auth/callback\`
150
- * This calls signIn() again to save the token, and then navigates the user back to the home page.
151
- */
152
- function AuthCallback() {
153
- const [error, setError] = useState<string | undefined>(undefined);
154
- const navigate = useNavigate();
155
-
156
- // This effect conflicts with React 18 strict mode in development
157
- // https://react.dev/learn/synchronizing-with-effects#how-to-handle-the-effect-firing-twice-in-development
158
- useEffect(() => {
159
- auth
160
- .signIn()
161
- .then(() => navigate("/", { replace: true }))
162
- .catch((e: unknown) => setError((e as Error).message ?? e));
163
- }, [navigate]);
164
- return <div>{error != null ? error : "Authenticating\u2026"}</div>;
165
- }
166
-
167
- export default AuthCallback;
168
- `
169
- }], ["src/CreateProjectButton.module.css", {
170
- "type": "base64",
171
- "body": "LmJ1dHRvbiB7CiAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKfQo="
172
- }], ["src/CreateProjectButton.tsx", {
173
- type: "raw",
174
- body: `import { useCallback, useState } from "react";
175
- import css from "./CreateProjectButton.module.css";
176
- import CreateProjectDialog from "./CreateProjectDialog";
177
- import useProjects from "./useProjects";
178
-
179
- interface CreateProjectButtonProps {
180
- onProjectCreated?: (projectId: string) => void;
181
- }
182
-
183
- function CreateProjectButton({ onProjectCreated }: CreateProjectButtonProps) {
184
- const { isLoading: isLoadingProjects, isError: isErrorProjects } =
185
- useProjects();
186
-
187
- const [isOpen, setIsOpen] = useState(false);
188
- const handleOpen = useCallback(() => setIsOpen(true), []);
189
- const handleClose = useCallback(() => setIsOpen(false), []);
190
-
191
- if (isLoadingProjects || isErrorProjects) {
192
- return null;
193
- }
194
-
195
- return (
196
- <>
197
- <button onClick={handleOpen} className={css.button}>
198
- Create Project
199
- </button>
200
- <CreateProjectDialog
201
- isOpen={isOpen}
202
- onClose={handleClose}
203
- onProjectCreated={onProjectCreated}
204
- />
205
- </>
206
- );
207
- }
208
-
209
- export default CreateProjectButton;
210
- `
211
- }], ["src/CreateProjectDialog.module.css", {
212
- "type": "base64",
213
- "body": "LnByb2plY3QgewogICAgZGlzcGxheTogZmxleDsKICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgZ2FwOiAxMHB4Owp9Ci5sYWJlbCB7CiAgZGlzcGxheTogZmxleDsKICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgZ2FwOiA1cHg7Cn0KCi5idXR0b24gewogIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7Cn0K"
214
- }], ["src/CreateProjectDialog.tsx", {
215
- type: "raw",
216
- body: `import type { ChangeEvent } from "react";
217
- import { useCallback, useEffect, useState } from "react";
218
- import css from "./CreateProjectDialog.module.css";
219
-
220
- import Dialog from "./Dialog";
221
- import useProjects from "./useProjects";
222
-
223
- interface CreateProjectDialogProps {
224
- isOpen: boolean;
225
- onClose: () => void;
226
- onProjectCreated?: (projectId: string) => void;
227
- }
228
-
229
- function CreateProjectDialog({
230
- isOpen,
231
- onClose,
232
- onProjectCreated,
233
- }: CreateProjectDialogProps) {
234
- const { createProject } = useProjects();
235
-
236
- const [name, setName] = useState<string>("New project");
237
-
238
- const handleChangeProjectName = useCallback(
239
- (e: ChangeEvent<HTMLInputElement>) => setName(e.target.value),
240
- [],
241
- );
242
-
243
- useEffect(() => setName("New project"), [isOpen]);
244
-
245
- const [isCreating, setIsCreating] = useState(false);
246
-
247
- const handleSubmit = useCallback(async () => {
248
- setIsCreating(true);
249
- try {
250
- const projectId = await createProject(name);
251
- onProjectCreated?.(projectId);
252
- } finally {
253
- setIsCreating(false);
254
- onClose();
255
- }
256
- }, [onProjectCreated, onClose, createProject, name]);
257
-
258
- return (
259
- <Dialog
260
- isOpen={isOpen}
261
- buttons={[
262
- <button
263
- disabled={isCreating}
264
- onClick={onClose}
265
- key="cancel"
266
- className={css.button}
267
- >
268
- Cancel
269
- </button>,
270
- <button
271
- disabled={isCreating}
272
- onClick={handleSubmit}
273
- key="create"
274
- className={css.button}
275
- >
276
- Create project
277
- </button>,
278
- ]}
279
- >
280
- <div className={css.project}>
281
- <label className={css.label}>
282
- Project name:{" "}
283
- <input type="text" value={name} onChange={handleChangeProjectName} />
284
- </label>
285
- </div>
286
- </Dialog>
287
- );
288
- }
289
- export default CreateProjectDialog;
290
- `
291
- }], ["src/CreateTaskButton.module.css", {
292
- "type": "base64",
293
- "body": "LmJ1dHRvbiB7CiAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKfQo="
294
- }], ["src/CreateTaskButton.tsx", {
295
- type: "raw",
296
- body: `import { useCallback, useState } from "react";
297
- import css from "./CreateTaskButton.module.css";
298
- import CreateTaskDialog from "./CreateTaskDialog";
299
- import { IProject } from "./useProjects";
300
- import { useProjectTasks } from "./useProjectTasks";
301
-
302
- interface CreateTaskButtonProps {
303
- project: IProject;
304
- onTaskCreated: (taskId: string) => void;
305
- }
306
-
307
- function CreateTaskButton({ project, onTaskCreated }: CreateTaskButtonProps) {
308
- const { isLoading: isLoadingTasks, isError: isErrorTasks } = useProjectTasks(
309
- project,
310
- );
311
-
312
- const [isOpen, setIsOpen] = useState(false);
313
- const handleOpen = useCallback(() => setIsOpen(true), []);
314
- const handleClose = useCallback(() => setIsOpen(false), []);
315
-
316
- if (isLoadingTasks || isErrorTasks) {
317
- return null;
318
- }
319
-
320
- return (
321
- <>
322
- <button onClick={handleOpen} className={css.button}>Create Task</button>
323
- <CreateTaskDialog
324
- project={project}
325
- isOpen={isOpen}
326
- onClose={handleClose}
327
- onTaskCreated={onTaskCreated}
328
- />
329
- </>
330
- );
331
- }
332
-
333
- export default CreateTaskButton;
334
- `
335
- }], ["src/CreateTaskDialog.module.css", {
336
- "type": "base64",
337
- "body": "LnRhc2sgewogICAgZGlzcGxheTogZ3JpZDsKICAgIGdyaWQtdGVtcGxhdGUtY29sdW1uczogMWZyIDFmcjsKICAgIGdyaWQtdGVtcGxhdGUtcm93czogYXV0byBtaW4tY29udGVudDsKICAgIGdhcDogMTBweDsKICAgIHdpZHRoOiA1MDBweDsKfQoubGFiZWwgewogIGRpc3BsYXk6IGZsZXg7CiAgZ2FwOiA1cHg7CiAgcmVzaXplOiBub25lOwp9CgouaW5wdXQgewogIHdpZHRoOiAzMDBweDsKICBib3JkZXI6IDFweCBzb2xpZCBncmF5OwogIGJvcmRlci1yYWRpdXM6IDVweDsKfQoKLnRleHRBcmVhIHsKICB3aWR0aDogMzAwcHg7CiAgcmVzaXplOiB2ZXJ0aWNhbDsKICBib3JkZXI6IDFweCBzb2xpZCBncmF5OwogIGJvcmRlci1yYWRpdXM6IDVweDsKICBwYWRkaW5nOiA1cHg7Cn0KCi5haXAgewogIGJhY2tncm91bmQtY29sb3I6ICM3OTYxREI7CiAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICBwYWRkaW5nOiAycHggNXB4OwogIGRpc3BsYXk6IGZsZXg7CiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKfQoKLnByb2Nlc3NpbmcgewogIGN1cnNvcjogcHJvZ3Jlc3M7Cn0KCi5pbWFnZSB7CiAgd2lkdGg6IDE2cHg7CiAgaGVpZ2h0OiAxNnB4Owp9CgouY29udGFpbmVyIHsKICBkaXNwbGF5OiBmbGV4OwogIGFsaWduLWl0ZW1zOmZsZXgtc3RhcnQ7CiAgZ2FwOiA1cHg7Cn0KCi5kaWFsb2dDb250YWluZXIgewogIHBvc2l0aW9uOiBmaXhlZDsKICB0b3A6IDA7CiAgcmlnaHQ6IDA7CiAgYm90dG9tOiAwOwogIGxlZnQ6IDA7CiAgZGlzcGxheTogZmxleDsKICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41KTsgLyogT3B0aW9uYWw6IGZvciBkaW1tZWQgYmFja2dyb3VuZCAqLwp9CgouYnV0dG9uIHsKICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwp9Cg=="
338
- }], ["src/CreateTaskDialog.tsx", {
339
- type: "raw",
340
- body: `import aipLogo from "/aip-icon.svg";
341
- import type { ChangeEvent } from "react";
342
- import { useCallback, useEffect, useRef, useState } from "react";
343
- import css from "./CreateTaskDialog.module.css";
344
- import Dialog from "./Dialog";
345
- import { IProject } from "./useProjects";
346
- import { useProjectTasks } from "./useProjectTasks";
347
-
348
- interface CreateTaskDialogProps {
349
- project: IProject;
350
- isOpen: boolean;
351
- onClose: () => void;
352
- onTaskCreated: (taskId: string) => void;
353
- }
354
-
355
- function CreateTaskDialog(
356
- { project, isOpen, onClose, onTaskCreated }: CreateTaskDialogProps,
357
- ) {
358
- const { createTask, getRecommendedTaskDescription } = useProjectTasks(
359
- project,
360
- );
361
-
362
- const [name, setName] = useState<string>("New task");
363
- const [description, setDescription] = useState<string>("");
364
- const [isProcessing, setIsProcessing] = useState<boolean>(false);
365
- const [isCreating, setIsCreating] = useState(false);
366
- const textAreaRef = useRef<HTMLTextAreaElement>(null);
367
-
368
- const handleChangeTaskName = useCallback(
369
- (e: ChangeEvent<HTMLInputElement>) => setName(e.target.value),
370
- [],
371
- );
372
-
373
- const handleChangeTaskDescription = useCallback(
374
- (e: ChangeEvent<HTMLTextAreaElement>) => setDescription(e.target.value),
375
- [],
376
- );
377
-
378
- const handleTaskDescriptionRecommendation = useCallback(async () => {
379
- setIsProcessing(true);
380
- const recommendedDescription = await getRecommendedTaskDescription(name);
381
- setDescription(recommendedDescription);
382
- setIsProcessing(false);
383
- }, [getRecommendedTaskDescription, name]);
384
-
385
- useEffect(() => {
386
- setName("New task");
387
- setDescription("");
388
- }, [isOpen]);
389
- useEffect(() => {
390
- if (textAreaRef.current) {
391
- const textArea = textAreaRef.current;
392
- textArea.style.height = "auto";
393
- textArea.style.height = \`\${textArea.scrollHeight}px\`;
394
- }
395
- }, [description]);
396
-
397
- const handleSubmit = useCallback(async () => {
398
- setIsCreating(true);
399
- try {
400
- const taskId = await createTask(name, description);
401
- if (taskId != null) {
402
- onTaskCreated(taskId);
403
- }
404
- } finally {
405
- setIsCreating(false);
406
- onClose();
407
- }
408
- }, [onClose, createTask, onTaskCreated, name, description]);
409
-
410
- return (
411
- <>
412
- {isOpen && (
413
- <div className={css.dialogContainer}>
414
- <Dialog
415
- isOpen={isOpen}
416
- buttons={[
417
- <button
418
- disabled={isCreating}
419
- onClick={onClose}
420
- key="cancel"
421
- className={css.button}
422
- >
423
- Cancel
424
- </button>,
425
- <button
426
- disabled={isCreating}
427
- onClick={handleSubmit}
428
- key="create"
429
- className={css.button}
430
- >
431
- Create task
432
- </button>,
433
- ]}
434
- >
435
- <div className={css.task}>
436
- <label className={css.label}>
437
- Task name:{" "}
438
- </label>
439
- <input
440
- type="text"
441
- value={name}
442
- onChange={handleChangeTaskName}
443
- className={css.input}
444
- />
445
-
446
- <label className={css.label}>
447
- Task description:{" "}
448
- </label>
449
- <div className={css.container}>
450
- <textarea
451
- ref={textAreaRef}
452
- value={description}
453
- onChange={handleChangeTaskDescription}
454
- className={css.textArea}
455
- rows={2}
456
- />
457
- <button
458
- disabled={isProcessing}
459
- className={\`\${css.aip} \${isProcessing ? css.processing : ""}\`}
460
- title="Click here to get AIP task description recommendation"
461
- type="button"
462
- onClick={handleTaskDescriptionRecommendation}
463
- >
464
- <img
465
- src={aipLogo}
466
- alt="AIP"
467
- className={css.image}
468
- />
469
- </button>
470
- </div>
471
- </div>
472
- </Dialog>
473
- </div>
474
- )}
475
- </>
476
- );
477
- }
478
-
479
- export default CreateTaskDialog;
480
- `
481
- }], ["src/DeleteProjectButton.module.css", {
482
- "type": "base64",
483
- "body": "LmJ1dHRvbiB7CiAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKfQo="
484
- }], ["src/DeleteProjectButton.tsx", {
485
- type: "raw",
486
- body: `import { useCallback, useState } from "react";
487
- import css from "./DeleteProjectButton.module.css";
488
- import DeleteProjectDialog from "./DeleteProjectDialog";
489
- import useProjects, { IProject } from "./useProjects";
490
-
491
- interface DeleteProjectButtonProps {
492
- project: IProject;
493
- }
494
-
495
- function DeleteProjectButton({ project }: DeleteProjectButtonProps) {
496
- const { isLoading: isLoadingProjects, isError: isErrorProjects } =
497
- useProjects();
498
-
499
- const [isOpen, setIsOpen] = useState(false);
500
- const handleOpen = useCallback(() => setIsOpen(true), []);
501
- const handleClose = useCallback(() => setIsOpen(false), []);
502
-
503
- if (isLoadingProjects || isErrorProjects) {
504
- return null;
505
- }
506
-
507
- return (
508
- <>
509
- <button onClick={handleOpen} className={css.button}>
510
- Delete Project
511
- </button>
512
- <DeleteProjectDialog
513
- project={project}
514
- isOpen={isOpen}
515
- onClose={handleClose}
516
- />
517
- </>
518
- );
519
- }
520
-
521
- export default DeleteProjectButton;
522
- `
523
- }], ["src/DeleteProjectDialog.module.css", {
524
- "type": "base64",
525
- "body": "LmJ1dHRvbiB7CiAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKfQo="
526
- }], ["src/DeleteProjectDialog.tsx", {
527
- type: "raw",
528
- body: `import { useCallback, useState } from "react";
529
- import css from "./DeleteProjectDialog.module.css";
530
- import Dialog from "./Dialog";
531
- import useProjects, { IProject } from "./useProjects";
532
-
533
- interface DeleteProjectDialogProps {
534
- project: IProject;
535
- isOpen: boolean;
536
- onClose: () => void;
537
- }
538
-
539
- function DeleteProjectDialog({
540
- project,
541
- isOpen,
542
- onClose,
543
- }: DeleteProjectDialogProps) {
544
- const { deleteProject } = useProjects();
545
-
546
- const [isDeleting, setIsDeleting] = useState(false);
547
- const handleSubmit = useCallback(async () => {
548
- setIsDeleting(true);
549
- try {
550
- await deleteProject(project);
551
- } finally {
552
- setIsDeleting(false);
553
- onClose();
554
- }
555
- }, [deleteProject, onClose, project]);
556
-
557
- return (
558
- <Dialog
559
- isOpen={isOpen}
560
- buttons={[
561
- <button
562
- disabled={isDeleting}
563
- onClick={onClose}
564
- key="cancel"
565
- className={css.button}
566
- >
567
- Cancel
568
- </button>,
569
- <button
570
- disabled={isDeleting}
571
- onClick={handleSubmit}
572
- key="delete"
573
- className={css.button}
574
- >
575
- Delete
576
- </button>,
577
- ]}
578
- >
579
- Are you sure you want to delete this project?
580
- </Dialog>
581
- );
582
- }
583
- export default DeleteProjectDialog;
584
- `
585
- }], ["src/Dialog.module.css", {
586
- "type": "base64",
587
- "body": "LmJ1dHRvbnMgewogIGRpc3BsYXk6IGZsZXg7CiAgZ2FwOiAxZW07CiAgbWFyZ2luLXRvcDogMWVtOwogIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7Cn0KCi5kaWFsb2cgewogIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOwogIGJvcmRlci1yYWRpdXM6IDEwcHg7Cn0K"
588
- }], ["src/Dialog.tsx", {
589
- type: "raw",
590
- body: `import { PropsWithChildren } from "react";
591
- import css from "./Dialog.module.css";
592
-
593
- interface DialogProps {
594
- isOpen: boolean;
595
- buttons?: React.ReactElement[];
596
- }
597
-
598
- function Dialog({ children, isOpen, buttons }: PropsWithChildren<DialogProps>) {
599
- return (
600
- <dialog open={isOpen} className={css.dialog}>
601
- {children}
602
- {buttons != null && buttons.length > 0 && (
603
- <div className={css.buttons}>{buttons}</div>
604
- )}
605
- </dialog>
606
- );
607
- }
608
- export default Dialog;
609
- `
610
- }], ["src/Home.module.css", {
611
- "type": "base64",
612
- "body": "LnR1dG9yaWFsQmFubmVyV3JhcHBlciB7CiAgZGlzcGxheTogZmxleDsKICBtYXJnaW46IDJlbTsKfQoKLnR1dG9yaWFsQmFubmVyIHsKICBmbGV4OiAxOwogIHdpZHRoOiAwOwogIGJhY2tncm91bmQ6IHJnYmEoMTIxLCA5NywgMjE5LCAwLjcpOwogIGNvbG9yOiAjZmZmZmZmOwogIGJvcmRlci1yYWRpdXM6IDFlbTsKICBwYWRkaW5nOiAxZW07CiAgYm94LXNoYWRvdzogMCAxMHB4IDE1cHggLTNweCByZ2IoMCAwIDAgLyAwLjEpLCAwIDRweCA2cHggLTRweCByZ2IoMCAwIDAgLyAwLjEpOwp9CgoudHV0b3JpYWxCYW5uZXJUaXRsZSB7CiAgbWFyZ2luLXRvcDogMDsKICBmb250LXdlaWdodDogNjAwOwp9CgoucHJvamVjdFNlbGVjdCB7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIGdhcDogMWVtOwogIG1hcmdpbjogMmVtOwogIGZvbnQtd2VpZ2h0OiA2MDA7Cn0KCg=="
613
- }], ["src/Home.tsx", {
614
- type: "raw",
615
- body: `import { useCallback, useEffect, useState } from "react";
616
- import CreateProjectButton from "./CreateProjectButton";
617
- import DeleteProjectButton from "./DeleteProjectButton";
618
- import css from "./Home.module.css";
619
- import Layout from "./Layout";
620
- import { ProjectDetails } from "./ProjectDetails";
621
- import ProjectSelect from "./ProjectSelect";
622
- import useProjects, { IProject } from "./useProjects";
623
-
624
- function Home() {
625
- const [projectId, setProjectId] = useState<string | undefined>(undefined);
626
- const { projects } = useProjects();
627
-
628
- const project = projects?.find((p) => p.id === projectId);
629
-
630
- const handleSelectProject = useCallback(
631
- (p: IProject) => setProjectId(p.id),
632
- [],
633
- );
634
-
635
- useEffect(() => {
636
- if (project == null && projects != null && projects.length > 0) {
637
- setProjectId(projects[0].id);
638
- }
639
- }, [project, projects]);
640
-
641
- const handleOnProjectCreated = useCallback(
642
- (projectId: string | undefined) => {
643
- setProjectId(projectId);
644
- },
645
- [],
646
- );
647
-
648
- return (
649
- <Layout>
650
- <div className={css.tutorialBannerWrapper}>
651
- <div className={css.tutorialBanner}>
652
- <p className={css.tutorialBannerTitle}>
653
- \u{1F4A1} Welcome to the To Do AIP App tutorial!
654
- </p>
655
- <p>
656
- The application is implemented with mock in memory data.
657
- <br />Can you solve how to change it to use the Ontology SDK
658
- instead?
659
- </p>
660
- </div>
661
- </div>
662
- <div className={css.projectSelect}>
663
- <span>Project:</span>
664
- <ProjectSelect
665
- project={project}
666
- projects={projects ?? []}
667
- onSelectProject={handleSelectProject}
668
- />
669
- <CreateProjectButton onProjectCreated={handleOnProjectCreated} />
670
- {project != null && <DeleteProjectButton project={project} />}
671
- </div>
672
- {project != null && <ProjectDetails project={project} />}
673
- </Layout>
674
- );
675
- }
676
-
677
- export default Home;
678
- `
679
- }], ["src/Layout.module.css", {
680
- "type": "base64",
681
- "body": "LmhlYWRlciB7CiAgZGlzcGxheTogZmxleDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIG1hcmdpbjogMmVtOwp9CgoubG9nbyB7CiAgaGVpZ2h0OiA0ZW07CiAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICBtYXJnaW4tcmlnaHQ6IDFlbTsKfQoKLnRpdGxlIHsKICBmb250LXdlaWdodDogNjAwOwogIGZvbnQtc2l6ZTogMS41ZW07Cn0K"
682
- }], ["src/Layout.tsx", {
683
- type: "raw",
684
- body: `import todoAppLogo from "/todo-aip-app.svg";
685
- import React from "react";
686
- import css from "./Layout.module.css";
687
-
688
- interface LayoutProps {
689
- children?: React.ReactNode;
690
- }
691
-
692
- function Layout({ children }: LayoutProps) {
693
- return (
694
- <>
695
- <div className={css.header}>
696
- <img src={todoAppLogo} className={css.logo} alt="Todo App logo" />
697
- <div className={css.title}>
698
- Ontology SDK Tutorial - To Do App Powered by AIP
699
- </div>
700
- </div>
701
- {children}
702
- </>
703
- );
704
- }
705
-
706
- export default Layout;
707
- `
708
- }], ["src/ProjectDetails.module.css", {
709
- "type": "base64",
710
- "body": "LnByb2plY3RDYXJkIHsKICBtYXJnaW46IDJlbTsKICBwYWRkaW5nOiAwLjVlbTsKICBib3JkZXI6IDFweCBzb2xpZCAjY2NjOwogIC8qIG1hcmdpbjogMC41ZW07ICovCiAgZ2FwOiAwLjVlbTsKICBib3JkZXItcmFkaXVzOiA1cHg7Cgp9CgoucHJvamVjdFRpdGxlIHsKICBmb250LXNpemU6IDEuNWVtOwp9CgouZGVzY3JpcHRpb24gewogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBnYXA6IDVweDsKfQoKLmltYWdlIHsKICBoZWlnaHQ6IDE2cHg7CiAgd2lkdGg6IDE2cHg7Cn0KCi5haXAgewogIGJhY2tncm91bmQtY29sb3I6ICM3OTYxREI7CiAgY29sb3I6ICNmZmZmZmY7CiAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICBwYWRkaW5nOiAycHg7CiAgZ2FwOiAxMHB4OwogIGhlaWdodDogMzBweDsKfQoKLnByb2Nlc3NpbmcgewogIGN1cnNvcjogcHJvZ3Jlc3M7Cn0KCi5haXBUZXh0IHsKICBkaXNwbGF5OiBmbGV4OwogIGp1c3RpZnktY29udGVudDogY2VudGVyOwogIGdhcDogMTBweDsKICBhbGlnbi1pdGVtczogY2VudGVyOwogIHBhZGRpbmc6IDAgMTBweDsKfQoKLnRleHRBcmVhIHsKICBib3JkZXI6IG5vbmU7CiAgY29sb3I6IGdyYXk7CiAgcmVzaXplOiBub25lOwogIG92ZXJmbG93OiBoaWRkZW47CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0K"
711
- }], ["src/ProjectDetails.tsx", {
712
- type: "raw",
713
- body: `import aipLogo from "/aip-icon.svg";
714
- import { useCallback, useEffect, useRef, useState } from "react";
715
- import CreateTaskButton from "./CreateTaskButton";
716
- import css from "./ProjectDetails.module.css";
717
- import TaskList from "./TaskList";
718
- import useProjects, { IProject } from "./useProjects";
719
- import { useProjectTasks } from "./useProjectTasks";
720
-
721
- interface ProjectDetailsProps {
722
- project: IProject;
723
- }
724
-
725
- export function ProjectDetails({ project }: ProjectDetailsProps) {
726
- const [projectHasTasks, setProjectHasTasks] = useState<boolean>(false);
727
- const [isProcessing, setIsProcessing] = useState<boolean>(false);
728
- const { updateProjectDescription } = useProjects();
729
- const tasks = useProjectTasks(project).tasks;
730
- const textAreaRef = useRef<HTMLTextAreaElement>(null);
731
-
732
- useEffect(() => {
733
- setProjectHasTasks(tasks == null ? false : tasks.length > 0);
734
- }, [project, tasks]);
735
-
736
- const handleProjectDescriptionRecommendation = useCallback(async () => {
737
- if (project == null) {
738
- return;
739
- }
740
- setIsProcessing(true);
741
- await updateProjectDescription(project);
742
- setIsProcessing(false);
743
- }, [project, updateProjectDescription]);
744
-
745
- useEffect(() => {
746
- if (textAreaRef.current) {
747
- const textArea = textAreaRef.current;
748
- textArea.style.height = "auto";
749
- textArea.style.height = \`\${textArea.scrollHeight}px\`;
750
- }
751
- }, [project.description]);
752
-
753
- const handleOnTaskCreated = useCallback(() => {
754
- setProjectHasTasks(true);
755
- }, []);
756
-
757
- const handleOnTaskDeleted = useCallback(() => {
758
- if (tasks?.length === 0) {
759
- setProjectHasTasks(false);
760
- }
761
- }, [tasks]);
762
-
763
- return (
764
- <div className={css.projectCard} key={project.id}>
765
- <h1 className={css.projectTitle}>{project.name}</h1>
766
- {projectHasTasks && (
767
- <div className={css.description}>
768
- <textarea
769
- ref={textAreaRef}
770
- readOnly
771
- value={project.description}
772
- className={css.textArea}
773
- />
774
- <button
775
- disabled={isProcessing}
776
- className={\`\${css.aip} \${isProcessing ? css.processing : ""}\`}
777
- title="Click here to update project description based on AIP Logic"
778
- type="button"
779
- onClick={handleProjectDescriptionRecommendation}
780
- >
781
- <div className={css.aipText}>
782
- <img
783
- src={aipLogo}
784
- alt="AIP"
785
- className={css.image}
786
- />
787
- Get description recommendation
788
- </div>
789
- </button>
790
- </div>
791
- )}
792
- <TaskList project={project} onTaskDeleted={handleOnTaskDeleted} />
793
- <CreateTaskButton
794
- project={project}
795
- onTaskCreated={handleOnTaskCreated}
796
- />
797
- </div>
798
- );
799
- }
800
- `
801
- }], ["src/ProjectSelect.tsx", {
802
- type: "raw",
803
- body: `import { ChangeEvent, useCallback } from "react";
804
- import { IProject } from "./useProjects";
805
-
806
- interface ProjectSelectProps {
807
- project: IProject | undefined;
808
- projects: IProject[];
809
- onSelectProject: (project: IProject) => void;
810
- }
811
-
812
- function ProjectSelect({
813
- project,
814
- projects,
815
- onSelectProject,
816
- }: ProjectSelectProps) {
817
- const handleSelect = useCallback(
818
- (e: ChangeEvent<HTMLSelectElement>) => {
819
- const nextProject = projects.find((p) => \`\${p.id}\` === e.target.value);
820
- if (nextProject != null) {
821
- onSelectProject(nextProject);
822
- }
823
- },
824
- [projects, onSelectProject],
825
- );
826
-
827
- return (
828
- <select value={project?.id} onChange={handleSelect}>
829
- <option hidden disabled value="">
830
- -- select a project --
831
- </option>
832
-
833
- {projects.map((p) => (
834
- <option key={p.id} value={p.id}>
835
- {p.name}
836
- </option>
837
- ))}
838
- </select>
839
- );
840
- }
841
-
842
- export default ProjectSelect;
843
- `
844
- }], ["src/TaskList.module.css", {
845
- "type": "base64",
846
- "body": "LnRhc2tMaXN0IHsKICBsaXN0LXN0eWxlOiBub25lOwogIHBhZGRpbmc6IDA7CiAgbWFyZ2luLXRvcDogMWVtOwogIG1hcmdpbi1ib3R0b206IDFlbTsKICB3aWR0aDogMTAwJTsKfQo="
847
- }], ["src/TaskList.tsx", {
848
- type: "raw",
849
- body: `import css from "./TaskList.module.css";
850
- import TaskListItem from "./TaskListItem";
851
- import { IProject } from "./useProjects";
852
- import { useProjectTasks } from "./useProjectTasks";
853
-
854
- interface TaskListProps {
855
- project: IProject;
856
- onTaskDeleted: (taskId: string | undefined) => void;
857
- }
858
-
859
- function TaskList({ project, onTaskDeleted }: TaskListProps) {
860
- const {
861
- tasks,
862
- isLoading: isLoadingTasks,
863
- isError: isErrorTasks,
864
- deleteTask,
865
- } = useProjectTasks(project);
866
-
867
- if (isErrorTasks) {
868
- return <div className={css.taskList}>Error loading tasks!</div>;
869
- } else if (isLoadingTasks) {
870
- return null;
871
- }
872
-
873
- const data = tasks ?? [];
874
- if (data.length === 0) {
875
- return <div className={css.taskList}>No tasks found</div>;
876
- }
877
-
878
- return (
879
- <ul className={css.taskList}>
880
- {data.map((task) => (
881
- <TaskListItem
882
- key={task.id}
883
- task={task}
884
- deleteTask={deleteTask}
885
- onTaskDeleted={onTaskDeleted}
886
- />
887
- ))}
888
- </ul>
889
- );
890
- }
891
-
892
- export default TaskList;
893
- `
894
- }], ["src/TaskListItem.module.css", {
895
- "type": "base64",
896
- "body": "LmxpIHsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgcGFkZGluZzogNXB4OwogIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgZ2FwOiA1cHg7CiAgYm9yZGVyLXJhZGl1czogNXB4OwogIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7CiAgbWFyZ2luOiAxMHB4IDA7Cn0KCi5jaGVja2VkIHsKICB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDsKfQoKLmRlbGV0ZSB7CiAgYm9yZGVyOiAxcHggc29saWQgI2NjYzsKICBwYWRkaW5nOiAycHg7Cn0KCi50YXNrIHsKICBkaXNwbGF5OiBmbGV4OwogIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgd2lkdGg6IDEwMCU7Cn0KCi50ZXh0QXJlYSB7CiAgYm9yZGVyOiBub25lOwogIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7CiAgY29sb3I6IGdyYXk7CiAgcmVzaXplOiBub25lOwogIG92ZXJmbG93OiBoaWRkZW47CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0K"
897
- }], ["src/TaskListItem.tsx", {
898
- type: "raw",
899
- body: `import { useCallback, useEffect, useRef, useState } from "react";
900
- import css from "./TaskListItem.module.css";
901
- import { ITask } from "./useProjectTasks";
902
-
903
- interface TaskListItemProps {
904
- task: ITask;
905
- deleteTask: (task: ITask) => Promise<void>;
906
- onTaskDeleted: (taskId: string | undefined) => void;
907
- }
908
-
909
- function TaskListItem({ task, deleteTask, onTaskDeleted }: TaskListItemProps) {
910
- const [isDeleting, setIsDeleting] = useState(false);
911
- const textAreaRef = useRef<HTMLTextAreaElement>(null);
912
-
913
- const handleClick = useCallback(async () => {
914
- setIsDeleting(true);
915
- try {
916
- await deleteTask(task);
917
- } finally {
918
- onTaskDeleted(task.id);
919
- setIsDeleting(false);
920
- }
921
- }, [deleteTask, task, onTaskDeleted]);
922
-
923
- useEffect(() => {
924
- if (textAreaRef.current) {
925
- const textArea = textAreaRef.current;
926
- textArea.style.height = "auto";
927
- textArea.style.height = \`\${textArea.scrollHeight}px\`;
928
- }
929
- }, [task.description]);
930
- const cleanDescription = task.description?.trim();
931
- return (
932
- <li className={css.li}>
933
- <input
934
- type="checkbox"
935
- onChange={handleClick}
936
- checked={isDeleting}
937
- className={css.delete}
938
- title="Delete task"
939
- />
940
- <div className={\`\${css.task} \${isDeleting ? css.checked : ""}\`}>
941
- <span>{task.title}</span>
942
- {cleanDescription != null && (
943
- <textarea
944
- ref={textAreaRef}
945
- readOnly
946
- value={task.description}
947
- className={css.textArea}
948
- rows={1}
949
- />
950
- )}
951
- </div>
952
- </li>
953
- );
954
- }
955
-
956
- export default TaskListItem;
957
- `
958
- }], ["src/client.ts.hbs", {
959
- type: "raw",
960
- body: `import { createClient, type Client } from "@osdk/client";
961
- import { createPublicOauthClient, type PublicOauthClient } from "@osdk/oauth";
962
-
963
- function getMetaTagContent(tagName: string): string {
964
- const elements = document.querySelectorAll(\`meta[name="\${tagName}"]\`);
965
- const element = elements.item(elements.length - 1);
966
- const value = element ? element.getAttribute("content") : null;
967
- if (value == null || value === "") {
968
- throw new Error(\`Meta tag \${tagName} not found or empty\`);
969
- }
970
- if (value.match(/%.+%/)) {
971
- throw new Error(
972
- \`Meta tag \${tagName} contains placeholder value. Please add \${value.replace(
973
- /%/g,
974
- ""
975
- )} to your .env files\`
976
- );
977
- }
978
- return value;
979
- }
980
-
981
- const foundryUrl = getMetaTagContent("osdk-foundryUrl");
982
- const clientId = getMetaTagContent("osdk-clientId");
983
- const redirectUrl = getMetaTagContent("osdk-redirectUrl");
984
- const ontologyRid = getMetaTagContent("osdk-ontologyRid");
985
-
986
- {{#if scopes}}
987
- const scopes = [
988
- {{#each scopes}}
989
- "{{this}}",
990
- {{/each}}
991
- ];
992
- {{/if}}
993
-
994
- export const auth: PublicOauthClient = createPublicOauthClient(
995
- clientId,
996
- foundryUrl,
997
- redirectUrl,
998
- {{#if scopes}}
999
- { scopes }
1000
- {{/if}}
1001
- );
1002
-
1003
- /**
1004
- * Initialize the client to interact with the Ontology and Platform SDKs
1005
- */
1006
- const client: Client = createClient(foundryUrl, ontologyRid, auth);
1007
-
1008
- export default client;
1009
- `
1010
- }], ["src/env.test.ts", {
1011
- "type": "base64",
1012
- "body": "aW1wb3J0IHsgbG9hZEVudiB9IGZyb20gInZpdGUiOwppbXBvcnQgeyBleHBlY3QsIHRlc3QgfSBmcm9tICJ2aXRlc3QiOwoKY29uc3QgRU5WX1ZBUlMgPSBbCiAgIlZJVEVfRk9VTkRSWV9BUElfVVJMIiwKICAiVklURV9GT1VORFJZX0NMSUVOVF9JRCIsCiAgIlZJVEVfRk9VTkRSWV9SRURJUkVDVF9VUkwiLApdOwoKZm9yIChjb25zdCBlbnZWYXIgb2YgRU5WX1ZBUlMpIHsKICB0ZXN0LnNraXBJZihwcm9jZXNzLmVudi5WRVJJRllfRU5WX1BST0RVQ1RJT04gIT09ICJ0cnVlIikoCiAgICBgcHJvZHVjdGlvbiBlbnYgc2hvdWxkIGNvbnRhaW4gJHtlbnZWYXJ9YCwKICAgICgpID0+IHsKICAgICAgY29uc3QgZW52ID0gbG9hZEVudigicHJvZHVjdGlvbiIsIHByb2Nlc3MuY3dkKCkpOwogICAgICBleHBlY3QoZW52W2VudlZhcl0sIGAke2VudlZhcn0gc2hvdWxkIGJlIGRlZmluZWRgKS50b0JlRGVmaW5lZCgpOwogICAgICBleHBlY3QoCiAgICAgICAgZW52W2VudlZhcl0sCiAgICAgICAgYCR7ZW52VmFyfSBzaG91bGQgbm90IGNvbnRhaW4gcGxhY2Vob2xkZXIgdmFsdWVgLAogICAgICApLm5vdC50b01hdGNoKC88Lio+Lyk7CiAgICB9LAogICk7Cn0K"
1013
- }], ["src/index.css", {
1014
- "type": "base64",
1015
- "body": "OnJvb3QgewogIGZvbnQtZmFtaWx5OiBJbnRlciwgc3lzdGVtLXVpLCBBdmVuaXIsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CiAgbGluZS1oZWlnaHQ6IDEuNTsKICBmb250LXdlaWdodDogNDAwOwoKICBmb250LXN5bnRoZXNpczogbm9uZTsKICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5OwogIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7Cn0KCiNyb290LWNvbnRhaW5lciB7CiAgZGlzcGxheTogZmxleDsKICBmbGV4OiAxOwogIGFsaWduLWl0ZW1zOiBjZW50ZXI7Cn0KCiNyb290IHsKICBtYXgtd2lkdGg6IDEyODBweDsKICBtYXJnaW46IDJyZW0gYXV0bzsKICBwYWRkaW5nOiAycmVtOwp9CgphIHsKICBmb250LXdlaWdodDogNTAwOwogIGNvbG9yOiAjNjQ2Y2ZmOwogIHRleHQtZGVjb3JhdGlvbjogaW5oZXJpdDsKfQphOmhvdmVyIHsKICBjb2xvcjogIzUzNWJmMjsKfQoKYm9keSB7CiAgbWFyZ2luOiAwOwogIGRpc3BsYXk6IGZsZXg7CiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICBtaW4td2lkdGg6IDMyMHB4OwogIG1pbi1oZWlnaHQ6IDEwMHZoOwp9CgpoMSB7CiAgZm9udC1zaXplOiAzLjJlbTsKICBsaW5lLWhlaWdodDogMS4xOwp9CgpidXR0b24gewogIGJvcmRlci1yYWRpdXM6IDhweDsKICBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsKICBwYWRkaW5nOiAwLjZlbSAxLjJlbTsKICBmb250LXNpemU6IDFlbTsKICBmb250LXdlaWdodDogNTAwOwogIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogIGN1cnNvcjogcG9pbnRlcjsKICB0cmFuc2l0aW9uOiBib3JkZXItY29sb3IgMC4yNXM7Cn0KYnV0dG9uOmhvdmVyIHsKICBib3JkZXItY29sb3I6ICM2NDZjZmY7Cn0KYnV0dG9uOmZvY3VzLApidXR0b246Zm9jdXMtdmlzaWJsZSB7CiAgb3V0bGluZTogNHB4IGF1dG8gLXdlYmtpdC1mb2N1cy1yaW5nLWNvbG9yOwp9CgpAbWVkaWEgKHByZWZlcnMtY29sb3Itc2NoZW1lOiBsaWdodCkgewogIDpyb290IHsKICAgIGNvbG9yOiAjMjEzNTQ3OwogICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZmZmZjsKICB9CiAgYTpob3ZlciB7CiAgICBjb2xvcjogIzc0N2JmZjsKICB9CiAgYnV0dG9uIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmOWY5Zjk7CiAgfQp9Cg=="
1016
- }], ["src/main.tsx", {
1017
- type: "raw",
1018
- body: `import { OsdkProvider } from "@osdk/react";
1019
- import ReactDOM from "react-dom/client";
1020
- import { createBrowserRouter, RouterProvider } from "react-router-dom";
1021
- import AuthCallback from "./AuthCallback";
1022
- import Home from "./Home";
1023
- import "./index.css";
1024
- import { StrictMode } from "react";
1025
- import client from "./client";
1026
-
1027
- const router = createBrowserRouter(
1028
- [
1029
- {
1030
- path: "/",
1031
- element: <Home />,
1032
- },
1033
- {
1034
- // This is the route defined in your application's redirect URL
1035
- path: "/auth/callback",
1036
- element: <AuthCallback />,
1037
- },
1038
- ],
1039
- { basename: import.meta.env.BASE_URL },
1040
- );
1041
-
1042
- ReactDOM.createRoot(document.getElementById("root")!).render(
1043
- <StrictMode>
1044
- <OsdkProvider client={client}>
1045
- <RouterProvider router={router} />
1046
- </OsdkProvider>
1047
- </StrictMode>,
1048
- );
1049
- `
1050
- }], ["src/mocks.ts", {
1051
- "type": "base64",
1052
- "body": "aW1wb3J0IHsgSVByb2plY3QgfSBmcm9tICIuL3VzZVByb2plY3RzIjsKaW1wb3J0IHsgSVRhc2sgfSBmcm9tICIuL3VzZVByb2plY3RUYXNrcyI7Cgpjb25zdCBwcm9qZWN0czogSVByb2plY3RbXSA9IFsKICB7CiAgICAkYXBpTmFtZTogIk1vY2tQcm9qZWN0IiwKICAgICRwcmltYXJ5S2V5OiAiMSIsCiAgICBpZDogIjEiLAogICAgbmFtZTogIk1vY2sgcHJvamVjdCIsCiAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgYSBtb2NrIGRlc2NyaXB0aW9uIiwKICB9LAogIHsKICAgICRhcGlOYW1lOiAiTW9ja1Byb2plY3QiLAogICAgJHByaW1hcnlLZXk6ICIyIiwKICAgIGlkOiAiMiIsCiAgICBuYW1lOiAiWWV0IGFub3RoZXIgbW9jayBwcm9qZWN0IiwKICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBpcyBhbm90aGVyIG1vY2sgZGVzY3JpcHRpb24iLAogIH0sCl07Cgpjb25zdCB0YXNrczogSVRhc2tbXSA9IFsKICB7CiAgICAkYXBpTmFtZTogIk1vY2tUYXNrIiwKICAgICRwcmltYXJ5S2V5OiAiMSIsCiAgICBpZDogIjEiLAogICAgdGl0bGU6ICJUcnkgdG8iLAogICAgZGVzY3JpcHRpb246ICJ0YXNrIGRlc2NyaXB0aW9uIDEiLAogICAgcHJvamVjdElkOiAiMSIsCiAgfSwKICB7CiAgICAkYXBpTmFtZTogIk1vY2tUYXNrIiwKICAgICRwcmltYXJ5S2V5OiAiMiIsCiAgICBpZDogIjIiLAogICAgdGl0bGU6ICJJbXBsZW1lbnQgdGhpcyIsCiAgICBkZXNjcmlwdGlvbjogInRhc2sgZGVzY3JpcHRpb24gMiIsCiAgICBwcm9qZWN0SWQ6ICIxIiwKICB9LAogIHsKICAgICRhcGlOYW1lOiAiTW9ja1Rhc2siLAogICAgJHByaW1hcnlLZXk6ICIzIiwKICAgIGlkOiAiMyIsCiAgICB0aXRsZTogIldpdGggdGhlIE9udG9sb2d5IFNESyEiLAogICAgZGVzY3JpcHRpb246ICJ0YXNrIGRlc2NyaXB0aW9uIDMiLAogICAgcHJvamVjdElkOiAiMSIsCiAgfSwKICB7CiAgICAkYXBpTmFtZTogIk1vY2tUYXNrIiwKICAgICRwcmltYXJ5S2V5OiAiNCIsCiAgICBpZDogIjQiLAogICAgdGl0bGU6ICJNb3JlIHRhc2tzIGhlcmUiLAogICAgZGVzY3JpcHRpb246ICJNb3JlIHRhc2sgZGVzY3JpcHRpb24iLAogICAgcHJvamVjdElkOiAiMiIsCiAgfSwKXTsKYXN5bmMgZnVuY3Rpb24gZGVsYXkoKTogUHJvbWlzZTx2b2lkPiB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PgogICAgc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIDUwMCArIE1hdGgucmFuZG9tKCkgKiAxMDAwKQogICk7Cn0KCi8vIEdvb2QgZW5vdWdoIHJhbmRvbSBpZCBmb3IgbW9ja3MKZnVuY3Rpb24gcmFuZG9tSWQoKTogc3RyaW5nIHsKICByZXR1cm4gYCR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMiAqKiAzMSl9YDsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0UHJvamVjdHMoKTogUHJvbWlzZTxJUHJvamVjdFtdPiB7CiAgYXdhaXQgZGVsYXkoKTsKICBjb25zdCByZXN1bHQgPSBbLi4ucHJvamVjdHNdOwogIHJlc3VsdC5zb3J0KChwMSwgcDIpID0+IHAxLm5hbWUubG9jYWxlQ29tcGFyZShwMi5uYW1lKSk7CiAgcmV0dXJuIHJlc3VsdDsKfQoKYXN5bmMgZnVuY3Rpb24gY3JlYXRlUHJvamVjdCh7CiAgbmFtZSwKfTogewogIG5hbWU6IHN0cmluZzsKICBkZXNjcmlwdGlvbj86IHN0cmluZzsKfSk6IFByb21pc2U8SVByb2plY3RbIiRwcmltYXJ5S2V5Il0+IHsKICBhd2FpdCBkZWxheSgpOwogIGNvbnN0IGlkID0gcmFuZG9tSWQoKTsKICBwcm9qZWN0cy5wdXNoKHsKICAgICRhcGlOYW1lOiAiTW9ja1Byb2plY3QiLAogICAgJHByaW1hcnlLZXk6IGlkLAogICAgaWQsCiAgICBuYW1lLAogICAgZGVzY3JpcHRpb246ICIiLAogIH0pOwogIHJldHVybiBpZDsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0UmVjb21tZW5kZWRQcm9qZWN0RGVzY3JpcHRpb24oCiAgcHJvamVjdDogSVByb2plY3QsCik6IFByb21pc2U8c3RyaW5nPiB7CiAgYXdhaXQgZGVsYXkoKTsKICBjb25zdCBwcm9qZWN0VGFza3MgPSB0YXNrcy5maWx0ZXIoKHQpID0+IHQucHJvamVjdElkID09PSBwcm9qZWN0LmlkKTsKICBpZiAocHJvamVjdFRhc2tzLmxlbmd0aCA9PT0gMCkgewogICAgdGhyb3cgbmV3IEVycm9yKCJQcm9qZWN0IGRlc2NyaXB0aW9uIHJlY29tbWVuZGF0aW9uIHJlcXVpcmVzIHRhc2tzIik7CiAgfQogIHJldHVybiBgQUlQIExvZ2ljIG1vY2sgZGVzY3JpcHRpb24gZm9yIHByb2plY3RgOwp9Cgphc3luYyBmdW5jdGlvbiB1cGRhdGVQcm9qZWN0RGVzY3JpcHRpb24oCiAgcHJvamVjdDogSVByb2plY3QsCik6IFByb21pc2U8dm9pZD4gewogIGF3YWl0IGRlbGF5KCk7CiAgcHJvamVjdC5kZXNjcmlwdGlvbiA9IGF3YWl0IGdldFJlY29tbWVuZGVkUHJvamVjdERlc2NyaXB0aW9uKHByb2plY3QpOwp9Cgphc3luYyBmdW5jdGlvbiBkZWxldGVQcm9qZWN0KGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHsKICBhd2FpdCBkZWxheSgpOwogIGNvbnN0IGlkeCA9IHByb2plY3RzLmZpbmRJbmRleCgocCkgPT4gcC5pZCA9PT0gaWQpOwogIGlmIChpZHggIT09IC0xKSB7CiAgICBwcm9qZWN0cy5zcGxpY2UoaWR4LCAxKTsKICB9Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldFByb2plY3RUYXNrcyhwcm9qZWN0SWQ6IHN0cmluZyk6IFByb21pc2U8SVRhc2tbXT4gewogIGF3YWl0IGRlbGF5KCk7CiAgcmV0dXJuIHRhc2tzLmZpbHRlcigodCkgPT4gdC5wcm9qZWN0SWQgPT09IHByb2plY3RJZCk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRhc2soewogIHRpdGxlLAogIGRlc2NyaXB0aW9uID0gIiIsCiAgcHJvamVjdElkLAp9OiB7CiAgdGl0bGU6IHN0cmluZzsKICBkZXNjcmlwdGlvbjogc3RyaW5nOwogIHByb2plY3RJZDogc3RyaW5nOwp9KTogUHJvbWlzZTxJVGFza1siJHByaW1hcnlLZXkiXT4gewogIGF3YWl0IGRlbGF5KCk7CiAgY29uc3QgcHJvamVjdCA9IHByb2plY3RzLmZpbmQoKHApID0+IHAuaWQgPT09IHByb2plY3RJZCk7CiAgaWYgKHByb2plY3QgPT0gbnVsbCkgewogICAgdGhyb3cgbmV3IEVycm9yKGBQcm9qZWN0ICR7cHJvamVjdElkfSBub3QgZm91bmQhYCk7CiAgfQogIGNvbnN0IGlkID0gcmFuZG9tSWQoKTsKICB0YXNrcy51bnNoaWZ0KHsKICAgICRhcGlOYW1lOiAiTW9ja1Rhc2siLAogICAgJHByaW1hcnlLZXk6IGlkLAogICAgaWQsCiAgICB0aXRsZSwKICAgIGRlc2NyaXB0aW9uLAogICAgcHJvamVjdElkLAogIH0pOwogIHJldHVybiBpZDsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0UmVjb21tZW5kZWRUYXNrRGVzY3JpcHRpb24oCiAgdGFza05hbWU6IHN0cmluZywKKTogUHJvbWlzZTxzdHJpbmc+IHsKICBhd2FpdCBkZWxheSgpOwogIGlmICh0YXNrTmFtZS5sZW5ndGggPT09IDApIHsKICAgIHRocm93IG5ldyBFcnJvcigiVGFzayBuYW1lIG11c3Qgbm90IGJlIGVtcHR5Iik7CiAgfQogIHJldHVybiBgTW9jayBBSVAgZGVzY3JpcHRpb24gZm9yIHRhc2tgOwp9Cgphc3luYyBmdW5jdGlvbiBkZWxldGVUYXNrKGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHsKICBhd2FpdCBkZWxheSgpOwogIGNvbnN0IGlkeCA9IHRhc2tzLmZpbmRJbmRleCgodCkgPT4gdC5pZCA9PT0gaWQpOwogIGlmIChpZHggIT09IC0xKSB7CiAgICB0YXNrcy5zcGxpY2UoaWR4LCAxKTsKICB9Cn0KCmNvbnN0IE1vY2tzID0gewogIGdldFByb2plY3RzLAogIGNyZWF0ZVByb2plY3QsCiAgZ2V0UmVjb21tZW5kZWRQcm9qZWN0RGVzY3JpcHRpb24sCiAgZGVsZXRlUHJvamVjdCwKICBnZXRQcm9qZWN0VGFza3MsCiAgY3JlYXRlVGFzaywKICBkZWxldGVUYXNrLAogIGdldFJlY29tbWVuZGVkVGFza0Rlc2NyaXB0aW9uLAogIHVwZGF0ZVByb2plY3REZXNjcmlwdGlvbiwKfTsKCmV4cG9ydCBkZWZhdWx0IE1vY2tzOwo="
1053
- }], ["src/useProjectTasks.ts", {
1054
- "type": "base64",
1055
- "body": "Ly8gaW1wb3J0IHsgdXNlT3Nka0NsaWVudCB9IGZyb20gIkBvc2RrL3JlYWN0IjsKaW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICJyZWFjdCI7CmltcG9ydCB1c2VTV1IgZnJvbSAic3dyIjsKaW1wb3J0IE1vY2tzIGZyb20gIi4vbW9ja3MiOwppbXBvcnQgeyBJUHJvamVjdCB9IGZyb20gIi4vdXNlUHJvamVjdHMiOwpleHBvcnQgaW50ZXJmYWNlIElUYXNrIHsKICAkYXBpTmFtZTogc3RyaW5nOwogICRwcmltYXJ5S2V5OiBzdHJpbmc7CiAgaWQ6IHN0cmluZzsKICB0aXRsZTogc3RyaW5nOwogIGRlc2NyaXB0aW9uOiBzdHJpbmc7CiAgcHJvamVjdElkOiBzdHJpbmc7Cn0KCmV4cG9ydCBmdW5jdGlvbiB1c2VQcm9qZWN0VGFza3MocHJvamVjdDogSVByb2plY3QgfCB1bmRlZmluZWQpIHsKICAvLyBVc2UgdGhpcyBjbGllbnQgdmFyaWFibGUgdG8gYWNjZXNzIHRoZSBPbnRvbG9neSBTREsuCiAgLy8gY29uc3QgY2xpZW50ID0gdXNlT3Nka0NsaWVudCgpOwogIGNvbnN0IHsgZGF0YSwgaXNMb2FkaW5nLCBpc1ZhbGlkYXRpbmcsIGVycm9yLCBtdXRhdGUgfSA9IHVzZVNXUjxJVGFza1tdPigKICAgIHByb2plY3QgIT0gbnVsbCA/IGBwcm9qZWN0cy8ke3Byb2plY3QuaWR9L3Rhc2tzYCA6IG51bGwsCiAgICAvLyBUcnkgdG8gaW1wbGVtZW50IHRoaXMgd2l0aCB0aGUgT250b2xvZ3kgU0RLIQogICAgYXN5bmMgKCkgPT4gewogICAgICBpZiAocHJvamVjdCA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIFtdOwogICAgICB9CiAgICAgIHJldHVybiBNb2Nrcy5nZXRQcm9qZWN0VGFza3MocHJvamVjdC4kcHJpbWFyeUtleSk7CiAgICB9LAogICk7CgogIGNvbnN0IGNyZWF0ZVRhc2s6ICgKICAgIHRpdGxlOiBzdHJpbmcsCiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLAogICkgPT4gUHJvbWlzZTxJVGFza1siJHByaW1hcnlLZXkiXSB8IHVuZGVmaW5lZD4gPSB1c2VDYWxsYmFjaygKICAgIGFzeW5jICh0aXRsZTogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nKSA9PiB7CiAgICAgIGlmIChwcm9qZWN0ID09IG51bGwpIHsKICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICB9CiAgICAgIC8vIFRyeSB0byBpbXBsZW1lbnQgdGhpcyB3aXRoIHRoZSBPbnRvbG9neSBTREshCiAgICAgIGNvbnN0IGlkID0gYXdhaXQgTW9ja3MuY3JlYXRlVGFzayh7CiAgICAgICAgdGl0bGUsCiAgICAgICAgZGVzY3JpcHRpb24sCiAgICAgICAgcHJvamVjdElkOiBwcm9qZWN0LiRwcmltYXJ5S2V5LAogICAgICB9KTsKICAgICAgYXdhaXQgbXV0YXRlKCk7CiAgICAgIHJldHVybiBpZDsKICAgIH0sCiAgICBbcHJvamVjdCwgbXV0YXRlXSwKICApOwoKICBjb25zdCBkZWxldGVUYXNrOiAodGFzazogSVRhc2spID0+IFByb21pc2U8dm9pZD4gPSB1c2VDYWxsYmFjaygKICAgIGFzeW5jICh0YXNrKSA9PiB7CiAgICAgIGlmIChwcm9qZWN0ID09IG51bGwpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgLy8gVHJ5IHRvIGltcGxlbWVudCB0aGlzIHdpdGggdGhlIE9udG9sb2d5IFNESyEKICAgICAgYXdhaXQgTW9ja3MuZGVsZXRlVGFzayh0YXNrLiRwcmltYXJ5S2V5KTsKICAgICAgYXdhaXQgbXV0YXRlKCk7CiAgICB9LAogICAgW3Byb2plY3QsIG11dGF0ZV0sCiAgKTsKCiAgY29uc3QgZ2V0UmVjb21tZW5kZWRUYXNrRGVzY3JpcHRpb246ICh0YXNrTmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPHN0cmluZz4gPQogICAgdXNlQ2FsbGJhY2soCiAgICAgIGFzeW5jICh0YXNrTmFtZTogc3RyaW5nKSA9PiB7CiAgICAgICAgLy8gVHJ5IHRvIGltcGxlbWVudCB0aGlzIHdpdGggdGhlIE9udG9sb2d5IFNESyEKICAgICAgICBjb25zdCByZWNvbW1lbmRlZFRhc2tEZXNjcmlwdGlvbiA9IGF3YWl0IE1vY2tzCiAgICAgICAgICAuZ2V0UmVjb21tZW5kZWRUYXNrRGVzY3JpcHRpb24odGFza05hbWUpOwogICAgICAgIGF3YWl0IG11dGF0ZSgpOwogICAgICAgIHJldHVybiByZWNvbW1lbmRlZFRhc2tEZXNjcmlwdGlvbjsKICAgICAgfSwKICAgICAgW211dGF0ZV0sCiAgICApOwoKICByZXR1cm4gewogICAgdGFza3M6IGRhdGEsCiAgICBpc0xvYWRpbmcsCiAgICBpc1ZhbGlkYXRpbmcsCiAgICBpc0Vycm9yOiBlcnJvciwKICAgIGNyZWF0ZVRhc2ssCiAgICBkZWxldGVUYXNrLAogICAgZ2V0UmVjb21tZW5kZWRUYXNrRGVzY3JpcHRpb24sCiAgfTsKfQo="
1056
- }], ["src/useProjects.ts", {
1057
- "type": "base64",
1058
- "body": "Ly8gaW1wb3J0IHsgdXNlT3Nka0NsaWVudCB9IGZyb20gIkBvc2RrL3JlYWN0IjsKaW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICJyZWFjdCI7CmltcG9ydCB1c2VTV1IgZnJvbSAic3dyIjsKaW1wb3J0IE1vY2tzIGZyb20gIi4vbW9ja3MiOwpleHBvcnQgaW50ZXJmYWNlIElQcm9qZWN0IHsKICAkYXBpTmFtZTogc3RyaW5nOwogICRwcmltYXJ5S2V5OiBzdHJpbmc7CiAgaWQ6IHN0cmluZzsKICBuYW1lOiBzdHJpbmc7CiAgZGVzY3JpcHRpb246IHN0cmluZzsKfQoKZnVuY3Rpb24gdXNlUHJvamVjdHMoKSB7CiAgLy8gVXNlIHRoaXMgY2xpZW50IHZhcmlhYmxlIHRvIGFjY2VzcyB0aGUgT250b2xvZ3kgU0RLLgogIC8vIGNvbnN0IGNsaWVudCA9IHVzZU9zZGtDbGllbnQoKTsKICBjb25zdCB7IGRhdGEsIGlzTG9hZGluZywgaXNWYWxpZGF0aW5nLCBlcnJvciwgbXV0YXRlIH0gPSB1c2VTV1I8SVByb2plY3RbXT4oCiAgICAicHJvamVjdHMiLAogICAgYXN5bmMgKCkgPT4gewogICAgICAvLyBUcnkgdG8gaW1wbGVtZW50IHRoaXMgd2l0aCB0aGUgT250b2xvZ3kgU0RLIQogICAgICBjb25zdCBwcm9qZWN0c0xpc3Q6IElQcm9qZWN0W10gPSAoYXdhaXQgTW9ja3MuZ2V0UHJvamVjdHMoKSkubWFwKCgKICAgICAgICBwcm9qZWN0LAogICAgICApID0+ICh7CiAgICAgICAgJGFwaU5hbWU6IHByb2plY3QuJGFwaU5hbWUsCiAgICAgICAgJHByaW1hcnlLZXk6IHByb2plY3QuJHByaW1hcnlLZXksCiAgICAgICAgaWQ6IHByb2plY3QuaWQsCiAgICAgICAgbmFtZTogcHJvamVjdC5uYW1lIHx8ICIiLAogICAgICAgIGRlc2NyaXB0aW9uOiBwcm9qZWN0LmRlc2NyaXB0aW9uIHx8ICIiLAogICAgICB9KSk7CiAgICAgIHJldHVybiBwcm9qZWN0c0xpc3Q7CiAgICB9LAogICk7CgogIGNvbnN0IGNyZWF0ZVByb2plY3Q6ICgKICAgIG5hbWU6IHN0cmluZywKICApID0+IFByb21pc2U8SVByb2plY3RbIiRwcmltYXJ5S2V5Il0+ID0gdXNlQ2FsbGJhY2soCiAgICBhc3luYyAobmFtZTogc3RyaW5nKSA9PiB7CiAgICAgIC8vIFRyeSB0byBpbXBsZW1lbnQgdGhpcyB3aXRoIHRoZSBPbnRvbG9neSBTREshCiAgICAgIGNvbnN0IGlkID0gYXdhaXQgTW9ja3MuY3JlYXRlUHJvamVjdCh7IG5hbWUgfSk7CiAgICAgIGF3YWl0IG11dGF0ZSgpOwogICAgICByZXR1cm4gaWQ7CiAgICB9LAogICAgW211dGF0ZV0sCiAgKTsKCiAgY29uc3QgdXBkYXRlUHJvamVjdERlc2NyaXB0aW9uOiAoCiAgICBwcm9qZWN0OiBJUHJvamVjdCwKICApID0+IFByb21pc2U8dm9pZD4gPSB1c2VDYWxsYmFjaygKICAgIGFzeW5jIChwcm9qZWN0KSA9PiB7CiAgICAgIC8vIFRyeSB0byBpbXBsZW1lbnQgdGhpcyB3aXRoIHRoZSBPbnRvbG9neSBTREshCiAgICAgIGF3YWl0IE1vY2tzLnVwZGF0ZVByb2plY3REZXNjcmlwdGlvbihwcm9qZWN0KTsKICAgICAgYXdhaXQgbXV0YXRlKCk7CiAgICB9LAogICAgW211dGF0ZV0sCiAgKTsKCiAgY29uc3QgZGVsZXRlUHJvamVjdDogKHByb2plY3Q6IElQcm9qZWN0KSA9PiBQcm9taXNlPHZvaWQ+ID0gdXNlQ2FsbGJhY2soCiAgICBhc3luYyAocHJvamVjdCkgPT4gewogICAgICAvLyBUcnkgdG8gaW1wbGVtZW50IHRoaXMgd2l0aCB0aGUgT250b2xvZ3kgU0RLIQogICAgICBhd2FpdCBNb2Nrcy5kZWxldGVQcm9qZWN0KHByb2plY3QuJHByaW1hcnlLZXkpOwogICAgICBhd2FpdCBtdXRhdGUoKTsKICAgIH0sCiAgICBbbXV0YXRlXSwKICApOwoKICByZXR1cm4gewogICAgcHJvamVjdHM6IGRhdGEsCiAgICBpc0xvYWRpbmcsCiAgICBpc1ZhbGlkYXRpbmcsCiAgICBpc0Vycm9yOiBlcnJvciwKICAgIGNyZWF0ZVByb2plY3QsCiAgICBkZWxldGVQcm9qZWN0LAogICAgdXBkYXRlUHJvamVjdERlc2NyaXB0aW9uLAogIH07Cn0KCmV4cG9ydCBkZWZhdWx0IHVzZVByb2plY3RzOwo="
1059
- }], ["src/vite-env.d.ts", {
1060
- "type": "base64",
1061
- "body": "Ly8vIDxyZWZlcmVuY2UgdHlwZXM9InZpdGUvY2xpZW50IiAvPgo="
1062
- }], ["tsconfig.json", {
1063
- "type": "base64",
1064
- "body": "ewogICJjb21waWxlck9wdGlvbnMiOiB7CiAgICAidGFyZ2V0IjogIkVTMjAyMCIsCiAgICAidXNlRGVmaW5lRm9yQ2xhc3NGaWVsZHMiOiB0cnVlLAogICAgImxpYiI6IFsiRVMyMDIwIiwgIkRPTSIsICJET00uSXRlcmFibGUiXSwKICAgICJtb2R1bGUiOiAiRVNOZXh0IiwKICAgICJza2lwTGliQ2hlY2siOiB0cnVlLAoKICAgIC8qIEJ1bmRsZXIgbW9kZSAqLwogICAgIm1vZHVsZVJlc29sdXRpb24iOiAiYnVuZGxlciIsCiAgICAiYWxsb3dJbXBvcnRpbmdUc0V4dGVuc2lvbnMiOiB0cnVlLAogICAgInJlc29sdmVKc29uTW9kdWxlIjogdHJ1ZSwKICAgICJpc29sYXRlZE1vZHVsZXMiOiB0cnVlLAogICAgIm5vRW1pdCI6IHRydWUsCiAgICAianN4IjogInJlYWN0LWpzeCIsCgogICAgLyogTGludGluZyAqLwogICAgInN0cmljdCI6IHRydWUsCiAgICAibm9VbnVzZWRMb2NhbHMiOiB0cnVlLAogICAgIm5vVW51c2VkUGFyYW1ldGVycyI6IHRydWUsCiAgICAibm9GYWxsdGhyb3VnaENhc2VzSW5Td2l0Y2giOiB0cnVlCiAgfSwKICAiaW5jbHVkZSI6IFsic3JjIl0sCiAgInJlZmVyZW5jZXMiOiBbeyAicGF0aCI6ICIuL3RzY29uZmlnLm5vZGUuanNvbiIgfV0KfQo="
1065
- }], ["tsconfig.node.json", {
1066
- "type": "base64",
1067
- "body": "ewogICJjb21waWxlck9wdGlvbnMiOiB7CiAgICAiY29tcG9zaXRlIjogdHJ1ZSwKICAgICJza2lwTGliQ2hlY2siOiB0cnVlLAogICAgIm1vZHVsZSI6ICJFU05leHQiLAogICAgIm1vZHVsZVJlc29sdXRpb24iOiAiYnVuZGxlciIsCiAgICAiYWxsb3dTeW50aGV0aWNEZWZhdWx0SW1wb3J0cyI6IHRydWUKICB9LAogICJpbmNsdWRlIjogWyJ2aXRlLmNvbmZpZy50cyJdCn0K"
1068
- }], ["vite.config.ts.hbs", {
1069
- type: "raw",
1070
- body: `import react from "@vitejs/plugin-react";
1071
- import { defineConfig } from "vite";
1072
-
1073
- // https://vitejs.dev/config/
1074
- export default defineConfig({
1075
- plugins: [react()],
1076
- server: {
1077
- port: 8080,
1078
- {{#if corsProxy}}
1079
- proxy: {
1080
- "^(/multipass/api|/api)": {
1081
- target: "{{foundryUrl}}",
1082
- changeOrigin: true,
1083
- secure: true,
1084
- },
1085
- },
1086
- {{/if}}
1087
- },
1088
- });
1089
- `
1090
- }]]);
1091
-
1092
- export { files };
1093
- //# sourceMappingURL=esm-VF46BQ3A.js.map
1094
- //# sourceMappingURL=esm-VF46BQ3A.js.map