@osdk/create-app 2.2.0-beta.12 → 2.2.0-beta.13
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 +2 -0
- package/build/esm/{esm-WDI4ERNF.js → esm-2XGHW3GB.js} +36 -42
- package/build/esm/esm-2XGHW3GB.js.map +1 -0
- package/build/esm/{esm-RTFDNEWG.js → esm-UFOWZVCI.js} +14 -12
- package/build/esm/esm-UFOWZVCI.js.map +1 -0
- package/build/esm/{esm-FKKIVFT7.js → esm-WOD3ZASU.js} +14 -12
- package/build/esm/esm-WOD3ZASU.js.map +1 -0
- package/build/esm/index.js +5 -5
- package/package.json +11 -11
- package/build/esm/esm-FKKIVFT7.js.map +0 -1
- package/build/esm/esm-RTFDNEWG.js.map +0 -1
- package/build/esm/esm-WDI4ERNF.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -143,7 +143,7 @@ dist-ssr
|
|
|
143
143
|
type: "raw",
|
|
144
144
|
body: `import { useEffect, useState } from "react";
|
|
145
145
|
import { useNavigate } from "react-router-dom";
|
|
146
|
-
import { auth } from "./
|
|
146
|
+
import { auth } from "./client";
|
|
147
147
|
|
|
148
148
|
/**
|
|
149
149
|
* Component to render at \`/auth/callback\`
|
|
@@ -258,14 +258,28 @@ function Layout({ children }: LayoutProps) {
|
|
|
258
258
|
|
|
259
259
|
export default Layout;
|
|
260
260
|
`
|
|
261
|
-
}], ["src/
|
|
261
|
+
}], ["src/client.ts.hbs", {
|
|
262
262
|
type: "raw",
|
|
263
|
-
body: `import "
|
|
264
|
-
import type { Client } from "@osdk/client";
|
|
263
|
+
body: `import type { Client } from "@osdk/client";
|
|
265
264
|
import { createClient } from "@osdk/client";
|
|
266
265
|
import { $ontologyRid } from "{{osdkPackage}}";
|
|
267
266
|
import { createPublicOauthClient } from "@osdk/oauth";
|
|
268
267
|
|
|
268
|
+
const url = import.meta.env.VITE_FOUNDRY_API_URL;
|
|
269
|
+
const clientId = import.meta.env.VITE_FOUNDRY_CLIENT_ID;
|
|
270
|
+
const redirectUrl = import.meta.env.VITE_FOUNDRY_REDIRECT_URL;
|
|
271
|
+
{{#if scopes}}
|
|
272
|
+
const scopes = [
|
|
273
|
+
{{#each scopes}}
|
|
274
|
+
"{{this}}",
|
|
275
|
+
{{/each}}
|
|
276
|
+
];
|
|
277
|
+
{{/if}}
|
|
278
|
+
|
|
279
|
+
checkEnv(url, "VITE_FOUNDRY_API_URL");
|
|
280
|
+
checkEnv(clientId, "VITE_FOUNDRY_CLIENT_ID");
|
|
281
|
+
checkEnv(redirectUrl, "VITE_FOUNDRY_REDIRECT_URL");
|
|
282
|
+
|
|
269
283
|
function checkEnv(
|
|
270
284
|
value: string | undefined,
|
|
271
285
|
name: string,
|
|
@@ -275,42 +289,25 @@ function checkEnv(
|
|
|
275
289
|
}
|
|
276
290
|
}
|
|
277
291
|
|
|
278
|
-
export
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
292
|
+
export const auth = createPublicOauthClient(
|
|
293
|
+
clientId,
|
|
294
|
+
url,
|
|
295
|
+
redirectUrl,
|
|
282
296
|
{{#if scopes}}
|
|
283
|
-
|
|
284
|
-
{{#each scopes}}
|
|
285
|
-
"{{this}}",
|
|
286
|
-
{{/each}}
|
|
287
|
-
];
|
|
297
|
+
{ scopes },
|
|
288
298
|
{{/if}}
|
|
299
|
+
);
|
|
289
300
|
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
{{#if scopes}}
|
|
299
|
-
{ scopes },
|
|
300
|
-
{{/if}}
|
|
301
|
-
);
|
|
302
|
-
|
|
303
|
-
/**
|
|
304
|
-
* Initialize the client to interact with the Ontology SDK
|
|
305
|
-
*/
|
|
306
|
-
const client: Client = createClient(
|
|
307
|
-
url,
|
|
308
|
-
$ontologyRid,
|
|
309
|
-
auth,
|
|
310
|
-
);
|
|
301
|
+
/**
|
|
302
|
+
* Initialize the client to interact with the Ontology SDK
|
|
303
|
+
*/
|
|
304
|
+
const client: Client = createClient(
|
|
305
|
+
url,
|
|
306
|
+
$ontologyRid,
|
|
307
|
+
auth,
|
|
308
|
+
);
|
|
311
309
|
|
|
312
|
-
|
|
313
|
-
}
|
|
310
|
+
export default client;
|
|
314
311
|
`
|
|
315
312
|
}], ["src/env.test.ts", {
|
|
316
313
|
"type": "base64",
|
|
@@ -323,13 +320,10 @@ export default function createClientAndAuth() {
|
|
|
323
320
|
body: `import { OsdkProvider } from "@osdk/react";
|
|
324
321
|
import ReactDOM from "react-dom/client";
|
|
325
322
|
import { RouterProvider } from "react-router-dom";
|
|
326
|
-
import createClientAndAuth from "./createClientAndAuth";
|
|
327
323
|
import "./index.css";
|
|
324
|
+
import client from "./client";
|
|
328
325
|
import { router } from "./router";
|
|
329
326
|
|
|
330
|
-
const { client, auth } = createClientAndAuth();
|
|
331
|
-
export { auth };
|
|
332
|
-
|
|
333
327
|
ReactDOM.createRoot(document.getElementById("root")!).render(
|
|
334
328
|
<OsdkProvider client={client}>
|
|
335
329
|
<RouterProvider router={router} />,
|
|
@@ -396,5 +390,5 @@ export default defineConfig(({ mode }) => {
|
|
|
396
390
|
}]]);
|
|
397
391
|
|
|
398
392
|
export { files };
|
|
399
|
-
//# sourceMappingURL=esm-
|
|
400
|
-
//# sourceMappingURL=esm-
|
|
393
|
+
//# sourceMappingURL=esm-2XGHW3GB.js.map
|
|
394
|
+
//# sourceMappingURL=esm-2XGHW3GB.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../create-app.template.react.beta/build/esm/generatedNoCheck/index.js"],"names":[],"mappings":";AAAO,IAAM,KAAQ,mBAAA,IAAI,GAAI,CAAA,CAAC,CAAC,eAAiB,EAAA;AAAA,EAC9C,IAAM,EAAA,KAAA;AAAA,EACN,IAAM,EAAA,CAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAoCR,CAAC,CAAA,EAAG,CAAC,YAAc,EAAA;AAAA,EACjB,IAAM,EAAA,KAAA;AAAA,EACN,IAAM,EAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBR,CAAC,CAAA,EAAG,CAAC,mBAAqB,EAAA;AAAA,EACxB,MAAQ,EAAA,QAAA;AAAA,EACR,MAAQ,EAAA;AACV,CAAC,CAAA,EAAG,CAAC,YAAc,EAAA;AAAA,EACjB,IAAM,EAAA,KAAA;AAAA,EACN,IAAM,EAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBR,CAAC,CAAA,EAAG,CAAC,kBAAoB,EAAA;AAAA,EACvB,IAAM,EAAA,KAAA;AAAA,EACN,IAAM,EAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AA8CR,CAAC,CAAA,EAAG,CAAC,qBAAuB,EAAA;AAAA,EAC1B,MAAQ,EAAA,QAAA;AAAA,EACR,MAAQ,EAAA;AACV,CAAC,CAAA,EAAG,CAAC,kBAAoB,EAAA;AAAA,EACvB,MAAQ,EAAA,QAAA;AAAA,EACR,MAAQ,EAAA;AACV,CAAC,CAAA,EAAG,CAAC,sBAAwB,EAAA;AAAA,EAC3B,IAAM,EAAA,KAAA;AAAA,EACN,IAAM,EAAA,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAyBR,CAAC,CAAA,EAAG,CAAC,qBAAuB,EAAA;AAAA,EAC1B,MAAQ,EAAA,QAAA;AAAA,EACR,MAAQ,EAAA;AACV,CAAC,CAAA,EAAG,CAAC,kBAAoB,EAAA;AAAA,EACvB,IAAM,EAAA,KAAA;AAAA,EACN,IAAM,EAAA,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAmDR,CAAC,CAAA,EAAG,CAAC,uBAAyB,EAAA;AAAA,EAC5B,MAAQ,EAAA,QAAA;AAAA,EACR,MAAQ,EAAA;AACV,CAAC,CAAA,EAAG,CAAC,gBAAkB,EAAA;AAAA,EACrB,IAAM,EAAA,KAAA;AAAA,EACN,IAAM,EAAA,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AA+BR,CAAC,CAAA,EAAG,CAAC,mBAAqB,EAAA;AAAA,EACxB,IAAM,EAAA,KAAA;AAAA,EACN,IAAM,EAAA,CAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAiDR,CAAC,CAAA,EAAG,CAAC,iBAAmB,EAAA;AAAA,EACtB,MAAQ,EAAA,QAAA;AAAA,EACR,MAAQ,EAAA;AACV,CAAC,CAAA,EAAG,CAAC,eAAiB,EAAA;AAAA,EACpB,MAAQ,EAAA,QAAA;AAAA,EACR,MAAQ,EAAA;AACV,CAAC,CAAA,EAAG,CAAC,cAAgB,EAAA;AAAA,EACnB,IAAM,EAAA,KAAA;AAAA,EACN,IAAM,EAAA,CAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAaR,CAAC,CAAA,EAAG,CAAC,gBAAkB,EAAA;AAAA,EACrB,IAAM,EAAA,KAAA;AAAA,EACN,IAAM,EAAA,CAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBR,CAAC,CAAA,EAAG,CAAC,mBAAqB,EAAA;AAAA,EACxB,MAAQ,EAAA,QAAA;AAAA,EACR,MAAQ,EAAA;AACV,CAAC,CAAA,EAAG,CAAC,eAAiB,EAAA;AAAA,EACpB,MAAQ,EAAA,QAAA;AAAA,EACR,MAAQ,EAAA;AACV,CAAC,CAAA,EAAG,CAAC,oBAAsB,EAAA;AAAA,EACzB,MAAQ,EAAA,QAAA;AAAA,EACR,MAAQ,EAAA;AACV,CAAC,CAAA,EAAG,CAAC,oBAAsB,EAAA;AAAA,EACzB,IAAM,EAAA,KAAA;AAAA,EACN,IAAM,EAAA,CAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAyBR,CAAC,CAAC,CAAC","file":"esm-2XGHW3GB.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.1.0\",\n \"@osdk/react\": \"^0.3.0-beta.0\",\n \"react\": \"^18\",\n \"react-dom\": \"^18\",\n \"react-router-dom\": \"^6.23.1\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^18.0.0\",\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.28.0\",\n \"@typescript-eslint/parser\": \"^8.28.0\",\n \"@vitejs/plugin-react\": \"^4.2.0\",\n \"eslint\": \"^9.19.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.28.0\",\n \"vite\": \"^6.0.12\",\n \"vitest\": \"^3.0.5\"\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// import { useOsdkClient } from \"@osdk/react\";\n\nfunction Home() {\n // const client = useOsdkClient();\n // See API Docs on Developer console on how to use the client object to access the ontology resource\n\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 { 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 { OsdkProvider } from \"@osdk/react\";\nimport ReactDOM from \"react-dom/client\";\nimport { RouterProvider } from \"react-router-dom\";\nimport \"./index.css\";\nimport client from \"./client\";\nimport { router } from \"./router\";\n\nReactDOM.createRoot(document.getElementById(\"root\")!).render(\n <OsdkProvider client={client}>\n <RouterProvider router={router} />,\n </OsdkProvider>,\n);\n`\n}], [\"src/router.tsx\", {\n type: \"raw\",\n body: `import { createBrowserRouter } from \"react-router-dom\";\nimport AuthCallback from \"./AuthCallback\";\nimport Home from \"./Home\";\n\nexport const 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`\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}]]);"]}
|
|
@@ -771,16 +771,14 @@ export default TaskListItem;
|
|
|
771
771
|
`
|
|
772
772
|
}], ["src/client.ts.hbs", {
|
|
773
773
|
type: "raw",
|
|
774
|
-
body: `import {
|
|
774
|
+
body: `import type { Client } from "@osdk/client";
|
|
775
|
+
import { createClient } from "@osdk/client";
|
|
775
776
|
import { createPublicOauthClient } from "@osdk/oauth";
|
|
776
777
|
import { $ontologyRid } from "{{osdkPackage}}";
|
|
777
778
|
|
|
778
779
|
const url = import.meta.env.VITE_FOUNDRY_API_URL;
|
|
779
780
|
const clientId = import.meta.env.VITE_FOUNDRY_CLIENT_ID;
|
|
780
781
|
const redirectUrl = import.meta.env.VITE_FOUNDRY_REDIRECT_URL;
|
|
781
|
-
checkEnv(url, "VITE_FOUNDRY_API_URL");
|
|
782
|
-
checkEnv(clientId, "VITE_FOUNDRY_CLIENT_ID");
|
|
783
|
-
checkEnv(redirectUrl, "VITE_FOUNDRY_REDIRECT_URL");
|
|
784
782
|
{{#if scopes}}
|
|
785
783
|
const scopes = [
|
|
786
784
|
{{#each scopes}}
|
|
@@ -789,6 +787,10 @@ const scopes = [
|
|
|
789
787
|
];
|
|
790
788
|
{{/if}}
|
|
791
789
|
|
|
790
|
+
checkEnv(url, "VITE_FOUNDRY_API_URL");
|
|
791
|
+
checkEnv(clientId, "VITE_FOUNDRY_CLIENT_ID");
|
|
792
|
+
checkEnv(redirectUrl, "VITE_FOUNDRY_REDIRECT_URL");
|
|
793
|
+
|
|
792
794
|
function checkEnv(
|
|
793
795
|
value: string | undefined,
|
|
794
796
|
name: string,
|
|
@@ -798,10 +800,7 @@ function checkEnv(
|
|
|
798
800
|
}
|
|
799
801
|
}
|
|
800
802
|
|
|
801
|
-
|
|
802
|
-
* Initialize the client to interact with the Ontology SDK
|
|
803
|
-
*/
|
|
804
|
-
const auth = createPublicOauthClient(
|
|
803
|
+
export const auth = createPublicOauthClient(
|
|
805
804
|
clientId,
|
|
806
805
|
url,
|
|
807
806
|
redirectUrl,
|
|
@@ -810,13 +809,16 @@ const auth = createPublicOauthClient(
|
|
|
810
809
|
{{/if}}
|
|
811
810
|
);
|
|
812
811
|
|
|
813
|
-
|
|
812
|
+
/**
|
|
813
|
+
* Initialize the client to interact with the Ontology SDK
|
|
814
|
+
*/
|
|
815
|
+
const client: Client = createClient(
|
|
814
816
|
url,
|
|
815
817
|
$ontologyRid,
|
|
816
818
|
auth,
|
|
817
819
|
);
|
|
818
820
|
|
|
819
|
-
export
|
|
821
|
+
export default client;
|
|
820
822
|
`
|
|
821
823
|
}], ["src/env.test.ts", {
|
|
822
824
|
"type": "base64",
|
|
@@ -906,5 +908,5 @@ export default defineConfig({
|
|
|
906
908
|
}]]);
|
|
907
909
|
|
|
908
910
|
export { files };
|
|
909
|
-
//# sourceMappingURL=esm-
|
|
910
|
-
//# sourceMappingURL=esm-
|
|
911
|
+
//# sourceMappingURL=esm-UFOWZVCI.js.map
|
|
912
|
+
//# sourceMappingURL=esm-UFOWZVCI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../create-app.template.tutorial-todo-app.beta/build/esm/generatedNoCheck/index.js"],"names":[],"mappings":"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","file":"esm-UFOWZVCI.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 \"@osdk/client\": \"{{clientVersion}}\",\n \"@osdk/oauth\": \"^1.1.0\",\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.28.0\",\n \"@typescript-eslint/parser\": \"^8.28.0\",\n \"@vitejs/plugin-react\": \"^4.2.0\",\n \"eslint\": \"^9.19.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.28.0\",\n \"vite\": \"^6.0.12\",\n \"vitest\": \"^3.0.5\"\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 { 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/AuthenticatedRoute.tsx\", {\n type: \"raw\",\n body: `import { useEffect, useState } from \"react\";\nimport { Outlet, useNavigate } from \"react-router-dom\";\nimport { auth } 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(auth.getTokenOrUndefined());\n useEffect(() => {\n if (auth.getTokenOrUndefined() == null) {\n auth\n .refresh()\n .then(() => {\n setToken(auth.getTokenOrUndefined());\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) {\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 { IProject } from \"./useProjects\";\nimport { useProjectTasks } from \"./useProjectTasks\";\n\ninterface CreateTaskButtonProps {\n project: IProject;\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 { IProject } from \"./useProjects\";\nimport { useProjectTasks } from \"./useProjectTasks\";\n\ninterface CreateTaskDialogProps {\n project: IProject;\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 useProjects, { IProject } from \"./useProjects\";\n\ninterface DeleteProjectButtonProps {\n project: IProject;\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 useProjects, { IProject } from \"./useProjects\";\n\ninterface DeleteProjectDialogProps {\n project: IProject;\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 ProjectSelect from \"./ProjectSelect\";\nimport TaskList from \"./TaskList\";\nimport useProjects, { IProject } 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: IProject) => 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 { auth } 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 = auth.getTokenOrUndefined();\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 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 { IProject } from \"./useProjects\";\n\ninterface ProjectSelectProps {\n project: IProject | undefined;\n projects: IProject[];\n onSelectProject: (project: IProject) => 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 css from \"./TaskList.module.css\";\nimport TaskListItem from \"./TaskListItem\";\nimport { IProject } from \"./useProjects\";\nimport { useProjectTasks } from \"./useProjectTasks\";\n\ninterface TaskListProps {\n project: IProject;\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 css from \"./TaskListItem.module.css\";\nimport { ITask } from \"./useProjectTasks\";\n\ninterface TaskListItemProps {\n task: ITask;\n deleteTask: (task: ITask) => 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 type { Client } from \"@osdk/client\";\nimport { createClient } from \"@osdk/client\";\nimport { createPublicOauthClient } from \"@osdk/oauth\";\nimport { \\$ontologyRid } 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;\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 { 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\": \"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\": \"aW1wb3J0IHsgSVByb2plY3QgfSBmcm9tICIuL3VzZVByb2plY3RzIjsKaW1wb3J0IHsgSVRhc2sgfSBmcm9tICIuL3VzZVByb2plY3RUYXNrcyI7Cgpjb25zdCBwcm9qZWN0czogSVByb2plY3RbXSA9IFsKICB7CiAgICAkYXBpTmFtZTogIk1vY2tQcm9qZWN0IiwKICAgICRwcmltYXJ5S2V5OiAiMSIsCiAgICBpZDogIjEiLAogICAgbmFtZTogIk1vY2sgcHJvamVjdCIsCiAgfSwKICB7CiAgICAkYXBpTmFtZTogIk1vY2tQcm9qZWN0IiwKICAgICRwcmltYXJ5S2V5OiAiMiIsCiAgICBpZDogIjIiLAogICAgbmFtZTogIllldCBhbm90aGVyIG1vY2sgcHJvamVjdCIsCiAgfSwKXTsKCmNvbnN0IHRhc2tzOiBJVGFza1tdID0gWwogIHsKICAgICRhcGlOYW1lOiAiTW9ja1Rhc2siLAogICAgJHByaW1hcnlLZXk6ICIxIiwKICAgIGlkOiAiMSIsCiAgICB0aXRsZTogIlRyeSB0byIsCiAgICBwcm9qZWN0SWQ6ICIxIiwKICB9LAogIHsKICAgICRhcGlOYW1lOiAiTW9ja1Rhc2siLAogICAgJHByaW1hcnlLZXk6ICIyIiwKICAgIGlkOiAiMiIsCiAgICB0aXRsZTogIkltcGxlbWVudCB0aGlzIiwKICAgIHByb2plY3RJZDogIjEiLAogIH0sCiAgewogICAgJGFwaU5hbWU6ICJNb2NrVGFzayIsCiAgICAkcHJpbWFyeUtleTogIjMiLAogICAgaWQ6ICIzIiwKICAgIHRpdGxlOiAiV2l0aCB0aGUgT250b2xvZ3kgU0RLISIsCiAgICBwcm9qZWN0SWQ6ICIxIiwKICB9LAogIHsKICAgICRhcGlOYW1lOiAiTW9ja1Rhc2siLAogICAgJHByaW1hcnlLZXk6ICI0IiwKICAgIGlkOiAiNCIsCiAgICB0aXRsZTogIk1vcmUgdGFza3MgaGVyZSIsCiAgICBwcm9qZWN0SWQ6ICIyIiwKICB9LApdOwoKYXN5bmMgZnVuY3Rpb24gZGVsYXkoKTogUHJvbWlzZTx2b2lkPiB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PgogICAgc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIDUwMCArIE1hdGgucmFuZG9tKCkgKiAxMDAwKQogICk7Cn0KCi8vIEdvb2QgZW5vdWdoIHJhbmRvbSBpZCBmb3IgbW9ja3MKZnVuY3Rpb24gcmFuZG9tSWQoKTogc3RyaW5nIHsKICByZXR1cm4gYCR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMiAqKiAzMSl9YDsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0UHJvamVjdHMoKTogUHJvbWlzZTxJUHJvamVjdFtdPiB7CiAgYXdhaXQgZGVsYXkoKTsKICBjb25zdCByZXN1bHQgPSBbLi4ucHJvamVjdHNdOwogIHJlc3VsdC5zb3J0KChwMSwgcDIpID0+IHAxLm5hbWUubG9jYWxlQ29tcGFyZShwMi5uYW1lKSk7CiAgcmV0dXJuIHJlc3VsdDsKfQoKYXN5bmMgZnVuY3Rpb24gY3JlYXRlUHJvamVjdCh7CiAgbmFtZSwKfTogewogIG5hbWU6IHN0cmluZzsKfSk6IFByb21pc2U8SVByb2plY3RbIiRwcmltYXJ5S2V5Il0+IHsKICBhd2FpdCBkZWxheSgpOwogIGNvbnN0IGlkID0gcmFuZG9tSWQoKTsKICBwcm9qZWN0cy5wdXNoKHsKICAgICRhcGlOYW1lOiAiTW9ja1Byb2plY3QiLAogICAgJHByaW1hcnlLZXk6IGlkLAogICAgaWQsCiAgICBuYW1lLAogIH0pOwogIHJldHVybiBpZDsKfQoKYXN5bmMgZnVuY3Rpb24gZGVsZXRlUHJvamVjdChpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7CiAgYXdhaXQgZGVsYXkoKTsKICBjb25zdCBpZHggPSBwcm9qZWN0cy5maW5kSW5kZXgoKHApID0+IHAuaWQgPT09IGlkKTsKICBpZiAoaWR4ICE9PSAtMSkgewogICAgcHJvamVjdHMuc3BsaWNlKGlkeCwgMSk7CiAgfQp9Cgphc3luYyBmdW5jdGlvbiBnZXRQcm9qZWN0VGFza3MocHJvamVjdElkOiBzdHJpbmcpOiBQcm9taXNlPElUYXNrW10+IHsKICBhd2FpdCBkZWxheSgpOwogIHJldHVybiB0YXNrcy5maWx0ZXIoKHQpID0+IHQucHJvamVjdElkID09PSBwcm9qZWN0SWQpOwp9Cgphc3luYyBmdW5jdGlvbiBjcmVhdGVUYXNrKHsKICB0aXRsZSwKICBwcm9qZWN0SWQsCn06IHsKICB0aXRsZTogc3RyaW5nOwogIHByb2plY3RJZDogc3RyaW5nOwp9KTogUHJvbWlzZTxJVGFza1siJHByaW1hcnlLZXkiXT4gewogIGF3YWl0IGRlbGF5KCk7CiAgY29uc3QgdGFzayA9IHRhc2tzLmZpbmQoKHQpID0+IHQucHJvamVjdElkID09PSBwcm9qZWN0SWQpOwogIGlmICh0YXNrID09IG51bGwpIHsKICAgIHRocm93IG5ldyBFcnJvcihgUHJvamVjdCAke3Byb2plY3RJZH0gbm90IGZvdW5kIWApOwogIH0KICBjb25zdCBpZCA9IHJhbmRvbUlkKCk7CiAgdGFza3MudW5zaGlmdCh7CiAgICAkYXBpTmFtZTogIk1vY2tUYXNrIiwKICAgICRwcmltYXJ5S2V5OiBpZCwKICAgIGlkLAogICAgdGl0bGUsCiAgICBwcm9qZWN0SWQsCiAgfSk7CiAgcmV0dXJuIGlkOwp9Cgphc3luYyBmdW5jdGlvbiBkZWxldGVUYXNrKGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHsKICBhd2FpdCBkZWxheSgpOwogIGNvbnN0IGlkeCA9IHRhc2tzLmZpbmRJbmRleCgodCkgPT4gdC5wcm9qZWN0SWQgPT09IGlkKTsKICBpZiAoaWR4ICE9PSAtMSkgewogICAgdGFza3Muc3BsaWNlKGlkeCwgMSk7CiAgfQp9Cgpjb25zdCBNb2NrcyA9IHsKICBnZXRQcm9qZWN0cywKICBjcmVhdGVQcm9qZWN0LAogIGRlbGV0ZVByb2plY3QsCiAgZ2V0UHJvamVjdFRhc2tzLAogIGNyZWF0ZVRhc2ssCiAgZGVsZXRlVGFzaywKfTsKCmV4cG9ydCBkZWZhdWx0IE1vY2tzOwo=\"\n}], [\"src/useProjectTasks.ts\", {\n \"type\": \"base64\",\n \"body\": \"aW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICJyZWFjdCI7CmltcG9ydCB1c2VTV1IgZnJvbSAic3dyIjsKaW1wb3J0IE1vY2tzIGZyb20gIi4vbW9ja3MiOwppbXBvcnQgeyBJUHJvamVjdCB9IGZyb20gIi4vdXNlUHJvamVjdHMiOwoKZXhwb3J0IGludGVyZmFjZSBJVGFzayB7CiAgJGFwaU5hbWU6IHN0cmluZzsKICAkcHJpbWFyeUtleTogc3RyaW5nOwogIGlkOiBzdHJpbmc7CiAgdGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZDsKICBwcm9qZWN0SWQ6IHN0cmluZzsKfQoKZXhwb3J0IGZ1bmN0aW9uIHVzZVByb2plY3RUYXNrcyhwcm9qZWN0OiBJUHJvamVjdCB8IHVuZGVmaW5lZCkgewogIGNvbnN0IHsgZGF0YSwgaXNMb2FkaW5nLCBpc1ZhbGlkYXRpbmcsIGVycm9yLCBtdXRhdGUgfSA9IHVzZVNXUjxJVGFza1tdPigKICAgIHByb2plY3QgIT0gbnVsbCA\\u002FIGBwcm9qZWN0cy8ke3Byb2plY3QuaWR9L3Rhc2tzYCA6IG51bGwsCiAgICAvLyBUcnkgdG8gaW1wbGVtZW50IHRoaXMgd2l0aCB0aGUgT250b2xvZ3kgU0RLIQogICAgYXN5bmMgKCkgPT4gewogICAgICBpZiAocHJvamVjdCA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIFtdOwogICAgICB9CiAgICAgIHJldHVybiAoYXdhaXQgTW9ja3MuZ2V0UHJvamVjdFRhc2tzKHByb2plY3QuJHByaW1hcnlLZXkpKTsKICAgIH0sCiAgKTsKCiAgY29uc3QgY3JlYXRlVGFzazogKAogICAgdGl0bGU6IHN0cmluZywKICApID0+IFByb21pc2U8SVRhc2tbIiRwcmltYXJ5S2V5Il0gfCB1bmRlZmluZWQ+ID0gdXNlQ2FsbGJhY2soCiAgICBhc3luYyAodGl0bGUpID0+IHsKICAgICAgaWYgKHByb2plY3QgPT0gbnVsbCkgewogICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgIH0KICAgICAgLy8gVHJ5IHRvIGltcGxlbWVudCB0aGlzIHdpdGggdGhlIE9udG9sb2d5IFNESyEKICAgICAgY29uc3QgaWQgPSBhd2FpdCBNb2Nrcy5jcmVhdGVUYXNrKHsKICAgICAgICB0aXRsZSwKICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3QuJHByaW1hcnlLZXksCiAgICAgIH0pOwogICAgICBhd2FpdCBtdXRhdGUoKTsKICAgICAgcmV0dXJuIGlkOwogICAgfSwKICAgIFtwcm9qZWN0LCBtdXRhdGVdLAogICk7CgogIGNvbnN0IGRlbGV0ZVRhc2s6ICh0YXNrOiBJVGFzaykgPT4gUHJvbWlzZTx2b2lkPiA9IHVzZUNhbGxiYWNrKAogICAgYXN5bmMgKHRhc2spID0+IHsKICAgICAgaWYgKHByb2plY3QgPT0gbnVsbCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBUcnkgdG8gaW1wbGVtZW50IHRoaXMgd2l0aCB0aGUgT250b2xvZ3kgU0RLIQogICAgICBhd2FpdCBNb2Nrcy5kZWxldGVUYXNrKHRhc2suJHByaW1hcnlLZXkpOwogICAgICBhd2FpdCBtdXRhdGUoKTsKICAgIH0sCiAgICBbcHJvamVjdCwgbXV0YXRlXSwKICApOwoKICByZXR1cm4gewogICAgdGFza3M6IGRhdGEsCiAgICBpc0xvYWRpbmcsCiAgICBpc1ZhbGlkYXRpbmcsCiAgICBpc0Vycm9yOiBlcnJvciwKICAgIGNyZWF0ZVRhc2ssCiAgICBkZWxldGVUYXNrLAogIH07Cn0K\"\n}], [\"src/useProjects.ts\", {\n \"type\": \"base64\",\n \"body\": \"aW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICJyZWFjdCI7CmltcG9ydCB1c2VTV1IgZnJvbSAic3dyIjsKaW1wb3J0IE1vY2tzIGZyb20gIi4vbW9ja3MiOwoKZXhwb3J0IGludGVyZmFjZSBJUHJvamVjdCB7CiAgJGFwaU5hbWU6IHN0cmluZzsKICAkcHJpbWFyeUtleTogc3RyaW5nOwogIGlkOiBzdHJpbmc7CiAgbmFtZTogc3RyaW5nOwp9CgpmdW5jdGlvbiB1c2VQcm9qZWN0cygpIHsKICBjb25zdCB7IGRhdGEsIGlzTG9hZGluZywgaXNWYWxpZGF0aW5nLCBlcnJvciwgbXV0YXRlIH0gPSB1c2VTV1I8SVByb2plY3RbXT4oCiAgICAicHJvamVjdHMiLAogICAgYXN5bmMgKCkgPT4gewogICAgICAvLyBUcnkgdG8gaW1wbGVtZW50IHRoaXMgd2l0aCB0aGUgT250b2xvZ3kgU0RLIQogICAgICBjb25zdCBwcm9qZWN0c0xpc3Q6IElQcm9qZWN0W10gPSAoYXdhaXQgTW9ja3MuZ2V0UHJvamVjdHMoKSkubWFwKCgKICAgICAgICBwcm9qZWN0LAogICAgICApID0+ICh7CiAgICAgICAgJGFwaU5hbWU6IHByb2plY3QuJGFwaU5hbWUsCiAgICAgICAgJHByaW1hcnlLZXk6IHByb2plY3QuJHByaW1hcnlLZXksCiAgICAgICAgaWQ6IHByb2plY3QuaWQsCiAgICAgICAgbmFtZTogcHJvamVjdC5uYW1lIHx8ICIiLAogICAgICB9KSk7CiAgICAgIHJldHVybiBwcm9qZWN0c0xpc3Q7CiAgICB9LAogICk7CgogIGNvbnN0IGNyZWF0ZVByb2plY3Q6IChuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8SVByb2plY3RbIiRwcmltYXJ5S2V5Il0+ID0KICAgIHVzZUNhbGxiYWNrKAogICAgICBhc3luYyAobmFtZSkgPT4gewogICAgICAgIC8vIFRyeSB0byBpbXBsZW1lbnQgdGhpcyB3aXRoIHRoZSBPbnRvbG9neSBTREshCiAgICAgICAgY29uc3QgaWQgPSBhd2FpdCBNb2Nrcy5jcmVhdGVQcm9qZWN0KHsgbmFtZSB9KTsKICAgICAgICBhd2FpdCBtdXRhdGUoKTsKICAgICAgICByZXR1cm4gaWQ7CiAgICAgIH0sCiAgICAgIFttdXRhdGVdLAogICAgKTsKCiAgY29uc3QgZGVsZXRlUHJvamVjdDogKHByb2plY3Q6IElQcm9qZWN0KSA9PiBQcm9taXNlPHZvaWQ+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}]]);"]}
|
|
@@ -1038,16 +1038,14 @@ export default TaskListItem;
|
|
|
1038
1038
|
`
|
|
1039
1039
|
}], ["src/client.ts.hbs", {
|
|
1040
1040
|
type: "raw",
|
|
1041
|
-
body: `import {
|
|
1041
|
+
body: `import type { Client } from "@osdk/client";
|
|
1042
|
+
import { createClient } from "@osdk/client";
|
|
1042
1043
|
import { createPublicOauthClient } from "@osdk/oauth";
|
|
1043
1044
|
import { $ontologyRid } from "{{osdkPackage}}";
|
|
1044
1045
|
|
|
1045
1046
|
const url = import.meta.env.VITE_FOUNDRY_API_URL;
|
|
1046
1047
|
const clientId = import.meta.env.VITE_FOUNDRY_CLIENT_ID;
|
|
1047
1048
|
const redirectUrl = import.meta.env.VITE_FOUNDRY_REDIRECT_URL;
|
|
1048
|
-
checkEnv(url, "VITE_FOUNDRY_API_URL");
|
|
1049
|
-
checkEnv(clientId, "VITE_FOUNDRY_CLIENT_ID");
|
|
1050
|
-
checkEnv(redirectUrl, "VITE_FOUNDRY_REDIRECT_URL");
|
|
1051
1049
|
{{#if scopes}}
|
|
1052
1050
|
const scopes = [
|
|
1053
1051
|
{{#each scopes}}
|
|
@@ -1056,6 +1054,10 @@ const scopes = [
|
|
|
1056
1054
|
];
|
|
1057
1055
|
{{/if}}
|
|
1058
1056
|
|
|
1057
|
+
checkEnv(url, "VITE_FOUNDRY_API_URL");
|
|
1058
|
+
checkEnv(clientId, "VITE_FOUNDRY_CLIENT_ID");
|
|
1059
|
+
checkEnv(redirectUrl, "VITE_FOUNDRY_REDIRECT_URL");
|
|
1060
|
+
|
|
1059
1061
|
function checkEnv(
|
|
1060
1062
|
value: string | undefined,
|
|
1061
1063
|
name: string,
|
|
@@ -1065,10 +1067,7 @@ function checkEnv(
|
|
|
1065
1067
|
}
|
|
1066
1068
|
}
|
|
1067
1069
|
|
|
1068
|
-
|
|
1069
|
-
* Initialize the client to interact with the Ontology SDK
|
|
1070
|
-
*/
|
|
1071
|
-
const auth = createPublicOauthClient(
|
|
1070
|
+
export const auth = createPublicOauthClient(
|
|
1072
1071
|
clientId,
|
|
1073
1072
|
url,
|
|
1074
1073
|
redirectUrl,
|
|
@@ -1077,13 +1076,16 @@ const auth = createPublicOauthClient(
|
|
|
1077
1076
|
{{/if}}
|
|
1078
1077
|
);
|
|
1079
1078
|
|
|
1080
|
-
|
|
1079
|
+
/**
|
|
1080
|
+
* Initialize the client to interact with the Ontology SDK
|
|
1081
|
+
*/
|
|
1082
|
+
const client: Client = createClient(
|
|
1081
1083
|
url,
|
|
1082
1084
|
$ontologyRid,
|
|
1083
1085
|
auth,
|
|
1084
1086
|
);
|
|
1085
1087
|
|
|
1086
|
-
export
|
|
1088
|
+
export default client;
|
|
1087
1089
|
`
|
|
1088
1090
|
}], ["src/env.test.ts", {
|
|
1089
1091
|
"type": "base64",
|
|
@@ -1173,5 +1175,5 @@ export default defineConfig({
|
|
|
1173
1175
|
}]]);
|
|
1174
1176
|
|
|
1175
1177
|
export { files };
|
|
1176
|
-
//# sourceMappingURL=esm-
|
|
1177
|
-
//# sourceMappingURL=esm-
|
|
1178
|
+
//# sourceMappingURL=esm-WOD3ZASU.js.map
|
|
1179
|
+
//# sourceMappingURL=esm-WOD3ZASU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../create-app.template.tutorial-todo-aip-app.beta/build/esm/generatedNoCheck/index.js"],"names":[],"mappings":"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","file":"esm-WOD3ZASU.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 \"@osdk/client\": \"{{clientVersion}}\",\n \"@osdk/oauth\": \"^1.1.0\",\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.28.0\",\n \"@typescript-eslint/parser\": \"^8.28.0\",\n \"@vitejs/plugin-react\": \"^4.2.0\",\n \"eslint\": \"^9.19.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.28.0\",\n \"vite\": \"^6.0.12\",\n \"vitest\": \"^3.0.5\"\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 { 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/AuthenticatedRoute.tsx\", {\n type: \"raw\",\n body: `import { useEffect, useState } from \"react\";\nimport { Outlet, useNavigate } from \"react-router-dom\";\nimport { auth } 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(auth.getTokenOrUndefined());\n useEffect(() => {\n if (auth.getTokenOrUndefined() == null) {\n auth\n .refresh()\n .then(() => {\n setToken(auth.getTokenOrUndefined());\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) {\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 { IProject } from \"./useProjects\";\nimport { useProjectTasks } from \"./useProjectTasks\";\n\ninterface CreateTaskButtonProps {\n project: IProject;\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 { IProject } from \"./useProjects\";\nimport { useProjectTasks } from \"./useProjectTasks\";\n\ninterface CreateTaskDialogProps {\n project: IProject;\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 useProjects, { IProject } from \"./useProjects\";\n\ninterface DeleteProjectButtonProps {\n project: IProject;\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 useProjects, { IProject } from \"./useProjects\";\n\ninterface DeleteProjectDialogProps {\n project: IProject;\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 { ProjectDetails } from \"./ProjectDetails\";\nimport ProjectSelect from \"./ProjectSelect\";\nimport useProjects, { IProject } 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: IProject) => 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 { auth } 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 = auth.getTokenOrUndefined();\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 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 css from \"./ProjectDetails.module.css\";\nimport TaskList from \"./TaskList\";\nimport useProjects, { IProject } from \"./useProjects\";\nimport { useProjectTasks } from \"./useProjectTasks\";\n\ninterface ProjectDetailsProps {\n project: IProject;\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 { IProject } from \"./useProjects\";\n\ninterface ProjectSelectProps {\n project: IProject | undefined;\n projects: IProject[];\n onSelectProject: (project: IProject) => 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 css from \"./TaskList.module.css\";\nimport TaskListItem from \"./TaskListItem\";\nimport { IProject } from \"./useProjects\";\nimport { useProjectTasks } from \"./useProjectTasks\";\n\ninterface TaskListProps {\n project: IProject;\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 css from \"./TaskListItem.module.css\";\nimport { ITask } from \"./useProjectTasks\";\n\ninterface TaskListItemProps {\n task: ITask;\n deleteTask: (task: ITask) => 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 type { Client } from \"@osdk/client\";\nimport { createClient } from \"@osdk/client\";\nimport { createPublicOauthClient } from \"@osdk/oauth\";\nimport { \\$ontologyRid } 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;\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 { 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\": \"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\": \"aW1wb3J0IHsgSVByb2plY3QgfSBmcm9tICIuL3VzZVByb2plY3RzIjsKaW1wb3J0IHsgSVRhc2sgfSBmcm9tICIuL3VzZVByb2plY3RUYXNrcyI7Cgpjb25zdCBwcm9qZWN0czogSVByb2plY3RbXSA9IFsKICB7CiAgICAkYXBpTmFtZTogIk1vY2tQcm9qZWN0IiwKICAgICRwcmltYXJ5S2V5OiAiMSIsCiAgICBpZDogIjEiLAogICAgbmFtZTogIk1vY2sgcHJvamVjdCIsCiAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgYSBtb2NrIGRlc2NyaXB0aW9uIiwKICB9LAogIHsKICAgICRhcGlOYW1lOiAiTW9ja1Byb2plY3QiLAogICAgJHByaW1hcnlLZXk6ICIyIiwKICAgIGlkOiAiMiIsCiAgICBuYW1lOiAiWWV0IGFub3RoZXIgbW9jayBwcm9qZWN0IiwKICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBpcyBhbm90aGVyIG1vY2sgZGVzY3JpcHRpb24iLAogIH0sCl07Cgpjb25zdCB0YXNrczogSVRhc2tbXSA9IFsKICB7CiAgICAkYXBpTmFtZTogIk1vY2tUYXNrIiwKICAgICRwcmltYXJ5S2V5OiAiMSIsCiAgICBpZDogIjEiLAogICAgdGl0bGU6ICJUcnkgdG8iLAogICAgZGVzY3JpcHRpb246ICJ0YXNrIGRlc2NyaXB0aW9uIDEiLAogICAgcHJvamVjdElkOiAiMSIsCiAgfSwKICB7CiAgICAkYXBpTmFtZTogIk1vY2tUYXNrIiwKICAgICRwcmltYXJ5S2V5OiAiMiIsCiAgICBpZDogIjIiLAogICAgdGl0bGU6ICJJbXBsZW1lbnQgdGhpcyIsCiAgICBkZXNjcmlwdGlvbjogInRhc2sgZGVzY3JpcHRpb24gMiIsCiAgICBwcm9qZWN0SWQ6ICIxIiwKICB9LAogIHsKICAgICRhcGlOYW1lOiAiTW9ja1Rhc2siLAogICAgJHByaW1hcnlLZXk6ICIzIiwKICAgIGlkOiAiMyIsCiAgICB0aXRsZTogIldpdGggdGhlIE9udG9sb2d5IFNESyEiLAogICAgZGVzY3JpcHRpb246ICJ0YXNrIGRlc2NyaXB0aW9uIDMiLAogICAgcHJvamVjdElkOiAiMSIsCiAgfSwKICB7CiAgICAkYXBpTmFtZTogIk1vY2tUYXNrIiwKICAgICRwcmltYXJ5S2V5OiAiNCIsCiAgICBpZDogIjQiLAogICAgdGl0bGU6ICJNb3JlIHRhc2tzIGhlcmUiLAogICAgZGVzY3JpcHRpb246ICJNb3JlIHRhc2sgZGVzY3JpcHRpb24iLAogICAgcHJvamVjdElkOiAiMiIsCiAgfSwKXTsKYXN5bmMgZnVuY3Rpb24gZGVsYXkoKTogUHJvbWlzZTx2b2lkPiB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PgogICAgc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIDUwMCArIE1hdGgucmFuZG9tKCkgKiAxMDAwKQogICk7Cn0KCi8vIEdvb2QgZW5vdWdoIHJhbmRvbSBpZCBmb3IgbW9ja3MKZnVuY3Rpb24gcmFuZG9tSWQoKTogc3RyaW5nIHsKICByZXR1cm4gYCR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMiAqKiAzMSl9YDsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0UHJvamVjdHMoKTogUHJvbWlzZTxJUHJvamVjdFtdPiB7CiAgYXdhaXQgZGVsYXkoKTsKICBjb25zdCByZXN1bHQgPSBbLi4ucHJvamVjdHNdOwogIHJlc3VsdC5zb3J0KChwMSwgcDIpID0+IHAxLm5hbWUubG9jYWxlQ29tcGFyZShwMi5uYW1lKSk7CiAgcmV0dXJuIHJlc3VsdDsKfQoKYXN5bmMgZnVuY3Rpb24gY3JlYXRlUHJvamVjdCh7CiAgbmFtZSwKfTogewogIG5hbWU6IHN0cmluZzsKICBkZXNjcmlwdGlvbj86IHN0cmluZzsKfSk6IFByb21pc2U8SVByb2plY3RbIiRwcmltYXJ5S2V5Il0+IHsKICBhd2FpdCBkZWxheSgpOwogIGNvbnN0IGlkID0gcmFuZG9tSWQoKTsKICBwcm9qZWN0cy5wdXNoKHsKICAgICRhcGlOYW1lOiAiTW9ja1Byb2plY3QiLAogICAgJHByaW1hcnlLZXk6IGlkLAogICAgaWQsCiAgICBuYW1lLAogICAgZGVzY3JpcHRpb246ICIiLAogIH0pOwogIHJldHVybiBpZDsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0UmVjb21tZW5kZWRQcm9qZWN0RGVzY3JpcHRpb24oCiAgcHJvamVjdDogSVByb2plY3QsCik6IFByb21pc2U8c3RyaW5nPiB7CiAgYXdhaXQgZGVsYXkoKTsKICBjb25zdCBwcm9qZWN0VGFza3MgPSB0YXNrcy5maWx0ZXIoKHQpID0+IHQucHJvamVjdElkID09PSBwcm9qZWN0LmlkKTsKICBpZiAocHJvamVjdFRhc2tzLmxlbmd0aCA9PT0gMCkgewogICAgdGhyb3cgbmV3IEVycm9yKCJQcm9qZWN0IGRlc2NyaXB0aW9uIHJlY29tbWVuZGF0aW9uIHJlcXVpcmVzIHRhc2tzIik7CiAgfQogIHJldHVybiBgQUlQIExvZ2ljIG1vY2sgZGVzY3JpcHRpb24gZm9yIHByb2plY3RgOwp9Cgphc3luYyBmdW5jdGlvbiB1cGRhdGVQcm9qZWN0RGVzY3JpcHRpb24oCiAgcHJvamVjdDogSVByb2plY3QsCik6IFByb21pc2U8dm9pZD4gewogIGF3YWl0IGRlbGF5KCk7CiAgcHJvamVjdC5kZXNjcmlwdGlvbiA9IGF3YWl0IGdldFJlY29tbWVuZGVkUHJvamVjdERlc2NyaXB0aW9uKHByb2plY3QpOwp9Cgphc3luYyBmdW5jdGlvbiBkZWxldGVQcm9qZWN0KGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHsKICBhd2FpdCBkZWxheSgpOwogIGNvbnN0IGlkeCA9IHByb2plY3RzLmZpbmRJbmRleCgocCkgPT4gcC5pZCA9PT0gaWQpOwogIGlmIChpZHggIT09IC0xKSB7CiAgICBwcm9qZWN0cy5zcGxpY2UoaWR4LCAxKTsKICB9Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldFByb2plY3RUYXNrcyhwcm9qZWN0SWQ6IHN0cmluZyk6IFByb21pc2U8SVRhc2tbXT4gewogIGF3YWl0IGRlbGF5KCk7CiAgcmV0dXJuIHRhc2tzLmZpbHRlcigodCkgPT4gdC5wcm9qZWN0SWQgPT09IHByb2plY3RJZCk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRhc2soewogIHRpdGxlLAogIGRlc2NyaXB0aW9uID0gIiIsCiAgcHJvamVjdElkLAp9OiB7CiAgdGl0bGU6IHN0cmluZzsKICBkZXNjcmlwdGlvbjogc3RyaW5nOwogIHByb2plY3RJZDogc3RyaW5nOwp9KTogUHJvbWlzZTxJVGFza1siJHByaW1hcnlLZXkiXT4gewogIGF3YWl0IGRlbGF5KCk7CiAgY29uc3QgcHJvamVjdCA9IHByb2plY3RzLmZpbmQoKHApID0+IHAuaWQgPT09IHByb2plY3RJZCk7CiAgaWYgKHByb2plY3QgPT0gbnVsbCkgewogICAgdGhyb3cgbmV3IEVycm9yKGBQcm9qZWN0ICR7cHJvamVjdElkfSBub3QgZm91bmQhYCk7CiAgfQogIGNvbnN0IGlkID0gcmFuZG9tSWQoKTsKICB0YXNrcy51bnNoaWZ0KHsKICAgICRhcGlOYW1lOiAiTW9ja1Rhc2siLAogICAgJHByaW1hcnlLZXk6IGlkLAogICAgaWQsCiAgICB0aXRsZSwKICAgIGRlc2NyaXB0aW9uLAogICAgcHJvamVjdElkLAogIH0pOwogIHJldHVybiBpZDsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0UmVjb21tZW5kZWRUYXNrRGVzY3JpcHRpb24oCiAgdGFza05hbWU6IHN0cmluZywKKTogUHJvbWlzZTxzdHJpbmc+IHsKICBhd2FpdCBkZWxheSgpOwogIGlmICh0YXNrTmFtZS5sZW5ndGggPT09IDApIHsKICAgIHRocm93IG5ldyBFcnJvcigiVGFzayBuYW1lIG11c3Qgbm90IGJlIGVtcHR5Iik7CiAgfQogIHJldHVybiBgTW9jayBBSVAgZGVzY3JpcHRpb24gZm9yIHRhc2tgOwp9Cgphc3luYyBmdW5jdGlvbiBkZWxldGVUYXNrKGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHsKICBhd2FpdCBkZWxheSgpOwogIGNvbnN0IGlkeCA9IHRhc2tzLmZpbmRJbmRleCgodCkgPT4gdC5pZCA9PT0gaWQpOwogIGlmIChpZHggIT09IC0xKSB7CiAgICB0YXNrcy5zcGxpY2UoaWR4LCAxKTsKICB9Cn0KCmNvbnN0IE1vY2tzID0gewogIGdldFByb2plY3RzLAogIGNyZWF0ZVByb2plY3QsCiAgZ2V0UmVjb21tZW5kZWRQcm9qZWN0RGVzY3JpcHRpb24sCiAgZGVsZXRlUHJvamVjdCwKICBnZXRQcm9qZWN0VGFza3MsCiAgY3JlYXRlVGFzaywKICBkZWxldGVUYXNrLAogIGdldFJlY29tbWVuZGVkVGFza0Rlc2NyaXB0aW9uLAogIHVwZGF0ZVByb2plY3REZXNjcmlwdGlvbiwKfTsKCmV4cG9ydCBkZWZhdWx0IE1vY2tzOwo=\"\n}], [\"src/useProjectTasks.ts\", {\n \"type\": \"base64\",\n \"body\": \"aW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICJyZWFjdCI7CmltcG9ydCB1c2VTV1IgZnJvbSAic3dyIjsKaW1wb3J0IE1vY2tzIGZyb20gIi4vbW9ja3MiOwppbXBvcnQgeyBJUHJvamVjdCB9IGZyb20gIi4vdXNlUHJvamVjdHMiOwoKZXhwb3J0IGludGVyZmFjZSBJVGFzayB7CiAgJGFwaU5hbWU6IHN0cmluZzsKICAkcHJpbWFyeUtleTogc3RyaW5nOwogIGlkOiBzdHJpbmc7CiAgdGl0bGU6IHN0cmluZzsKICBkZXNjcmlwdGlvbjogc3RyaW5nOwogIHByb2plY3RJZDogc3RyaW5nOwp9CgpleHBvcnQgZnVuY3Rpb24gdXNlUHJvamVjdFRhc2tzKHByb2plY3Q6IElQcm9qZWN0IHwgdW5kZWZpbmVkKSB7CiAgY29uc3QgeyBkYXRhLCBpc0xvYWRpbmcsIGlzVmFsaWRhdGluZywgZXJyb3IsIG11dGF0ZSB9ID0gdXNlU1dSPElUYXNrW10+KAogICAgcHJvamVjdCAhPSBudWxsID8gYHByb2plY3RzLyR7cHJvamVjdC5pZH0vdGFza3NgIDogbnVsbCwKICAgIC8vIFRyeSB0byBpbXBsZW1lbnQgdGhpcyB3aXRoIHRoZSBPbnRvbG9neSBTREshCiAgICBhc3luYyAoKSA9PiB7CiAgICAgIGlmIChwcm9qZWN0ID09IG51bGwpIHsKICAgICAgICByZXR1cm4gW107CiAgICAgIH0KICAgICAgcmV0dXJuIE1vY2tzLmdldFByb2plY3RUYXNrcyhwcm9qZWN0LiRwcmltYXJ5S2V5KTsKICAgIH0sCiAgKTsKCiAgY29uc3QgY3JlYXRlVGFzazogKAogICAgdGl0bGU6IHN0cmluZywKICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsCiAgKSA9PiBQcm9taXNlPElUYXNrWyIkcHJpbWFyeUtleSJdIHwgdW5kZWZpbmVkPiA9IHVzZUNhbGxiYWNrKAogICAgYXN5bmMgKHRpdGxlOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcpID0+IHsKICAgICAgaWYgKHByb2plY3QgPT0gbnVsbCkgewogICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgIH0KICAgICAgLy8gVHJ5IHRvIGltcGxlbWVudCB0aGlzIHdpdGggdGhlIE9udG9sb2d5IFNESyEKICAgICAgY29uc3QgaWQgPSBhd2FpdCBNb2Nrcy5jcmVhdGVUYXNrKHsKICAgICAgICB0aXRsZSwKICAgICAgICBkZXNjcmlwdGlvbiwKICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3QuJHByaW1hcnlLZXksCiAgICAgIH0pOwogICAgICBhd2FpdCBtdXRhdGUoKTsKICAgICAgcmV0dXJuIGlkOwogICAgfSwKICAgIFtwcm9qZWN0LCBtdXRhdGVdLAogICk7CgogIGNvbnN0IGRlbGV0ZVRhc2s6ICh0YXNrOiBJVGFzaykgPT4gUHJvbWlzZTx2b2lkPiA9IHVzZUNhbGxiYWNrKAogICAgYXN5bmMgKHRhc2spID0+IHsKICAgICAgaWYgKHByb2plY3QgPT0gbnVsbCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBUcnkgdG8gaW1wbGVtZW50IHRoaXMgd2l0aCB0aGUgT250b2xvZ3kgU0RLIQogICAgICBhd2FpdCBNb2Nrcy5kZWxldGVUYXNrKHRhc2suJHByaW1hcnlLZXkpOwogICAgICBhd2FpdCBtdXRhdGUoKTsKICAgIH0sCiAgICBbcHJvamVjdCwgbXV0YXRlXSwKICApOwoKICBjb25zdCBnZXRSZWNvbW1lbmRlZFRhc2tEZXNjcmlwdGlvbjogKHRhc2tOYW1lOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPiA9CiAgICB1c2VDYWxsYmFjaygKICAgICAgYXN5bmMgKHRhc2tOYW1lOiBzdHJpbmcpID0+IHsKICAgICAgICAvLyBUcnkgdG8gaW1wbGVtZW50IHRoaXMgd2l0aCB0aGUgT250b2xvZ3kgU0RLIQogICAgICAgIGNvbnN0IHJlY29tbWVuZGVkVGFza0Rlc2NyaXB0aW9uID0gYXdhaXQgTW9ja3MKICAgICAgICAgIC5nZXRSZWNvbW1lbmRlZFRhc2tEZXNjcmlwdGlvbih0YXNrTmFtZSk7CiAgICAgICAgYXdhaXQgbXV0YXRlKCk7CiAgICAgICAgcmV0dXJuIHJlY29tbWVuZGVkVGFza0Rlc2NyaXB0aW9uOwogICAgICB9LAogICAgICBbbXV0YXRlXSwKICAgICk7CgogIHJldHVybiB7CiAgICB0YXNrczogZGF0YSwKICAgIGlzTG9hZGluZywKICAgIGlzVmFsaWRhdGluZywKICAgIGlzRXJyb3I6IGVycm9yLAogICAgY3JlYXRlVGFzaywKICAgIGRlbGV0ZVRhc2ssCiAgICBnZXRSZWNvbW1lbmRlZFRhc2tEZXNjcmlwdGlvbiwKICB9Owp9Cg==\"\n}], [\"src/useProjects.ts\", {\n \"type\": \"base64\",\n \"body\": \"aW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICJyZWFjdCI7CmltcG9ydCB1c2VTV1IgZnJvbSAic3dyIjsKaW1wb3J0IE1vY2tzIGZyb20gIi4vbW9ja3MiOwoKZXhwb3J0IGludGVyZmFjZSBJUHJvamVjdCB7CiAgJGFwaU5hbWU6IHN0cmluZzsKICAkcHJpbWFyeUtleTogc3RyaW5nOwogIGlkOiBzdHJpbmc7CiAgbmFtZTogc3RyaW5nOwogIGRlc2NyaXB0aW9uOiBzdHJpbmc7Cn0KCmZ1bmN0aW9uIHVzZVByb2plY3RzKCkgewogIGNvbnN0IHsgZGF0YSwgaXNMb2FkaW5nLCBpc1ZhbGlkYXRpbmcsIGVycm9yLCBtdXRhdGUgfSA9IHVzZVNXUjxJUHJvamVjdFtdPigKICAgICJwcm9qZWN0cyIsCiAgICBhc3luYyAoKSA9PiB7CiAgICAgIC8vIFRyeSB0byBpbXBsZW1lbnQgdGhpcyB3aXRoIHRoZSBPbnRvbG9neSBTREshCiAgICAgIGNvbnN0IHByb2plY3RzTGlzdDogSVByb2plY3RbXSA9IChhd2FpdCBNb2Nrcy5nZXRQcm9qZWN0cygpKS5tYXAoKAogICAgICAgIHByb2plY3QsCiAgICAgICkgPT4gKHsKICAgICAgICAkYXBpTmFtZTogcHJvamVjdC4kYXBpTmFtZSwKICAgICAgICAkcHJpbWFyeUtleTogcHJvamVjdC4kcHJpbWFyeUtleSwKICAgICAgICBpZDogcHJvamVjdC5pZCwKICAgICAgICBuYW1lOiBwcm9qZWN0Lm5hbWUgfHwgIiIsCiAgICAgICAgZGVzY3JpcHRpb246IHByb2plY3QuZGVzY3JpcHRpb24gfHwgIiIsCiAgICAgIH0pKTsKICAgICAgcmV0dXJuIHByb2plY3RzTGlzdDsKICAgIH0sCiAgKTsKCiAgY29uc3QgY3JlYXRlUHJvamVjdDogKAogICAgbmFtZTogc3RyaW5nLAogICkgPT4gUHJvbWlzZTxJUHJvamVjdFsiJHByaW1hcnlLZXkiXT4gPSB1c2VDYWxsYmFjaygKICAgIGFzeW5jIChuYW1lOiBzdHJpbmcpID0+IHsKICAgICAgLy8gVHJ5IHRvIGltcGxlbWVudCB0aGlzIHdpdGggdGhlIE9udG9sb2d5IFNESyEKICAgICAgY29uc3QgaWQgPSBhd2FpdCBNb2Nrcy5jcmVhdGVQcm9qZWN0KHsgbmFtZSB9KTsKICAgICAgYXdhaXQgbXV0YXRlKCk7CiAgICAgIHJldHVybiBpZDsKICAgIH0sCiAgICBbbXV0YXRlXSwKICApOwoKICBjb25zdCB1cGRhdGVQcm9qZWN0RGVzY3JpcHRpb246ICgKICAgIHByb2plY3Q6IElQcm9qZWN0LAogICkgPT4gUHJvbWlzZTx2b2lkPiA9IHVzZUNhbGxiYWNrKAogICAgYXN5bmMgKHByb2plY3QpID0+IHsKICAgICAgLy8gVHJ5IHRvIGltcGxlbWVudCB0aGlzIHdpdGggdGhlIE9udG9sb2d5IFNESyEKICAgICAgYXdhaXQgTW9ja3MudXBkYXRlUHJvamVjdERlc2NyaXB0aW9uKHByb2plY3QpOwogICAgICBhd2FpdCBtdXRhdGUoKTsKICAgIH0sCiAgICBbbXV0YXRlXSwKICApOwoKICBjb25zdCBkZWxldGVQcm9qZWN0OiAocHJvamVjdDogSVByb2plY3QpID0+IFByb21pc2U8dm9pZD4gPSB1c2VDYWxsYmFjaygKICAgIGFzeW5jIChwcm9qZWN0KSA9PiB7CiAgICAgIC8vIFRyeSB0byBpbXBsZW1lbnQgdGhpcyB3aXRoIHRoZSBPbnRvbG9neSBTREshCiAgICAgIGF3YWl0IE1vY2tzLmRlbGV0ZVByb2plY3QocHJvamVjdC4kcHJpbWFyeUtleSk7CiAgICAgIGF3YWl0IG11dGF0ZSgpOwogICAgfSwKICAgIFttdXRhdGVdLAogICk7CgogIHJldHVybiB7CiAgICBwcm9qZWN0czogZGF0YSwKICAgIGlzTG9hZGluZywKICAgIGlzVmFsaWRhdGluZywKICAgIGlzRXJyb3I6IGVycm9yLAogICAgY3JlYXRlUHJvamVjdCwKICAgIGRlbGV0ZVByb2plY3QsCiAgICB1cGRhdGVQcm9qZWN0RGVzY3JpcHRpb24sCiAgfTsKfQoKZXhwb3J0IGRlZmF1bHQgdXNlUHJvamVjdHM7Cg==\"\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
|
@@ -281,7 +281,7 @@ var TEMPLATES = [
|
|
|
281
281
|
hidden: false,
|
|
282
282
|
files: {
|
|
283
283
|
"1.x": getPackageFiles(import('./esm-ZDXEJSSK.js')),
|
|
284
|
-
"2.x": getPackageFiles(import('./esm-
|
|
284
|
+
"2.x": getPackageFiles(import('./esm-2XGHW3GB.js'))
|
|
285
285
|
}
|
|
286
286
|
},
|
|
287
287
|
// Expo
|
|
@@ -316,7 +316,7 @@ var TEMPLATES = [
|
|
|
316
316
|
hidden: true,
|
|
317
317
|
files: {
|
|
318
318
|
"1.x": getPackageFiles(import('./esm-WASWYTH3.js')),
|
|
319
|
-
"2.x": getPackageFiles(import('./esm-
|
|
319
|
+
"2.x": getPackageFiles(import('./esm-UFOWZVCI.js'))
|
|
320
320
|
}
|
|
321
321
|
},
|
|
322
322
|
// Tutorial: To do AIP App
|
|
@@ -328,7 +328,7 @@ var TEMPLATES = [
|
|
|
328
328
|
hidden: true,
|
|
329
329
|
files: {
|
|
330
330
|
"1.x": getPackageFiles(import('./esm-DH4TNZAR.js')),
|
|
331
|
-
"2.x": getPackageFiles(import('./esm-
|
|
331
|
+
"2.x": getPackageFiles(import('./esm-WOD3ZASU.js'))
|
|
332
332
|
}
|
|
333
333
|
}
|
|
334
334
|
];
|
|
@@ -538,7 +538,7 @@ async function run({
|
|
|
538
538
|
cwd: fileURLToPath(import.meta.url)
|
|
539
539
|
});
|
|
540
540
|
ourPackageJsonPath ? JSON.parse(fs2.readFileSync(ourPackageJsonPath, "utf-8")).version : undefined;
|
|
541
|
-
const clientVersion = "2.2.0-beta.
|
|
541
|
+
const clientVersion = "2.2.0-beta.13";
|
|
542
542
|
const templateContext = {
|
|
543
543
|
project,
|
|
544
544
|
foundryUrl,
|
|
@@ -612,7 +612,7 @@ async function run({
|
|
|
612
612
|
|
|
613
613
|
// src/cli.ts
|
|
614
614
|
async function cli(args = process.argv) {
|
|
615
|
-
const base = yargs(hideBin(args)).version("2.2.0-beta.
|
|
615
|
+
const base = yargs(hideBin(args)).version("2.2.0-beta.13").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", {
|
|
616
616
|
type: "string",
|
|
617
617
|
describe: "Project name to create"
|
|
618
618
|
}).option("overwrite", {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@osdk/create-app",
|
|
3
|
-
"version": "2.2.0-beta.
|
|
3
|
+
"version": "2.2.0-beta.13",
|
|
4
4
|
"description": "",
|
|
5
5
|
"access": "public",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -38,16 +38,16 @@
|
|
|
38
38
|
"redent": "^4.0.0",
|
|
39
39
|
"tmp": "^0.2.3",
|
|
40
40
|
"typescript": "~5.5.4",
|
|
41
|
-
"@osdk/create-app.template.expo.v2": "2.2.0-beta.
|
|
42
|
-
"@osdk/create-app.template.react": "2.2.0-beta.
|
|
43
|
-
"@osdk/create-app.template.
|
|
44
|
-
"@osdk/create-app.template.tutorial-todo-aip-app": "2.2.0-beta.
|
|
45
|
-
"@osdk/create-app.template.tutorial-todo-app": "2.2.0-beta.
|
|
46
|
-
"@osdk/create-app.template.tutorial-todo-
|
|
47
|
-
"@osdk/create-app.template.vue": "2.2.0-beta.
|
|
48
|
-
"@osdk/create-app.template.
|
|
49
|
-
"@osdk/create-app.template.vue.v2": "2.2.0-beta.
|
|
50
|
-
"@osdk/generator-utils": "2.2.0-beta.
|
|
41
|
+
"@osdk/create-app.template.expo.v2": "2.2.0-beta.13",
|
|
42
|
+
"@osdk/create-app.template.react": "2.2.0-beta.13",
|
|
43
|
+
"@osdk/create-app.template.tutorial-todo-aip-app": "2.2.0-beta.13",
|
|
44
|
+
"@osdk/create-app.template.tutorial-todo-aip-app.beta": "2.2.0-beta.13",
|
|
45
|
+
"@osdk/create-app.template.tutorial-todo-app": "2.2.0-beta.13",
|
|
46
|
+
"@osdk/create-app.template.tutorial-todo-app.beta": "2.2.0-beta.13",
|
|
47
|
+
"@osdk/create-app.template.vue": "2.2.0-beta.13",
|
|
48
|
+
"@osdk/create-app.template.react.beta": "2.2.0-beta.13",
|
|
49
|
+
"@osdk/create-app.template.vue.v2": "2.2.0-beta.13",
|
|
50
|
+
"@osdk/generator-utils": "2.2.0-beta.13",
|
|
51
51
|
"@osdk/monorepo.api-extractor": "~0.1.0-beta.1",
|
|
52
52
|
"@osdk/monorepo.tsconfig": "~0.1.0-beta.1"
|
|
53
53
|
},
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../create-app.template.tutorial-todo-aip-app.beta/build/esm/generatedNoCheck/index.js"],"names":[],"mappings":"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","file":"esm-FKKIVFT7.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 \"@osdk/client\": \"{{clientVersion}}\",\n \"@osdk/oauth\": \"^1.1.0\",\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.28.0\",\n \"@typescript-eslint/parser\": \"^8.28.0\",\n \"@vitejs/plugin-react\": \"^4.2.0\",\n \"eslint\": \"^9.19.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.28.0\",\n \"vite\": \"^6.0.12\",\n \"vitest\": \"^3.0.5\"\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 { 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/AuthenticatedRoute.tsx\", {\n type: \"raw\",\n body: `import { useEffect, useState } from \"react\";\nimport { Outlet, useNavigate } from \"react-router-dom\";\nimport { auth } 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(auth.getTokenOrUndefined());\n useEffect(() => {\n if (auth.getTokenOrUndefined() == null) {\n auth\n .refresh()\n .then(() => {\n setToken(auth.getTokenOrUndefined());\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) {\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 { IProject } from \"./useProjects\";\nimport { useProjectTasks } from \"./useProjectTasks\";\n\ninterface CreateTaskButtonProps {\n project: IProject;\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 { IProject } from \"./useProjects\";\nimport { useProjectTasks } from \"./useProjectTasks\";\n\ninterface CreateTaskDialogProps {\n project: IProject;\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 useProjects, { IProject } from \"./useProjects\";\n\ninterface DeleteProjectButtonProps {\n project: IProject;\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 useProjects, { IProject } from \"./useProjects\";\n\ninterface DeleteProjectDialogProps {\n project: IProject;\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 { ProjectDetails } from \"./ProjectDetails\";\nimport ProjectSelect from \"./ProjectSelect\";\nimport useProjects, { IProject } 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: IProject) => 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 { auth } 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 = auth.getTokenOrUndefined();\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 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 css from \"./ProjectDetails.module.css\";\nimport TaskList from \"./TaskList\";\nimport useProjects, { IProject } from \"./useProjects\";\nimport { useProjectTasks } from \"./useProjectTasks\";\n\ninterface ProjectDetailsProps {\n project: IProject;\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 { IProject } from \"./useProjects\";\n\ninterface ProjectSelectProps {\n project: IProject | undefined;\n projects: IProject[];\n onSelectProject: (project: IProject) => 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 css from \"./TaskList.module.css\";\nimport TaskListItem from \"./TaskListItem\";\nimport { IProject } from \"./useProjects\";\nimport { useProjectTasks } from \"./useProjectTasks\";\n\ninterface TaskListProps {\n project: IProject;\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 css from \"./TaskListItem.module.css\";\nimport { ITask } from \"./useProjectTasks\";\n\ninterface TaskListItemProps {\n task: ITask;\n deleteTask: (task: ITask) => 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 { createClient } from \"@osdk/client\";\nimport { createPublicOauthClient } from \"@osdk/oauth\";\nimport { \\$ontologyRid } 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{{#if scopes}}\nconst scopes = [\n {{#each scopes}}\n \"{{this}}\",\n {{/each}}\n];\n{{/if}}\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 auth = createPublicOauthClient(\n clientId,\n url,\n redirectUrl,\n {{#if scopes}}\n { scopes },\n {{/if}}\n);\n\nconst client = createClient(\n url,\n \\$ontologyRid,\n auth,\n);\n\nexport { auth, 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\": \"aW1wb3J0IHsgSVByb2plY3QgfSBmcm9tICIuL3VzZVByb2plY3RzIjsKaW1wb3J0IHsgSVRhc2sgfSBmcm9tICIuL3VzZVByb2plY3RUYXNrcyI7Cgpjb25zdCBwcm9qZWN0czogSVByb2plY3RbXSA9IFsKICB7CiAgICAkYXBpTmFtZTogIk1vY2tQcm9qZWN0IiwKICAgICRwcmltYXJ5S2V5OiAiMSIsCiAgICBpZDogIjEiLAogICAgbmFtZTogIk1vY2sgcHJvamVjdCIsCiAgICBkZXNjcmlwdGlvbjogIlRoaXMgaXMgYSBtb2NrIGRlc2NyaXB0aW9uIiwKICB9LAogIHsKICAgICRhcGlOYW1lOiAiTW9ja1Byb2plY3QiLAogICAgJHByaW1hcnlLZXk6ICIyIiwKICAgIGlkOiAiMiIsCiAgICBuYW1lOiAiWWV0IGFub3RoZXIgbW9jayBwcm9qZWN0IiwKICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBpcyBhbm90aGVyIG1vY2sgZGVzY3JpcHRpb24iLAogIH0sCl07Cgpjb25zdCB0YXNrczogSVRhc2tbXSA9IFsKICB7CiAgICAkYXBpTmFtZTogIk1vY2tUYXNrIiwKICAgICRwcmltYXJ5S2V5OiAiMSIsCiAgICBpZDogIjEiLAogICAgdGl0bGU6ICJUcnkgdG8iLAogICAgZGVzY3JpcHRpb246ICJ0YXNrIGRlc2NyaXB0aW9uIDEiLAogICAgcHJvamVjdElkOiAiMSIsCiAgfSwKICB7CiAgICAkYXBpTmFtZTogIk1vY2tUYXNrIiwKICAgICRwcmltYXJ5S2V5OiAiMiIsCiAgICBpZDogIjIiLAogICAgdGl0bGU6ICJJbXBsZW1lbnQgdGhpcyIsCiAgICBkZXNjcmlwdGlvbjogInRhc2sgZGVzY3JpcHRpb24gMiIsCiAgICBwcm9qZWN0SWQ6ICIxIiwKICB9LAogIHsKICAgICRhcGlOYW1lOiAiTW9ja1Rhc2siLAogICAgJHByaW1hcnlLZXk6ICIzIiwKICAgIGlkOiAiMyIsCiAgICB0aXRsZTogIldpdGggdGhlIE9udG9sb2d5IFNESyEiLAogICAgZGVzY3JpcHRpb246ICJ0YXNrIGRlc2NyaXB0aW9uIDMiLAogICAgcHJvamVjdElkOiAiMSIsCiAgfSwKICB7CiAgICAkYXBpTmFtZTogIk1vY2tUYXNrIiwKICAgICRwcmltYXJ5S2V5OiAiNCIsCiAgICBpZDogIjQiLAogICAgdGl0bGU6ICJNb3JlIHRhc2tzIGhlcmUiLAogICAgZGVzY3JpcHRpb246ICJNb3JlIHRhc2sgZGVzY3JpcHRpb24iLAogICAgcHJvamVjdElkOiAiMiIsCiAgfSwKXTsKYXN5bmMgZnVuY3Rpb24gZGVsYXkoKTogUHJvbWlzZTx2b2lkPiB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PgogICAgc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIDUwMCArIE1hdGgucmFuZG9tKCkgKiAxMDAwKQogICk7Cn0KCi8vIEdvb2QgZW5vdWdoIHJhbmRvbSBpZCBmb3IgbW9ja3MKZnVuY3Rpb24gcmFuZG9tSWQoKTogc3RyaW5nIHsKICByZXR1cm4gYCR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMiAqKiAzMSl9YDsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0UHJvamVjdHMoKTogUHJvbWlzZTxJUHJvamVjdFtdPiB7CiAgYXdhaXQgZGVsYXkoKTsKICBjb25zdCByZXN1bHQgPSBbLi4ucHJvamVjdHNdOwogIHJlc3VsdC5zb3J0KChwMSwgcDIpID0+IHAxLm5hbWUubG9jYWxlQ29tcGFyZShwMi5uYW1lKSk7CiAgcmV0dXJuIHJlc3VsdDsKfQoKYXN5bmMgZnVuY3Rpb24gY3JlYXRlUHJvamVjdCh7CiAgbmFtZSwKfTogewogIG5hbWU6IHN0cmluZzsKICBkZXNjcmlwdGlvbj86IHN0cmluZzsKfSk6IFByb21pc2U8SVByb2plY3RbIiRwcmltYXJ5S2V5Il0+IHsKICBhd2FpdCBkZWxheSgpOwogIGNvbnN0IGlkID0gcmFuZG9tSWQoKTsKICBwcm9qZWN0cy5wdXNoKHsKICAgICRhcGlOYW1lOiAiTW9ja1Byb2plY3QiLAogICAgJHByaW1hcnlLZXk6IGlkLAogICAgaWQsCiAgICBuYW1lLAogICAgZGVzY3JpcHRpb246ICIiLAogIH0pOwogIHJldHVybiBpZDsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0UmVjb21tZW5kZWRQcm9qZWN0RGVzY3JpcHRpb24oCiAgcHJvamVjdDogSVByb2plY3QsCik6IFByb21pc2U8c3RyaW5nPiB7CiAgYXdhaXQgZGVsYXkoKTsKICBjb25zdCBwcm9qZWN0VGFza3MgPSB0YXNrcy5maWx0ZXIoKHQpID0+IHQucHJvamVjdElkID09PSBwcm9qZWN0LmlkKTsKICBpZiAocHJvamVjdFRhc2tzLmxlbmd0aCA9PT0gMCkgewogICAgdGhyb3cgbmV3IEVycm9yKCJQcm9qZWN0IGRlc2NyaXB0aW9uIHJlY29tbWVuZGF0aW9uIHJlcXVpcmVzIHRhc2tzIik7CiAgfQogIHJldHVybiBgQUlQIExvZ2ljIG1vY2sgZGVzY3JpcHRpb24gZm9yIHByb2plY3RgOwp9Cgphc3luYyBmdW5jdGlvbiB1cGRhdGVQcm9qZWN0RGVzY3JpcHRpb24oCiAgcHJvamVjdDogSVByb2plY3QsCik6IFByb21pc2U8dm9pZD4gewogIGF3YWl0IGRlbGF5KCk7CiAgcHJvamVjdC5kZXNjcmlwdGlvbiA9IGF3YWl0IGdldFJlY29tbWVuZGVkUHJvamVjdERlc2NyaXB0aW9uKHByb2plY3QpOwp9Cgphc3luYyBmdW5jdGlvbiBkZWxldGVQcm9qZWN0KGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHsKICBhd2FpdCBkZWxheSgpOwogIGNvbnN0IGlkeCA9IHByb2plY3RzLmZpbmRJbmRleCgocCkgPT4gcC5pZCA9PT0gaWQpOwogIGlmIChpZHggIT09IC0xKSB7CiAgICBwcm9qZWN0cy5zcGxpY2UoaWR4LCAxKTsKICB9Cn0KCmFzeW5jIGZ1bmN0aW9uIGdldFByb2plY3RUYXNrcyhwcm9qZWN0SWQ6IHN0cmluZyk6IFByb21pc2U8SVRhc2tbXT4gewogIGF3YWl0IGRlbGF5KCk7CiAgcmV0dXJuIHRhc2tzLmZpbHRlcigodCkgPT4gdC5wcm9qZWN0SWQgPT09IHByb2plY3RJZCk7Cn0KCmFzeW5jIGZ1bmN0aW9uIGNyZWF0ZVRhc2soewogIHRpdGxlLAogIGRlc2NyaXB0aW9uID0gIiIsCiAgcHJvamVjdElkLAp9OiB7CiAgdGl0bGU6IHN0cmluZzsKICBkZXNjcmlwdGlvbjogc3RyaW5nOwogIHByb2plY3RJZDogc3RyaW5nOwp9KTogUHJvbWlzZTxJVGFza1siJHByaW1hcnlLZXkiXT4gewogIGF3YWl0IGRlbGF5KCk7CiAgY29uc3QgcHJvamVjdCA9IHByb2plY3RzLmZpbmQoKHApID0+IHAuaWQgPT09IHByb2plY3RJZCk7CiAgaWYgKHByb2plY3QgPT0gbnVsbCkgewogICAgdGhyb3cgbmV3IEVycm9yKGBQcm9qZWN0ICR7cHJvamVjdElkfSBub3QgZm91bmQhYCk7CiAgfQogIGNvbnN0IGlkID0gcmFuZG9tSWQoKTsKICB0YXNrcy51bnNoaWZ0KHsKICAgICRhcGlOYW1lOiAiTW9ja1Rhc2siLAogICAgJHByaW1hcnlLZXk6IGlkLAogICAgaWQsCiAgICB0aXRsZSwKICAgIGRlc2NyaXB0aW9uLAogICAgcHJvamVjdElkLAogIH0pOwogIHJldHVybiBpZDsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0UmVjb21tZW5kZWRUYXNrRGVzY3JpcHRpb24oCiAgdGFza05hbWU6IHN0cmluZywKKTogUHJvbWlzZTxzdHJpbmc+IHsKICBhd2FpdCBkZWxheSgpOwogIGlmICh0YXNrTmFtZS5sZW5ndGggPT09IDApIHsKICAgIHRocm93IG5ldyBFcnJvcigiVGFzayBuYW1lIG11c3Qgbm90IGJlIGVtcHR5Iik7CiAgfQogIHJldHVybiBgTW9jayBBSVAgZGVzY3JpcHRpb24gZm9yIHRhc2tgOwp9Cgphc3luYyBmdW5jdGlvbiBkZWxldGVUYXNrKGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHsKICBhd2FpdCBkZWxheSgpOwogIGNvbnN0IGlkeCA9IHRhc2tzLmZpbmRJbmRleCgodCkgPT4gdC5pZCA9PT0gaWQpOwogIGlmIChpZHggIT09IC0xKSB7CiAgICB0YXNrcy5zcGxpY2UoaWR4LCAxKTsKICB9Cn0KCmNvbnN0IE1vY2tzID0gewogIGdldFByb2plY3RzLAogIGNyZWF0ZVByb2plY3QsCiAgZ2V0UmVjb21tZW5kZWRQcm9qZWN0RGVzY3JpcHRpb24sCiAgZGVsZXRlUHJvamVjdCwKICBnZXRQcm9qZWN0VGFza3MsCiAgY3JlYXRlVGFzaywKICBkZWxldGVUYXNrLAogIGdldFJlY29tbWVuZGVkVGFza0Rlc2NyaXB0aW9uLAogIHVwZGF0ZVByb2plY3REZXNjcmlwdGlvbiwKfTsKCmV4cG9ydCBkZWZhdWx0IE1vY2tzOwo=\"\n}], [\"src/useProjectTasks.ts\", {\n \"type\": \"base64\",\n \"body\": \"aW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICJyZWFjdCI7CmltcG9ydCB1c2VTV1IgZnJvbSAic3dyIjsKaW1wb3J0IE1vY2tzIGZyb20gIi4vbW9ja3MiOwppbXBvcnQgeyBJUHJvamVjdCB9IGZyb20gIi4vdXNlUHJvamVjdHMiOwoKZXhwb3J0IGludGVyZmFjZSBJVGFzayB7CiAgJGFwaU5hbWU6IHN0cmluZzsKICAkcHJpbWFyeUtleTogc3RyaW5nOwogIGlkOiBzdHJpbmc7CiAgdGl0bGU6IHN0cmluZzsKICBkZXNjcmlwdGlvbjogc3RyaW5nOwogIHByb2plY3RJZDogc3RyaW5nOwp9CgpleHBvcnQgZnVuY3Rpb24gdXNlUHJvamVjdFRhc2tzKHByb2plY3Q6IElQcm9qZWN0IHwgdW5kZWZpbmVkKSB7CiAgY29uc3QgeyBkYXRhLCBpc0xvYWRpbmcsIGlzVmFsaWRhdGluZywgZXJyb3IsIG11dGF0ZSB9ID0gdXNlU1dSPElUYXNrW10+KAogICAgcHJvamVjdCAhPSBudWxsID8gYHByb2plY3RzLyR7cHJvamVjdC5pZH0vdGFza3NgIDogbnVsbCwKICAgIC8vIFRyeSB0byBpbXBsZW1lbnQgdGhpcyB3aXRoIHRoZSBPbnRvbG9neSBTREshCiAgICBhc3luYyAoKSA9PiB7CiAgICAgIGlmIChwcm9qZWN0ID09IG51bGwpIHsKICAgICAgICByZXR1cm4gW107CiAgICAgIH0KICAgICAgcmV0dXJuIE1vY2tzLmdldFByb2plY3RUYXNrcyhwcm9qZWN0LiRwcmltYXJ5S2V5KTsKICAgIH0sCiAgKTsKCiAgY29uc3QgY3JlYXRlVGFzazogKAogICAgdGl0bGU6IHN0cmluZywKICAgIGRlc2NyaXB0aW9uOiBzdHJpbmcsCiAgKSA9PiBQcm9taXNlPElUYXNrWyIkcHJpbWFyeUtleSJdIHwgdW5kZWZpbmVkPiA9IHVzZUNhbGxiYWNrKAogICAgYXN5bmMgKHRpdGxlOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcpID0+IHsKICAgICAgaWYgKHByb2plY3QgPT0gbnVsbCkgewogICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgIH0KICAgICAgLy8gVHJ5IHRvIGltcGxlbWVudCB0aGlzIHdpdGggdGhlIE9udG9sb2d5IFNESyEKICAgICAgY29uc3QgaWQgPSBhd2FpdCBNb2Nrcy5jcmVhdGVUYXNrKHsKICAgICAgICB0aXRsZSwKICAgICAgICBkZXNjcmlwdGlvbiwKICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3QuJHByaW1hcnlLZXksCiAgICAgIH0pOwogICAgICBhd2FpdCBtdXRhdGUoKTsKICAgICAgcmV0dXJuIGlkOwogICAgfSwKICAgIFtwcm9qZWN0LCBtdXRhdGVdLAogICk7CgogIGNvbnN0IGRlbGV0ZVRhc2s6ICh0YXNrOiBJVGFzaykgPT4gUHJvbWlzZTx2b2lkPiA9IHVzZUNhbGxiYWNrKAogICAgYXN5bmMgKHRhc2spID0+IHsKICAgICAgaWYgKHByb2plY3QgPT0gbnVsbCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBUcnkgdG8gaW1wbGVtZW50IHRoaXMgd2l0aCB0aGUgT250b2xvZ3kgU0RLIQogICAgICBhd2FpdCBNb2Nrcy5kZWxldGVUYXNrKHRhc2suJHByaW1hcnlLZXkpOwogICAgICBhd2FpdCBtdXRhdGUoKTsKICAgIH0sCiAgICBbcHJvamVjdCwgbXV0YXRlXSwKICApOwoKICBjb25zdCBnZXRSZWNvbW1lbmRlZFRhc2tEZXNjcmlwdGlvbjogKHRhc2tOYW1lOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPiA9CiAgICB1c2VDYWxsYmFjaygKICAgICAgYXN5bmMgKHRhc2tOYW1lOiBzdHJpbmcpID0+IHsKICAgICAgICAvLyBUcnkgdG8gaW1wbGVtZW50IHRoaXMgd2l0aCB0aGUgT250b2xvZ3kgU0RLIQogICAgICAgIGNvbnN0IHJlY29tbWVuZGVkVGFza0Rlc2NyaXB0aW9uID0gYXdhaXQgTW9ja3MKICAgICAgICAgIC5nZXRSZWNvbW1lbmRlZFRhc2tEZXNjcmlwdGlvbih0YXNrTmFtZSk7CiAgICAgICAgYXdhaXQgbXV0YXRlKCk7CiAgICAgICAgcmV0dXJuIHJlY29tbWVuZGVkVGFza0Rlc2NyaXB0aW9uOwogICAgICB9LAogICAgICBbbXV0YXRlXSwKICAgICk7CgogIHJldHVybiB7CiAgICB0YXNrczogZGF0YSwKICAgIGlzTG9hZGluZywKICAgIGlzVmFsaWRhdGluZywKICAgIGlzRXJyb3I6IGVycm9yLAogICAgY3JlYXRlVGFzaywKICAgIGRlbGV0ZVRhc2ssCiAgICBnZXRSZWNvbW1lbmRlZFRhc2tEZXNjcmlwdGlvbiwKICB9Owp9Cg==\"\n}], [\"src/useProjects.ts\", {\n \"type\": \"base64\",\n \"body\": \"aW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICJyZWFjdCI7CmltcG9ydCB1c2VTV1IgZnJvbSAic3dyIjsKaW1wb3J0IE1vY2tzIGZyb20gIi4vbW9ja3MiOwoKZXhwb3J0IGludGVyZmFjZSBJUHJvamVjdCB7CiAgJGFwaU5hbWU6IHN0cmluZzsKICAkcHJpbWFyeUtleTogc3RyaW5nOwogIGlkOiBzdHJpbmc7CiAgbmFtZTogc3RyaW5nOwogIGRlc2NyaXB0aW9uOiBzdHJpbmc7Cn0KCmZ1bmN0aW9uIHVzZVByb2plY3RzKCkgewogIGNvbnN0IHsgZGF0YSwgaXNMb2FkaW5nLCBpc1ZhbGlkYXRpbmcsIGVycm9yLCBtdXRhdGUgfSA9IHVzZVNXUjxJUHJvamVjdFtdPigKICAgICJwcm9qZWN0cyIsCiAgICBhc3luYyAoKSA9PiB7CiAgICAgIC8vIFRyeSB0byBpbXBsZW1lbnQgdGhpcyB3aXRoIHRoZSBPbnRvbG9neSBTREshCiAgICAgIGNvbnN0IHByb2plY3RzTGlzdDogSVByb2plY3RbXSA9IChhd2FpdCBNb2Nrcy5nZXRQcm9qZWN0cygpKS5tYXAoKAogICAgICAgIHByb2plY3QsCiAgICAgICkgPT4gKHsKICAgICAgICAkYXBpTmFtZTogcHJvamVjdC4kYXBpTmFtZSwKICAgICAgICAkcHJpbWFyeUtleTogcHJvamVjdC4kcHJpbWFyeUtleSwKICAgICAgICBpZDogcHJvamVjdC5pZCwKICAgICAgICBuYW1lOiBwcm9qZWN0Lm5hbWUgfHwgIiIsCiAgICAgICAgZGVzY3JpcHRpb246IHByb2plY3QuZGVzY3JpcHRpb24gfHwgIiIsCiAgICAgIH0pKTsKICAgICAgcmV0dXJuIHByb2plY3RzTGlzdDsKICAgIH0sCiAgKTsKCiAgY29uc3QgY3JlYXRlUHJvamVjdDogKAogICAgbmFtZTogc3RyaW5nLAogICkgPT4gUHJvbWlzZTxJUHJvamVjdFsiJHByaW1hcnlLZXkiXT4gPSB1c2VDYWxsYmFjaygKICAgIGFzeW5jIChuYW1lOiBzdHJpbmcpID0+IHsKICAgICAgLy8gVHJ5IHRvIGltcGxlbWVudCB0aGlzIHdpdGggdGhlIE9udG9sb2d5IFNESyEKICAgICAgY29uc3QgaWQgPSBhd2FpdCBNb2Nrcy5jcmVhdGVQcm9qZWN0KHsgbmFtZSB9KTsKICAgICAgYXdhaXQgbXV0YXRlKCk7CiAgICAgIHJldHVybiBpZDsKICAgIH0sCiAgICBbbXV0YXRlXSwKICApOwoKICBjb25zdCB1cGRhdGVQcm9qZWN0RGVzY3JpcHRpb246ICgKICAgIHByb2plY3Q6IElQcm9qZWN0LAogICkgPT4gUHJvbWlzZTx2b2lkPiA9IHVzZUNhbGxiYWNrKAogICAgYXN5bmMgKHByb2plY3QpID0+IHsKICAgICAgLy8gVHJ5IHRvIGltcGxlbWVudCB0aGlzIHdpdGggdGhlIE9udG9sb2d5IFNESyEKICAgICAgYXdhaXQgTW9ja3MudXBkYXRlUHJvamVjdERlc2NyaXB0aW9uKHByb2plY3QpOwogICAgICBhd2FpdCBtdXRhdGUoKTsKICAgIH0sCiAgICBbbXV0YXRlXSwKICApOwoKICBjb25zdCBkZWxldGVQcm9qZWN0OiAocHJvamVjdDogSVByb2plY3QpID0+IFByb21pc2U8dm9pZD4gPSB1c2VDYWxsYmFjaygKICAgIGFzeW5jIChwcm9qZWN0KSA9PiB7CiAgICAgIC8vIFRyeSB0byBpbXBsZW1lbnQgdGhpcyB3aXRoIHRoZSBPbnRvbG9neSBTREshCiAgICAgIGF3YWl0IE1vY2tzLmRlbGV0ZVByb2plY3QocHJvamVjdC4kcHJpbWFyeUtleSk7CiAgICAgIGF3YWl0IG11dGF0ZSgpOwogICAgfSwKICAgIFttdXRhdGVdLAogICk7CgogIHJldHVybiB7CiAgICBwcm9qZWN0czogZGF0YSwKICAgIGlzTG9hZGluZywKICAgIGlzVmFsaWRhdGluZywKICAgIGlzRXJyb3I6IGVycm9yLAogICAgY3JlYXRlUHJvamVjdCwKICAgIGRlbGV0ZVByb2plY3QsCiAgICB1cGRhdGVQcm9qZWN0RGVzY3JpcHRpb24sCiAgfTsKfQoKZXhwb3J0IGRlZmF1bHQgdXNlUHJvamVjdHM7Cg==\"\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}]]);"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../create-app.template.tutorial-todo-app.beta/build/esm/generatedNoCheck/index.js"],"names":[],"mappings":"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","file":"esm-RTFDNEWG.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 \"@osdk/client\": \"{{clientVersion}}\",\n \"@osdk/oauth\": \"^1.1.0\",\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.28.0\",\n \"@typescript-eslint/parser\": \"^8.28.0\",\n \"@vitejs/plugin-react\": \"^4.2.0\",\n \"eslint\": \"^9.19.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.28.0\",\n \"vite\": \"^6.0.12\",\n \"vitest\": \"^3.0.5\"\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 { 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/AuthenticatedRoute.tsx\", {\n type: \"raw\",\n body: `import { useEffect, useState } from \"react\";\nimport { Outlet, useNavigate } from \"react-router-dom\";\nimport { auth } 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(auth.getTokenOrUndefined());\n useEffect(() => {\n if (auth.getTokenOrUndefined() == null) {\n auth\n .refresh()\n .then(() => {\n setToken(auth.getTokenOrUndefined());\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) {\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 { IProject } from \"./useProjects\";\nimport { useProjectTasks } from \"./useProjectTasks\";\n\ninterface CreateTaskButtonProps {\n project: IProject;\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 { IProject } from \"./useProjects\";\nimport { useProjectTasks } from \"./useProjectTasks\";\n\ninterface CreateTaskDialogProps {\n project: IProject;\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 useProjects, { IProject } from \"./useProjects\";\n\ninterface DeleteProjectButtonProps {\n project: IProject;\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 useProjects, { IProject } from \"./useProjects\";\n\ninterface DeleteProjectDialogProps {\n project: IProject;\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 ProjectSelect from \"./ProjectSelect\";\nimport TaskList from \"./TaskList\";\nimport useProjects, { IProject } 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: IProject) => 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 { auth } 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 = auth.getTokenOrUndefined();\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 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 { IProject } from \"./useProjects\";\n\ninterface ProjectSelectProps {\n project: IProject | undefined;\n projects: IProject[];\n onSelectProject: (project: IProject) => 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 css from \"./TaskList.module.css\";\nimport TaskListItem from \"./TaskListItem\";\nimport { IProject } from \"./useProjects\";\nimport { useProjectTasks } from \"./useProjectTasks\";\n\ninterface TaskListProps {\n project: IProject;\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 css from \"./TaskListItem.module.css\";\nimport { ITask } from \"./useProjectTasks\";\n\ninterface TaskListItemProps {\n task: ITask;\n deleteTask: (task: ITask) => 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 { createClient } from \"@osdk/client\";\nimport { createPublicOauthClient } from \"@osdk/oauth\";\nimport { \\$ontologyRid } 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{{#if scopes}}\nconst scopes = [\n {{#each scopes}}\n \"{{this}}\",\n {{/each}}\n];\n{{/if}}\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 auth = createPublicOauthClient(\n clientId,\n url,\n redirectUrl,\n {{#if scopes}}\n { scopes },\n {{/if}}\n);\n\nconst client = createClient(\n url,\n \\$ontologyRid,\n auth,\n);\n\nexport { auth, 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\": \"aW1wb3J0IHsgSVByb2plY3QgfSBmcm9tICIuL3VzZVByb2plY3RzIjsKaW1wb3J0IHsgSVRhc2sgfSBmcm9tICIuL3VzZVByb2plY3RUYXNrcyI7Cgpjb25zdCBwcm9qZWN0czogSVByb2plY3RbXSA9IFsKICB7CiAgICAkYXBpTmFtZTogIk1vY2tQcm9qZWN0IiwKICAgICRwcmltYXJ5S2V5OiAiMSIsCiAgICBpZDogIjEiLAogICAgbmFtZTogIk1vY2sgcHJvamVjdCIsCiAgfSwKICB7CiAgICAkYXBpTmFtZTogIk1vY2tQcm9qZWN0IiwKICAgICRwcmltYXJ5S2V5OiAiMiIsCiAgICBpZDogIjIiLAogICAgbmFtZTogIllldCBhbm90aGVyIG1vY2sgcHJvamVjdCIsCiAgfSwKXTsKCmNvbnN0IHRhc2tzOiBJVGFza1tdID0gWwogIHsKICAgICRhcGlOYW1lOiAiTW9ja1Rhc2siLAogICAgJHByaW1hcnlLZXk6ICIxIiwKICAgIGlkOiAiMSIsCiAgICB0aXRsZTogIlRyeSB0byIsCiAgICBwcm9qZWN0SWQ6ICIxIiwKICB9LAogIHsKICAgICRhcGlOYW1lOiAiTW9ja1Rhc2siLAogICAgJHByaW1hcnlLZXk6ICIyIiwKICAgIGlkOiAiMiIsCiAgICB0aXRsZTogIkltcGxlbWVudCB0aGlzIiwKICAgIHByb2plY3RJZDogIjEiLAogIH0sCiAgewogICAgJGFwaU5hbWU6ICJNb2NrVGFzayIsCiAgICAkcHJpbWFyeUtleTogIjMiLAogICAgaWQ6ICIzIiwKICAgIHRpdGxlOiAiV2l0aCB0aGUgT250b2xvZ3kgU0RLISIsCiAgICBwcm9qZWN0SWQ6ICIxIiwKICB9LAogIHsKICAgICRhcGlOYW1lOiAiTW9ja1Rhc2siLAogICAgJHByaW1hcnlLZXk6ICI0IiwKICAgIGlkOiAiNCIsCiAgICB0aXRsZTogIk1vcmUgdGFza3MgaGVyZSIsCiAgICBwcm9qZWN0SWQ6ICIyIiwKICB9LApdOwoKYXN5bmMgZnVuY3Rpb24gZGVsYXkoKTogUHJvbWlzZTx2b2lkPiB7CiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PgogICAgc2V0VGltZW91dCgoKSA9PiByZXNvbHZlKCksIDUwMCArIE1hdGgucmFuZG9tKCkgKiAxMDAwKQogICk7Cn0KCi8vIEdvb2QgZW5vdWdoIHJhbmRvbSBpZCBmb3IgbW9ja3MKZnVuY3Rpb24gcmFuZG9tSWQoKTogc3RyaW5nIHsKICByZXR1cm4gYCR7TWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMiAqKiAzMSl9YDsKfQoKYXN5bmMgZnVuY3Rpb24gZ2V0UHJvamVjdHMoKTogUHJvbWlzZTxJUHJvamVjdFtdPiB7CiAgYXdhaXQgZGVsYXkoKTsKICBjb25zdCByZXN1bHQgPSBbLi4ucHJvamVjdHNdOwogIHJlc3VsdC5zb3J0KChwMSwgcDIpID0+IHAxLm5hbWUubG9jYWxlQ29tcGFyZShwMi5uYW1lKSk7CiAgcmV0dXJuIHJlc3VsdDsKfQoKYXN5bmMgZnVuY3Rpb24gY3JlYXRlUHJvamVjdCh7CiAgbmFtZSwKfTogewogIG5hbWU6IHN0cmluZzsKfSk6IFByb21pc2U8SVByb2plY3RbIiRwcmltYXJ5S2V5Il0+IHsKICBhd2FpdCBkZWxheSgpOwogIGNvbnN0IGlkID0gcmFuZG9tSWQoKTsKICBwcm9qZWN0cy5wdXNoKHsKICAgICRhcGlOYW1lOiAiTW9ja1Byb2plY3QiLAogICAgJHByaW1hcnlLZXk6IGlkLAogICAgaWQsCiAgICBuYW1lLAogIH0pOwogIHJldHVybiBpZDsKfQoKYXN5bmMgZnVuY3Rpb24gZGVsZXRlUHJvamVjdChpZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7CiAgYXdhaXQgZGVsYXkoKTsKICBjb25zdCBpZHggPSBwcm9qZWN0cy5maW5kSW5kZXgoKHApID0+IHAuaWQgPT09IGlkKTsKICBpZiAoaWR4ICE9PSAtMSkgewogICAgcHJvamVjdHMuc3BsaWNlKGlkeCwgMSk7CiAgfQp9Cgphc3luYyBmdW5jdGlvbiBnZXRQcm9qZWN0VGFza3MocHJvamVjdElkOiBzdHJpbmcpOiBQcm9taXNlPElUYXNrW10+IHsKICBhd2FpdCBkZWxheSgpOwogIHJldHVybiB0YXNrcy5maWx0ZXIoKHQpID0+IHQucHJvamVjdElkID09PSBwcm9qZWN0SWQpOwp9Cgphc3luYyBmdW5jdGlvbiBjcmVhdGVUYXNrKHsKICB0aXRsZSwKICBwcm9qZWN0SWQsCn06IHsKICB0aXRsZTogc3RyaW5nOwogIHByb2plY3RJZDogc3RyaW5nOwp9KTogUHJvbWlzZTxJVGFza1siJHByaW1hcnlLZXkiXT4gewogIGF3YWl0IGRlbGF5KCk7CiAgY29uc3QgdGFzayA9IHRhc2tzLmZpbmQoKHQpID0+IHQucHJvamVjdElkID09PSBwcm9qZWN0SWQpOwogIGlmICh0YXNrID09IG51bGwpIHsKICAgIHRocm93IG5ldyBFcnJvcihgUHJvamVjdCAke3Byb2plY3RJZH0gbm90IGZvdW5kIWApOwogIH0KICBjb25zdCBpZCA9IHJhbmRvbUlkKCk7CiAgdGFza3MudW5zaGlmdCh7CiAgICAkYXBpTmFtZTogIk1vY2tUYXNrIiwKICAgICRwcmltYXJ5S2V5OiBpZCwKICAgIGlkLAogICAgdGl0bGUsCiAgICBwcm9qZWN0SWQsCiAgfSk7CiAgcmV0dXJuIGlkOwp9Cgphc3luYyBmdW5jdGlvbiBkZWxldGVUYXNrKGlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHsKICBhd2FpdCBkZWxheSgpOwogIGNvbnN0IGlkeCA9IHRhc2tzLmZpbmRJbmRleCgodCkgPT4gdC5wcm9qZWN0SWQgPT09IGlkKTsKICBpZiAoaWR4ICE9PSAtMSkgewogICAgdGFza3Muc3BsaWNlKGlkeCwgMSk7CiAgfQp9Cgpjb25zdCBNb2NrcyA9IHsKICBnZXRQcm9qZWN0cywKICBjcmVhdGVQcm9qZWN0LAogIGRlbGV0ZVByb2plY3QsCiAgZ2V0UHJvamVjdFRhc2tzLAogIGNyZWF0ZVRhc2ssCiAgZGVsZXRlVGFzaywKfTsKCmV4cG9ydCBkZWZhdWx0IE1vY2tzOwo=\"\n}], [\"src/useProjectTasks.ts\", {\n \"type\": \"base64\",\n \"body\": \"aW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICJyZWFjdCI7CmltcG9ydCB1c2VTV1IgZnJvbSAic3dyIjsKaW1wb3J0IE1vY2tzIGZyb20gIi4vbW9ja3MiOwppbXBvcnQgeyBJUHJvamVjdCB9IGZyb20gIi4vdXNlUHJvamVjdHMiOwoKZXhwb3J0IGludGVyZmFjZSBJVGFzayB7CiAgJGFwaU5hbWU6IHN0cmluZzsKICAkcHJpbWFyeUtleTogc3RyaW5nOwogIGlkOiBzdHJpbmc7CiAgdGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZDsKICBwcm9qZWN0SWQ6IHN0cmluZzsKfQoKZXhwb3J0IGZ1bmN0aW9uIHVzZVByb2plY3RUYXNrcyhwcm9qZWN0OiBJUHJvamVjdCB8IHVuZGVmaW5lZCkgewogIGNvbnN0IHsgZGF0YSwgaXNMb2FkaW5nLCBpc1ZhbGlkYXRpbmcsIGVycm9yLCBtdXRhdGUgfSA9IHVzZVNXUjxJVGFza1tdPigKICAgIHByb2plY3QgIT0gbnVsbCA\\u002FIGBwcm9qZWN0cy8ke3Byb2plY3QuaWR9L3Rhc2tzYCA6IG51bGwsCiAgICAvLyBUcnkgdG8gaW1wbGVtZW50IHRoaXMgd2l0aCB0aGUgT250b2xvZ3kgU0RLIQogICAgYXN5bmMgKCkgPT4gewogICAgICBpZiAocHJvamVjdCA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIFtdOwogICAgICB9CiAgICAgIHJldHVybiAoYXdhaXQgTW9ja3MuZ2V0UHJvamVjdFRhc2tzKHByb2plY3QuJHByaW1hcnlLZXkpKTsKICAgIH0sCiAgKTsKCiAgY29uc3QgY3JlYXRlVGFzazogKAogICAgdGl0bGU6IHN0cmluZywKICApID0+IFByb21pc2U8SVRhc2tbIiRwcmltYXJ5S2V5Il0gfCB1bmRlZmluZWQ+ID0gdXNlQ2FsbGJhY2soCiAgICBhc3luYyAodGl0bGUpID0+IHsKICAgICAgaWYgKHByb2plY3QgPT0gbnVsbCkgewogICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgIH0KICAgICAgLy8gVHJ5IHRvIGltcGxlbWVudCB0aGlzIHdpdGggdGhlIE9udG9sb2d5IFNESyEKICAgICAgY29uc3QgaWQgPSBhd2FpdCBNb2Nrcy5jcmVhdGVUYXNrKHsKICAgICAgICB0aXRsZSwKICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3QuJHByaW1hcnlLZXksCiAgICAgIH0pOwogICAgICBhd2FpdCBtdXRhdGUoKTsKICAgICAgcmV0dXJuIGlkOwogICAgfSwKICAgIFtwcm9qZWN0LCBtdXRhdGVdLAogICk7CgogIGNvbnN0IGRlbGV0ZVRhc2s6ICh0YXNrOiBJVGFzaykgPT4gUHJvbWlzZTx2b2lkPiA9IHVzZUNhbGxiYWNrKAogICAgYXN5bmMgKHRhc2spID0+IHsKICAgICAgaWYgKHByb2plY3QgPT0gbnVsbCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBUcnkgdG8gaW1wbGVtZW50IHRoaXMgd2l0aCB0aGUgT250b2xvZ3kgU0RLIQogICAgICBhd2FpdCBNb2Nrcy5kZWxldGVUYXNrKHRhc2suJHByaW1hcnlLZXkpOwogICAgICBhd2FpdCBtdXRhdGUoKTsKICAgIH0sCiAgICBbcHJvamVjdCwgbXV0YXRlXSwKICApOwoKICByZXR1cm4gewogICAgdGFza3M6IGRhdGEsCiAgICBpc0xvYWRpbmcsCiAgICBpc1ZhbGlkYXRpbmcsCiAgICBpc0Vycm9yOiBlcnJvciwKICAgIGNyZWF0ZVRhc2ssCiAgICBkZWxldGVUYXNrLAogIH07Cn0K\"\n}], [\"src/useProjects.ts\", {\n \"type\": \"base64\",\n \"body\": \"aW1wb3J0IHsgdXNlQ2FsbGJhY2sgfSBmcm9tICJyZWFjdCI7CmltcG9ydCB1c2VTV1IgZnJvbSAic3dyIjsKaW1wb3J0IE1vY2tzIGZyb20gIi4vbW9ja3MiOwoKZXhwb3J0IGludGVyZmFjZSBJUHJvamVjdCB7CiAgJGFwaU5hbWU6IHN0cmluZzsKICAkcHJpbWFyeUtleTogc3RyaW5nOwogIGlkOiBzdHJpbmc7CiAgbmFtZTogc3RyaW5nOwp9CgpmdW5jdGlvbiB1c2VQcm9qZWN0cygpIHsKICBjb25zdCB7IGRhdGEsIGlzTG9hZGluZywgaXNWYWxpZGF0aW5nLCBlcnJvciwgbXV0YXRlIH0gPSB1c2VTV1I8SVByb2plY3RbXT4oCiAgICAicHJvamVjdHMiLAogICAgYXN5bmMgKCkgPT4gewogICAgICAvLyBUcnkgdG8gaW1wbGVtZW50IHRoaXMgd2l0aCB0aGUgT250b2xvZ3kgU0RLIQogICAgICBjb25zdCBwcm9qZWN0c0xpc3Q6IElQcm9qZWN0W10gPSAoYXdhaXQgTW9ja3MuZ2V0UHJvamVjdHMoKSkubWFwKCgKICAgICAgICBwcm9qZWN0LAogICAgICApID0+ICh7CiAgICAgICAgJGFwaU5hbWU6IHByb2plY3QuJGFwaU5hbWUsCiAgICAgICAgJHByaW1hcnlLZXk6IHByb2plY3QuJHByaW1hcnlLZXksCiAgICAgICAgaWQ6IHByb2plY3QuaWQsCiAgICAgICAgbmFtZTogcHJvamVjdC5uYW1lIHx8ICIiLAogICAgICB9KSk7CiAgICAgIHJldHVybiBwcm9qZWN0c0xpc3Q7CiAgICB9LAogICk7CgogIGNvbnN0IGNyZWF0ZVByb2plY3Q6IChuYW1lOiBzdHJpbmcpID0+IFByb21pc2U8SVByb2plY3RbIiRwcmltYXJ5S2V5Il0+ID0KICAgIHVzZUNhbGxiYWNrKAogICAgICBhc3luYyAobmFtZSkgPT4gewogICAgICAgIC8vIFRyeSB0byBpbXBsZW1lbnQgdGhpcyB3aXRoIHRoZSBPbnRvbG9neSBTREshCiAgICAgICAgY29uc3QgaWQgPSBhd2FpdCBNb2Nrcy5jcmVhdGVQcm9qZWN0KHsgbmFtZSB9KTsKICAgICAgICBhd2FpdCBtdXRhdGUoKTsKICAgICAgICByZXR1cm4gaWQ7CiAgICAgIH0sCiAgICAgIFttdXRhdGVdLAogICAgKTsKCiAgY29uc3QgZGVsZXRlUHJvamVjdDogKHByb2plY3Q6IElQcm9qZWN0KSA9PiBQcm9taXNlPHZvaWQ+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}]]);"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../create-app.template.react.beta/build/esm/generatedNoCheck/index.js"],"names":[],"mappings":"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","file":"esm-WDI4ERNF.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.1.0\",\n \"@osdk/react\": \"^0.3.0-beta.0\",\n \"react\": \"^18\",\n \"react-dom\": \"^18\",\n \"react-router-dom\": \"^6.23.1\"\n },\n \"devDependencies\": {\n \"@types/node\": \"^18.0.0\",\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.28.0\",\n \"@typescript-eslint/parser\": \"^8.28.0\",\n \"@vitejs/plugin-react\": \"^4.2.0\",\n \"eslint\": \"^9.19.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.28.0\",\n \"vite\": \"^6.0.12\",\n \"vitest\": \"^3.0.5\"\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 \"./main\";\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// import { useOsdkClient } from \"@osdk/react\";\n\nfunction Home() {\n // const client = useOsdkClient();\n // See API Docs on Developer console on how to use the client object to access the ontology resource\n\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/createClientAndAuth.ts.hbs\", {\n type: \"raw\",\n body: `import \"./index.css\";\nimport type { Client } from \"@osdk/client\";\nimport { createClient } from \"@osdk/client\";\nimport { \\$ontologyRid } from \"{{osdkPackage}}\";\nimport { createPublicOauthClient } from \"@osdk/oauth\";\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 default function createClientAndAuth() {\n const url = import.meta.env.VITE_FOUNDRY_API_URL;\n const clientId = import.meta.env.VITE_FOUNDRY_CLIENT_ID;\n const redirectUrl = import.meta.env.VITE_FOUNDRY_REDIRECT_URL;\n {{#if scopes}}\n const scopes = [\n {{#each scopes}}\n \"{{this}}\",\n {{/each}}\n ];\n {{/if}}\n\n checkEnv(url, \"VITE_FOUNDRY_API_URL\");\n checkEnv(clientId, \"VITE_FOUNDRY_CLIENT_ID\");\n checkEnv(redirectUrl, \"VITE_FOUNDRY_REDIRECT_URL\");\n\n const auth = createPublicOauthClient(\n clientId,\n url,\n redirectUrl,\n {{#if scopes}}\n { scopes },\n {{/if}}\n );\n\n /**\n * Initialize the client to interact with the Ontology SDK\n */\n const client: Client = createClient(\n url,\n \\$ontologyRid,\n auth,\n );\n\n return { client, auth }\n}\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 { OsdkProvider } from \"@osdk/react\";\nimport ReactDOM from \"react-dom/client\";\nimport { RouterProvider } from \"react-router-dom\";\nimport createClientAndAuth from \"./createClientAndAuth\";\nimport \"./index.css\";\nimport { router } from \"./router\";\n\nconst { client, auth } = createClientAndAuth();\nexport { auth };\n\nReactDOM.createRoot(document.getElementById(\"root\")!).render(\n <OsdkProvider client={client}>\n <RouterProvider router={router} />,\n </OsdkProvider>,\n);\n`\n}], [\"src/router.tsx\", {\n type: \"raw\",\n body: `import { createBrowserRouter } from \"react-router-dom\";\nimport AuthCallback from \"./AuthCallback\";\nimport Home from \"./Home\";\n\nexport const 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`\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}]]);"]}
|