@turnipxenon/pineapple 2.4.70 → 2.4.72

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/.gitignore +8 -0
  2. package/.idea/workspace.xml +53 -49
  3. package/.svelte-kit/__package__/.gitignore +1 -0
  4. package/.svelte-kit/__package__/server-temp/prisma.d.ts +2 -0
  5. package/.svelte-kit/__package__/server-temp/prisma.js +2 -0
  6. package/.svelte-kit/__package__/template/seaweed/ChumBucket.svelte +60 -60
  7. package/.svelte-kit/__package__/template/seaweed/SeaweedTemplate.svelte +5 -6
  8. package/.svelte-kit/ambient.d.ts +4 -4
  9. package/.svelte-kit/generated/client/app.js +4 -2
  10. package/.svelte-kit/generated/client/nodes/16.js +1 -0
  11. package/.svelte-kit/generated/server/internal.js +1 -1
  12. package/.svelte-kit/types/route_meta_data.json +3 -0
  13. package/.svelte-kit/types/src/routes/$types.d.ts +2 -2
  14. package/.svelte-kit/types/src/routes/(seaweed)/$types.d.ts +2 -2
  15. package/.svelte-kit/types/src/routes/(seaweed)/portfolio/actual/[slug]/$types.d.ts +25 -0
  16. package/.svelte-kit/types/src/routes/(seaweed)/portfolio/actual/[slug]/proxy+page.server.ts +36 -0
  17. package/dist/.gitignore +1 -0
  18. package/dist/server-temp/prisma.d.ts +2 -0
  19. package/dist/server-temp/prisma.js +2 -0
  20. package/dist/template/seaweed/ChumBucket.svelte +60 -60
  21. package/dist/template/seaweed/SeaweedTemplate.svelte +5 -6
  22. package/package.json +3 -1
  23. package/prisma/migrations/20240408050417_init/migration.sql +7 -0
  24. package/prisma/migrations/migration_lock.toml +3 -0
  25. package/prisma/schema.prisma +13 -0
  26. package/src/lib/.gitignore +1 -0
  27. package/src/lib/api/GetLatestBlogs.ts +7 -7
  28. package/src/lib/api/index.ts +3 -3
  29. package/src/lib/server-temp/prisma.ts +3 -0
  30. package/src/lib/template/seaweed/ChumBucket.svelte +75 -75
  31. package/src/lib/template/seaweed/SeaweedTemplate.svelte +5 -7
  32. package/src/routes/(seaweed)/portfolio/actual/[slug]/+page.server.ts +35 -0
  33. package/src/routes/(seaweed)/portfolio/actual/[slug]/+page.svelte +40 -0
  34. package/src/routes/(seaweed)/portfolio/actual/[slug]/SlugPageData.ts +4 -0
  35. package/src/routes/api/get-latest-blogs/+server.ts +4 -4
  36. package/yarn.lock +48 -0
package/.gitignore CHANGED
@@ -12,3 +12,11 @@ vite.config.ts.timestamp-*
12
12
  .idea
13
13
  dist
14
14
  /.vercel/
15
+
16
+ # Prisma for debugging; need to migrate some Prisma function to Seaweed
17
+ prisma
18
+
19
+ #/prisma/migrations/20240408050417_init/migration.sql
20
+ #/prisma/migrations/migration_lock.toml
21
+ #/src/lib/server-temp/prisma.ts
22
+ #/prisma/schema.prisma
@@ -4,9 +4,8 @@
4
4
  <option name="autoReloadType" value="SELECTIVE" />
5
5
  </component>
6
6
  <component name="ChangeListManager">
7
- <list default="true" id="accb6ba2-c343-4f84-ad30-6e2d71eceee5" name="CreateUrlForm" comment="Export GetLatestBlogs properly">
8
- <change beforePath="$PROJECT_DIR$/src/lib/template/seaweed/entries/ThisWebpage.svelte" beforeDir="false" afterPath="$PROJECT_DIR$/src/lib/template/seaweed/entries/ThisWebpage.svelte" afterDir="false" />
9
- </list>
7
+ <list default="true" id="accb6ba2-c343-4f84-ad30-6e2d71eceee5" name="CreateUrlForm" comment="Fix .gitignore" />
8
+ <list id="a5282f93-c2bb-4265-921e-8b484677dd29" name="prisma" comment="" />
10
9
  <option name="SHOW_DIALOG" value="false" />
11
10
  <option name="HIGHLIGHT_CONFLICTS" value="true" />
12
11
  <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
@@ -119,7 +118,7 @@
119
118
  &quot;WebServerToolWindowFactoryState&quot;: &quot;false&quot;,
120
119
  &quot;git-widget-placeholder&quot;: &quot;turnip/dev&quot;,
121
120
  &quot;ignore.virus.scanning.warn.message&quot;: &quot;true&quot;,
122
- &quot;last_opened_file_path&quot;: &quot;C:/Users/Pumpkin/Projects/Web/pineapple&quot;,
121
+ &quot;last_opened_file_path&quot;: &quot;C:/Users/Pumpkin/Projects/Web/pineapple/src/lib&quot;,
123
122
  &quot;list.type.of.created.stylesheet&quot;: &quot;CSS&quot;,
124
123
  &quot;node.js.detected.package.eslint&quot;: &quot;true&quot;,
125
124
  &quot;node.js.detected.package.tslint&quot;: &quot;true&quot;,
@@ -141,11 +140,11 @@
141
140
  }</component>
142
141
  <component name="RecentsManager">
143
142
  <key name="CopyFile.RECENT_KEYS">
143
+ <recent name="C:\Users\Pumpkin\Projects\Web\pineapple\src\lib" />
144
+ <recent name="C:\Users\Pumpkin\Projects\Web\pineapple" />
145
+ <recent name="C:\Users\Pumpkin\Projects\Web\pineapple\src\routes\(seaweed)\portfolio\actual" />
144
146
  <recent name="C:\Users\Pumpkin\Projects\Web\pineapple\src\routes\api\create-url" />
145
147
  <recent name="C:\Users\Pumpkin\Projects\Web\pineapple\src\lib\template\seaweed" />
146
- <recent name="C:\Users\Pumpkin\Projects\Web\pineapple\src\lib\template\seaweed\entries" />
147
- <recent name="C:\Users\Pumpkin\Projects\Web\pineapple\src\routes\(pineapple)\pineapple\(extra-pages)\page3\page7\(test_layout)\page8" />
148
- <recent name="C:\Users\Pumpkin\Projects\Web\pineapple\src\routes\(pineapple)\pineapple\(extra-pages)\page3\page5" />
149
148
  </key>
150
149
  <key name="MoveFile.RECENT_KEYS">
151
150
  <recent name="C:\Users\Pumpkin\Projects\Web\pineapple\src\lib\components\pineapple-slide-toggle" />
@@ -159,7 +158,7 @@
159
158
  <recent name="C:\Users\Pumpkin\Projects\Web\pineapple\src\lib\util\util.ts" />
160
159
  </key>
161
160
  </component>
162
- <component name="RunManager" selected="npm.dev --open">
161
+ <component name="RunManager" selected="npm.to-dev">
163
162
  <configuration name="dev --open" type="js.build_tools.npm" temporary="true" nameIsGenerated="true">
164
163
  <package-json value="$PROJECT_DIR$/package.json" />
165
164
  <command value="run" />
@@ -168,7 +167,9 @@
168
167
  </scripts>
169
168
  <arguments value="--open" />
170
169
  <node-interpreter value="project" />
171
- <envs />
170
+ <envs>
171
+ <env name="POSTGRES_PRISMA_URL" value="postgres://default:cV8MAtPjiF1n@ep-wandering-flower-a4iaz9vz-pooler.us-east-1.aws.neon.tech/verceldb?sslmode=require" />
172
+ </envs>
172
173
  <method v="2" />
173
174
  </configuration>
174
175
  <configuration name="dev-offline" type="js.build_tools.npm" temporary="true" nameIsGenerated="true">
@@ -198,8 +199,8 @@
198
199
  </list>
199
200
  <recent_temporary>
200
201
  <list>
201
- <item itemvalue="npm.dev --open" />
202
202
  <item itemvalue="npm.to-dev" />
203
+ <item itemvalue="npm.dev --open" />
203
204
  <item itemvalue="npm.dev-offline" />
204
205
  <item itemvalue="npm.dev --open" />
205
206
  <item itemvalue="npm.to-dev" />
@@ -210,6 +211,7 @@
210
211
  <component name="TaskManager">
211
212
  <task active="true" id="Default" summary="Default task">
212
213
  <changelist id="accb6ba2-c343-4f84-ad30-6e2d71eceee5" name="Changes" comment="" />
214
+ <changelist id="a5282f93-c2bb-4265-921e-8b484677dd29" name="prisma" comment="" />
213
215
  <created>1695180599963</created>
214
216
  <option name="number" value="Default" />
215
217
  <option name="presentableId" value="Default" />
@@ -358,39 +360,9 @@
358
360
  <workItem from="1712777702027" duration="1171000" />
359
361
  <workItem from="1712779118025" duration="2950000" />
360
362
  <workItem from="1712782201465" duration="745000" />
361
- <workItem from="1712790206684" duration="235000" />
362
- </task>
363
- <task id="LOCAL-00139" summary="Add cdktf">
364
- <option name="closed" value="true" />
365
- <created>1712394836168</created>
366
- <option name="number" value="00139" />
367
- <option name="presentableId" value="LOCAL-00139" />
368
- <option name="project" value="LOCAL" />
369
- <updated>1712394836169</updated>
370
- </task>
371
- <task id="LOCAL-00140" summary="Add cdktf">
372
- <option name="closed" value="true" />
373
- <created>1712394845245</created>
374
- <option name="number" value="00140" />
375
- <option name="presentableId" value="LOCAL-00140" />
376
- <option name="project" value="LOCAL" />
377
- <updated>1712394845245</updated>
378
- </task>
379
- <task id="LOCAL-00141" summary="Implement cdktf for empty AppService">
380
- <option name="closed" value="true" />
381
- <created>1712396217629</created>
382
- <option name="number" value="00141" />
383
- <option name="presentableId" value="LOCAL-00141" />
384
- <option name="project" value="LOCAL" />
385
- <updated>1712396217629</updated>
386
- </task>
387
- <task id="LOCAL-00142" summary="WIP: cdktf">
388
- <option name="closed" value="true" />
389
- <created>1712398173694</created>
390
- <option name="number" value="00142" />
391
- <option name="presentableId" value="LOCAL-00142" />
392
- <option name="project" value="LOCAL" />
393
- <updated>1712398173694</updated>
363
+ <workItem from="1712790206684" duration="453000" />
364
+ <workItem from="1712941939083" duration="1372000" />
365
+ <workItem from="1712943458951" duration="763000" />
394
366
  </task>
395
367
  <task id="LOCAL-00143" summary="WIP: cdktf">
396
368
  <option name="closed" value="true" />
@@ -752,7 +724,39 @@
752
724
  <option name="project" value="LOCAL" />
753
725
  <updated>1712782430277</updated>
754
726
  </task>
755
- <option name="localTasksCounter" value="188" />
727
+ <task id="LOCAL-00188" summary="Update description for ThisWebpage">
728
+ <option name="closed" value="true" />
729
+ <created>1712790512091</created>
730
+ <option name="number" value="00188" />
731
+ <option name="presentableId" value="LOCAL-00188" />
732
+ <option name="project" value="LOCAL" />
733
+ <updated>1712790512092</updated>
734
+ </task>
735
+ <task id="LOCAL-00189" summary="Fix bug with query params">
736
+ <option name="closed" value="true" />
737
+ <created>1712942987623</created>
738
+ <option name="number" value="00189" />
739
+ <option name="presentableId" value="LOCAL-00189" />
740
+ <option name="project" value="LOCAL" />
741
+ <updated>1712942987624</updated>
742
+ </task>
743
+ <task id="LOCAL-00190" summary="Pineapple v2.4.71">
744
+ <option name="closed" value="true" />
745
+ <created>1712943298855</created>
746
+ <option name="number" value="00190" />
747
+ <option name="presentableId" value="LOCAL-00190" />
748
+ <option name="project" value="LOCAL" />
749
+ <updated>1712943298856</updated>
750
+ </task>
751
+ <task id="LOCAL-00191" summary="Fix .gitignore">
752
+ <option name="closed" value="true" />
753
+ <created>1712944115604</created>
754
+ <option name="number" value="00191" />
755
+ <option name="presentableId" value="LOCAL-00191" />
756
+ <option name="project" value="LOCAL" />
757
+ <updated>1712944115604</updated>
758
+ </task>
759
+ <option name="localTasksCounter" value="192" />
756
760
  <servers />
757
761
  </component>
758
762
  <component name="TypeScriptGeneratedFilesManager">
@@ -810,10 +814,6 @@
810
814
  </option>
811
815
  </component>
812
816
  <component name="VcsManagerConfiguration">
813
- <MESSAGE value="Put parseQTTerms in afterUpdate instead of onMount" />
814
- <MESSAGE value="Add logs to observe queryTermMap in downstream package" />
815
- <MESSAGE value="Add logs to observe parseQtTerms in downstream package" />
816
- <MESSAGE value="Move parseQtTerm on afterUpdate" />
817
817
  <MESSAGE value="Change parseQueryTerm to parse during runtime on the DOM instead of on the raw svelte text" />
818
818
  <MESSAGE value="Add dynamic url adder UI" />
819
819
  <MESSAGE value="Add CreateUrl UI" />
@@ -835,6 +835,10 @@
835
835
  <MESSAGE value="Add ChumBucket" />
836
836
  <MESSAGE value="Fix align-items" />
837
837
  <MESSAGE value="Export GetLatestBlogs properly" />
838
- <option name="LAST_COMMIT_MESSAGE" value="Export GetLatestBlogs properly" />
838
+ <MESSAGE value="Update description for ThisWebpage" />
839
+ <MESSAGE value="Fix bug with query params" />
840
+ <MESSAGE value="Pineapple v2.4.71" />
841
+ <MESSAGE value="Fix .gitignore" />
842
+ <option name="LAST_COMMIT_MESSAGE" value="Fix .gitignore" />
839
843
  </component>
840
844
  </project>
@@ -0,0 +1 @@
1
+ server-temp
@@ -0,0 +1,2 @@
1
+ import { PrismaClient } from "@prisma/client";
2
+ export declare const prismaClient: PrismaClient<import(".prisma/client").Prisma.PrismaClientOptions, never, import("@prisma/client/runtime/library").DefaultArgs>;
@@ -0,0 +1,2 @@
1
+ import { PrismaClient } from "@prisma/client";
2
+ export const prismaClient = new PrismaClient();
@@ -10,63 +10,63 @@ const loadPageMeta = async () => {
10
10
  onMount(() => {
11
11
  loadPageMeta();
12
12
  });
13
- </script>
14
-
15
- <Card>
16
- <div slot="content" class="chum-bucket">
17
- <h2>More about me...</h2>
18
- <p>Check out the latest things I've been rambling about at
19
- <a href="https://turnipxenon.com" target="_blank">turnipxenon.com</a> or at
20
- <a href="https://turnipxenon.com/blogs/coding-chagrin" target="_blank">turnipxenon.com/blogs/coding-chagrin.</a>
21
- </p>
22
-
23
- {#if pageMetaList.length > 0}
24
- <h3><b>My latest blogs (sounds too fancy)</b></h3>
25
- {/if}
26
-
27
- <div class="chum-bucket-grid">
28
- {#each pageMetaList as pageMeta}
29
- <div class="chum-bucket-item">
30
- {#if pageMeta.imageUrl}
31
- <img src={`https://turnipxenon.com${pageMeta.imageUrl}`}
32
- class="chum-bucket-image"
33
- alt={pageMeta.imageAlt}>
34
- {/if}
35
- <div>
36
- <h3><a href={`https://turnipxenon.com/${pageMeta.relativeLink}`}>{pageMeta.title}</a></h3>
37
- <p>{pageMeta.description}</p>
38
- </div>
39
- </div>
40
- {/each}
41
- </div>
42
- </div>
43
- </Card>
44
-
45
- <style>
46
- .chum-bucket-item {
47
- width: 100%;
48
- display: flex;
49
- flex-direction: row;
50
- align-items: flex-start;
51
- }
52
-
53
- .chum-bucket-image {
54
- max-width: 10em;
55
- height: auto;
56
- margin-top: 0.5em;
57
- margin-inline-end: 1em;
58
- }
59
-
60
-
61
- .chum-bucket {
62
- padding: 1.5lh 2em;
63
- max-width: 600px;
64
- }
65
-
66
- .chum-bucket-grid {
67
- display: flex;
68
- flex-direction: column;
69
- margin-top: 0.5lh;
70
- gap: 0.5lh;
71
- }
72
- </style>
13
+ </script>
14
+
15
+ <Card>
16
+ <div slot="content" class="chum-bucket">
17
+ <h2>More about me...</h2>
18
+ <p>Check out the latest things I've been rambling about at
19
+ <a href="https://turnipxenon.com" target="_blank">turnipxenon.com</a> or at
20
+ <a href="https://turnipxenon.com/blogs/coding-chagrin" target="_blank">turnipxenon.com/blogs/coding-chagrin.</a>
21
+ </p>
22
+
23
+ {#if pageMetaList.length > 0}
24
+ <h3><b>My latest blogs (sounds too fancy)</b></h3>
25
+ {/if}
26
+
27
+ <div class="chum-bucket-grid">
28
+ {#each pageMetaList as pageMeta}
29
+ <div class="chum-bucket-item">
30
+ {#if pageMeta.imageUrl}
31
+ <img src={`https://turnipxenon.com${pageMeta.imageUrl}`}
32
+ class="chum-bucket-image"
33
+ alt={pageMeta.imageAlt}>
34
+ {/if}
35
+ <div>
36
+ <h3><a href={`https://turnipxenon.com/${pageMeta.relativeLink}`}>{pageMeta.title}</a></h3>
37
+ <p>{pageMeta.description}</p>
38
+ </div>
39
+ </div>
40
+ {/each}
41
+ </div>
42
+ </div>
43
+ </Card>
44
+
45
+ <style>
46
+ .chum-bucket-item {
47
+ width: 100%;
48
+ display: flex;
49
+ flex-direction: row;
50
+ align-items: flex-start;
51
+ }
52
+
53
+ .chum-bucket-image {
54
+ max-width: 10em;
55
+ height: auto;
56
+ margin-top: 0.5em;
57
+ margin-inline-end: 1em;
58
+ }
59
+
60
+
61
+ .chum-bucket {
62
+ padding: 1.5lh 2em;
63
+ max-width: 600px;
64
+ }
65
+
66
+ .chum-bucket-grid {
67
+ display: flex;
68
+ flex-direction: column;
69
+ margin-top: 0.5lh;
70
+ gap: 0.5lh;
71
+ }
72
+ </style>
@@ -105,8 +105,7 @@ const filterSearchParams = (searchParams) => {
105
105
  onMount(async () => {
106
106
  if (!letChaos && serverSideQueryParams) {
107
107
  filterSearchParams(new URLSearchParams(serverSideQueryParams));
108
- }
109
- if (!letChaos && $page.url.searchParams) {
108
+ } else if (!letChaos && $page.url.searchParams) {
110
109
  filterSearchParams($page.url.searchParams);
111
110
  }
112
111
  if (letChaos) {
@@ -215,12 +214,12 @@ $:
215
214
 
216
215
  <h2>Highlight</h2>
217
216
  <p>Worked on Go backend microservices and Typescript React frontend app, serving <b>over 30 million daily
218
- active users</b> at Twitch</p>
217
+ active users</b> at Twitch (an Amazon Web Services subsidiary)</p>
219
218
 
220
219
  <h2>Software Engineer</h2>
221
220
  <div class="two-column-separated">
222
221
  <div>July 2023 – January 2024</div>
223
- <div style="text-align: end">Twitch, Remote</div>
222
+ <div style="text-align: end">Twitch (Amazon Web Services), Remote</div>
224
223
  </div>
225
224
  <ul>
226
225
  <li>
@@ -246,7 +245,7 @@ $:
246
245
  <h2>Software Engineer Intern</h2>
247
246
  <div class="two-column-separated">
248
247
  <div>May 2022 – Aug 2022</div>
249
- <div style="text-align: end">Twitch, San Francisco</div>
248
+ <div style="text-align: end">Twitch (Amazon Web Services), San Francisco</div>
250
249
  </div>
251
250
  <ul>
252
251
  <li>
@@ -279,7 +278,7 @@ $:
279
278
  <h2>Software Engineer Intern</h2>
280
279
  <div class="two-column-separated">
281
280
  <div>May 2021 – Dec 2021</div>
282
- <div style="text-align: end">Twitch / Amazon Web Services Canada, Remote</div>
281
+ <div style="text-align: end">Twitch (Amazon Web Services), Remote</div>
283
282
  </div>
284
283
  <ul>
285
284
  <li>
@@ -37,8 +37,6 @@ declare module '$env/static/private' {
37
37
  export const COMSPEC: string;
38
38
  export const DriverData: string;
39
39
  export const EXEPATH: string;
40
- export const FPS_BROWSER_APP_PROFILE_STRING: string;
41
- export const FPS_BROWSER_USER_PROFILE_STRING: string;
42
40
  export const GIT_XL_PATH: string;
43
41
  export const GoLand: string;
44
42
  export const GOPATH: string;
@@ -86,6 +84,7 @@ declare module '$env/static/private' {
86
84
  export const npm_package_dependencies_string_width: string;
87
85
  export const npm_package_dependencies_svelte: string;
88
86
  export const npm_package_dependencies_ts_node: string;
87
+ export const npm_package_dependencies__prisma_client: string;
89
88
  export const npm_package_dependencies__skeletonlabs_skeleton: string;
90
89
  export const npm_package_dependencies__skeletonlabs_tw_plugin: string;
91
90
  export const npm_package_dependencies__sveltejs_kit: string;
@@ -100,6 +99,7 @@ declare module '$env/static/private' {
100
99
  export const npm_package_devDependencies_postcss: string;
101
100
  export const npm_package_devDependencies_prettier: string;
102
101
  export const npm_package_devDependencies_prettier_plugin_svelte: string;
102
+ export const npm_package_devDependencies_prisma: string;
103
103
  export const npm_package_devDependencies_svelte2tsx: string;
104
104
  export const npm_package_devDependencies_svelte_check: string;
105
105
  export const npm_package_devDependencies_tailwindcss: string;
@@ -230,8 +230,6 @@ declare module '$env/dynamic/private' {
230
230
  COMSPEC: string;
231
231
  DriverData: string;
232
232
  EXEPATH: string;
233
- FPS_BROWSER_APP_PROFILE_STRING: string;
234
- FPS_BROWSER_USER_PROFILE_STRING: string;
235
233
  GIT_XL_PATH: string;
236
234
  GoLand: string;
237
235
  GOPATH: string;
@@ -279,6 +277,7 @@ declare module '$env/dynamic/private' {
279
277
  npm_package_dependencies_string_width: string;
280
278
  npm_package_dependencies_svelte: string;
281
279
  npm_package_dependencies_ts_node: string;
280
+ npm_package_dependencies__prisma_client: string;
282
281
  npm_package_dependencies__skeletonlabs_skeleton: string;
283
282
  npm_package_dependencies__skeletonlabs_tw_plugin: string;
284
283
  npm_package_dependencies__sveltejs_kit: string;
@@ -293,6 +292,7 @@ declare module '$env/dynamic/private' {
293
292
  npm_package_devDependencies_postcss: string;
294
293
  npm_package_devDependencies_prettier: string;
295
294
  npm_package_devDependencies_prettier_plugin_svelte: string;
295
+ npm_package_devDependencies_prisma: string;
296
296
  npm_package_devDependencies_svelte2tsx: string;
297
297
  npm_package_devDependencies_svelte_check: string;
298
298
  npm_package_devDependencies_tailwindcss: string;
@@ -16,7 +16,8 @@ export const nodes = [
16
16
  () => import('./nodes/12'),
17
17
  () => import('./nodes/13'),
18
18
  () => import('./nodes/14'),
19
- () => import('./nodes/15')
19
+ () => import('./nodes/15'),
20
+ () => import('./nodes/16')
20
21
  ];
21
22
 
22
23
  export const server_loads = [];
@@ -33,7 +34,8 @@ export const dictionary = {
33
34
  "/(pineapple)/pineapple/(extra-pages)/page3/page7/(test_layout)/page8": [11,[2]],
34
35
  "/(pineapple)/pineapple/(extra-pages)/page4": [12,[2]],
35
36
  "/(seaweed)/portfolio": [~14,[3]],
36
- "/(seaweed)/portfolio/actual": [15,[3]]
37
+ "/(seaweed)/portfolio/actual": [15,[3]],
38
+ "/(seaweed)/portfolio/actual/[slug]": [~16,[3]]
37
39
  };
38
40
 
39
41
  export const hooks = {
@@ -0,0 +1 @@
1
+ export { default as component } from "../../../../src/routes/(seaweed)/portfolio/actual/[slug]/+page.svelte";
@@ -21,7 +21,7 @@ export const options = {
21
21
  app: ({ head, body, assets, nonce, env }) => "<!DOCTYPE html>\n<html lang=\"en\">\n\t<head>\n\t\t<meta charset=\"utf-8\" />\n\t\t<link rel=\"icon\" href=\"" + assets + "/favicon.png\" />\n\t\t<meta name=\"viewport\" content=\"width=device-width\" />\n\t\t" + head + "\n\t</head>\n\n\t<body data-sveltekit-preload-data=\"hover\" data-theme=\"crimson\">\n\t\t<div style=\"display: contents\" class=\"h-full overflow-hidden\">" + body + "</div>\n\t</body>\n</html>\n",
22
22
  error: ({ status, message }) => "<!doctype html>\n<html lang=\"en\">\n\t<head>\n\t\t<meta charset=\"utf-8\" />\n\t\t<title>" + message + "</title>\n\n\t\t<style>\n\t\t\tbody {\n\t\t\t\t--bg: white;\n\t\t\t\t--fg: #222;\n\t\t\t\t--divider: #ccc;\n\t\t\t\tbackground: var(--bg);\n\t\t\t\tcolor: var(--fg);\n\t\t\t\tfont-family:\n\t\t\t\t\tsystem-ui,\n\t\t\t\t\t-apple-system,\n\t\t\t\t\tBlinkMacSystemFont,\n\t\t\t\t\t'Segoe UI',\n\t\t\t\t\tRoboto,\n\t\t\t\t\tOxygen,\n\t\t\t\t\tUbuntu,\n\t\t\t\t\tCantarell,\n\t\t\t\t\t'Open Sans',\n\t\t\t\t\t'Helvetica Neue',\n\t\t\t\t\tsans-serif;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tjustify-content: center;\n\t\t\t\theight: 100vh;\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\t.error {\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t\tmax-width: 32rem;\n\t\t\t\tmargin: 0 1rem;\n\t\t\t}\n\n\t\t\t.status {\n\t\t\t\tfont-weight: 200;\n\t\t\t\tfont-size: 3rem;\n\t\t\t\tline-height: 1;\n\t\t\t\tposition: relative;\n\t\t\t\ttop: -0.05rem;\n\t\t\t}\n\n\t\t\t.message {\n\t\t\t\tborder-left: 1px solid var(--divider);\n\t\t\t\tpadding: 0 0 0 1rem;\n\t\t\t\tmargin: 0 0 0 1rem;\n\t\t\t\tmin-height: 2.5rem;\n\t\t\t\tdisplay: flex;\n\t\t\t\talign-items: center;\n\t\t\t}\n\n\t\t\t.message h1 {\n\t\t\t\tfont-weight: 400;\n\t\t\t\tfont-size: 1em;\n\t\t\t\tmargin: 0;\n\t\t\t}\n\n\t\t\t@media (prefers-color-scheme: dark) {\n\t\t\t\tbody {\n\t\t\t\t\t--bg: #222;\n\t\t\t\t\t--fg: #ddd;\n\t\t\t\t\t--divider: #666;\n\t\t\t\t}\n\t\t\t}\n\t\t</style>\n\t</head>\n\t<body>\n\t\t<div class=\"error\">\n\t\t\t<span class=\"status\">" + status + "</span>\n\t\t\t<div class=\"message\">\n\t\t\t\t<h1>" + message + "</h1>\n\t\t\t</div>\n\t\t</div>\n\t</body>\n</html>\n"
23
23
  },
24
- version_hash: "som2z5"
24
+ version_hash: "7ec9o8"
25
25
  };
26
26
 
27
27
  export async function get_hooks() {
@@ -25,5 +25,8 @@
25
25
  ],
26
26
  "/(seaweed)/portfolio/actual": [
27
27
  "src/routes/(seaweed)/portfolio/actual/+page.ts"
28
+ ],
29
+ "/(seaweed)/portfolio/actual/[slug]": [
30
+ "src/routes/(seaweed)/portfolio/actual/[slug]/+page.server.ts"
28
31
  ]
29
32
  }
@@ -11,8 +11,8 @@ type OutputDataShape<T> = MaybeWithVoid<Omit<App.PageData, RequiredKeys<T>> & Pa
11
11
  type EnsureDefined<T> = T extends null | undefined ? {} : T;
12
12
  type OptionalUnion<U extends Record<string, any>, A extends keyof U = U extends U ? keyof U : never> = U extends unknown ? { [P in Exclude<A, keyof U>]?: never } & U : never;
13
13
  export type Snapshot<T = any> = Kit.Snapshot<T>;
14
- type LayoutRouteId = RouteId | "/(pineapple)" | "/(pineapple)/pineapple/(extra-pages)/page1" | "/(pineapple)/pineapple/(extra-pages)/page2" | "/(pineapple)/pineapple/(extra-pages)/page3" | "/(pineapple)/pineapple/(extra-pages)/page3/page5" | "/(pineapple)/pineapple/(extra-pages)/page3/page6" | "/(pineapple)/pineapple/(extra-pages)/page3/page7" | "/(pineapple)/pineapple/(extra-pages)/page3/page7/(test_layout)/page8" | "/(pineapple)/pineapple/(extra-pages)/page4" | "/(pineapple)/pineapple/(pineapple)" | "/(seaweed)/portfolio" | "/(seaweed)/portfolio/actual" | null
15
- type LayoutParams = RouteParams & { }
14
+ type LayoutRouteId = RouteId | "/(pineapple)" | "/(pineapple)/pineapple/(extra-pages)/page1" | "/(pineapple)/pineapple/(extra-pages)/page2" | "/(pineapple)/pineapple/(extra-pages)/page3" | "/(pineapple)/pineapple/(extra-pages)/page3/page5" | "/(pineapple)/pineapple/(extra-pages)/page3/page6" | "/(pineapple)/pineapple/(extra-pages)/page3/page7" | "/(pineapple)/pineapple/(extra-pages)/page3/page7/(test_layout)/page8" | "/(pineapple)/pineapple/(extra-pages)/page4" | "/(pineapple)/pineapple/(pineapple)" | "/(seaweed)/portfolio" | "/(seaweed)/portfolio/actual" | "/(seaweed)/portfolio/actual/[slug]" | null
15
+ type LayoutParams = RouteParams & { slug?: string }
16
16
  type LayoutParentData = EnsureDefined<{}>;
17
17
 
18
18
  export type LayoutServerData = null;
@@ -11,8 +11,8 @@ type OutputDataShape<T> = MaybeWithVoid<Omit<App.PageData, RequiredKeys<T>> & Pa
11
11
  type EnsureDefined<T> = T extends null | undefined ? {} : T;
12
12
  type OptionalUnion<U extends Record<string, any>, A extends keyof U = U extends U ? keyof U : never> = U extends unknown ? { [P in Exclude<A, keyof U>]?: never } & U : never;
13
13
  export type Snapshot<T = any> = Kit.Snapshot<T>;
14
- type LayoutRouteId = RouteId | "/(seaweed)/portfolio" | "/(seaweed)/portfolio/actual"
15
- type LayoutParams = RouteParams & { }
14
+ type LayoutRouteId = RouteId | "/(seaweed)/portfolio" | "/(seaweed)/portfolio/actual" | "/(seaweed)/portfolio/actual/[slug]"
15
+ type LayoutParams = RouteParams & { slug?: string }
16
16
  type LayoutParentData = EnsureDefined<import('../$types.js').LayoutData>;
17
17
 
18
18
  export type LayoutServerData = null;
@@ -0,0 +1,25 @@
1
+ import type * as Kit from '@sveltejs/kit';
2
+
3
+ type Expand<T> = T extends infer O ? { [K in keyof O]: O[K] } : never;
4
+ // @ts-ignore
5
+ type MatcherParam<M> = M extends (param : string) => param is infer U ? U extends string ? U : string : string;
6
+ type RouteParams = { slug: string };
7
+ type RouteId = '/(seaweed)/portfolio/actual/[slug]';
8
+ type MaybeWithVoid<T> = {} extends T ? T | void : T;
9
+ export type RequiredKeys<T> = { [K in keyof T]-?: {} extends { [P in K]: T[K] } ? never : K; }[keyof T];
10
+ type OutputDataShape<T> = MaybeWithVoid<Omit<App.PageData, RequiredKeys<T>> & Partial<Pick<App.PageData, keyof T & keyof App.PageData>> & Record<string, any>>
11
+ type EnsureDefined<T> = T extends null | undefined ? {} : T;
12
+ type OptionalUnion<U extends Record<string, any>, A extends keyof U = U extends U ? keyof U : never> = U extends unknown ? { [P in Exclude<A, keyof U>]?: never } & U : never;
13
+ export type Snapshot<T = any> = Kit.Snapshot<T>;
14
+ type PageServerParentData = Omit<EnsureDefined<import('../../../../$types.js').LayoutServerData>, keyof import('../../../$types.js').LayoutServerData> & EnsureDefined<import('../../../$types.js').LayoutServerData>;
15
+ type PageParentData = Omit<EnsureDefined<import('../../../../$types.js').LayoutData>, keyof import('../../../$types.js').LayoutData> & EnsureDefined<import('../../../$types.js').LayoutData>;
16
+
17
+ export type EntryGenerator = () => Promise<Array<RouteParams>> | Array<RouteParams>;
18
+ export type PageServerLoad<OutputData extends OutputDataShape<PageServerParentData> = OutputDataShape<PageServerParentData>> = Kit.ServerLoad<RouteParams, PageServerParentData, OutputData, RouteId>;
19
+ export type PageServerLoadEvent = Parameters<PageServerLoad>[0];
20
+ export type ActionData = unknown;
21
+ export type PageServerData = Expand<OptionalUnion<EnsureDefined<Kit.LoadProperties<Awaited<ReturnType<typeof import('./proxy+page.server.js').load>>>>>>;
22
+ export type PageData = Expand<Omit<PageParentData, keyof PageServerData> & EnsureDefined<PageServerData>>;
23
+ export type Action<OutputData extends Record<string, any> | void = Record<string, any> | void> = Kit.Action<RouteParams, OutputData, RouteId>
24
+ export type Actions<OutputData extends Record<string, any> | void = Record<string, any> | void> = Kit.Actions<RouteParams, OutputData, RouteId>
25
+ export type RequestEvent = Kit.RequestEvent<RouteParams, RouteId>;
@@ -0,0 +1,36 @@
1
+ // @ts-nocheck
2
+ import type { PageServerLoad } from "./$types";
3
+ import type { SlugPageData } from "./SlugPageData";
4
+ import { prismaClient } from "$pkg/server-temp/prisma";
5
+
6
+
7
+ export const load = async ({ params }: Parameters<PageServerLoad>[0]): Promise<SlugPageData> => {
8
+ const slug = params.slug;
9
+ if (slug) {
10
+ try {
11
+ const queryParams = await prismaClient.seaweedParams.findFirst({
12
+ select: {
13
+ queryParams: true
14
+ },
15
+ where: { slug }
16
+ });
17
+
18
+ if (queryParams && queryParams.queryParams) {
19
+ return {
20
+ queryParams: queryParams.queryParams,
21
+ slugFound: true
22
+ };
23
+ }
24
+ } catch (error) {
25
+ console.error("[slug] page server-temp error:", error);
26
+ } finally {
27
+ prismaClient.$disconnect();
28
+ }
29
+ }
30
+
31
+ return {
32
+ queryParams: "",
33
+ slugFound: false
34
+ };
35
+ };
36
+
@@ -0,0 +1 @@
1
+ server-temp
@@ -0,0 +1,2 @@
1
+ import { PrismaClient } from "@prisma/client";
2
+ export declare const prismaClient: PrismaClient<import(".prisma/client").Prisma.PrismaClientOptions, never, import("@prisma/client/runtime/library").DefaultArgs>;
@@ -0,0 +1,2 @@
1
+ import { PrismaClient } from "@prisma/client";
2
+ export const prismaClient = new PrismaClient();
@@ -10,63 +10,63 @@ const loadPageMeta = async () => {
10
10
  onMount(() => {
11
11
  loadPageMeta();
12
12
  });
13
- </script>
14
-
15
- <Card>
16
- <div slot="content" class="chum-bucket">
17
- <h2>More about me...</h2>
18
- <p>Check out the latest things I've been rambling about at
19
- <a href="https://turnipxenon.com" target="_blank">turnipxenon.com</a> or at
20
- <a href="https://turnipxenon.com/blogs/coding-chagrin" target="_blank">turnipxenon.com/blogs/coding-chagrin.</a>
21
- </p>
22
-
23
- {#if pageMetaList.length > 0}
24
- <h3><b>My latest blogs (sounds too fancy)</b></h3>
25
- {/if}
26
-
27
- <div class="chum-bucket-grid">
28
- {#each pageMetaList as pageMeta}
29
- <div class="chum-bucket-item">
30
- {#if pageMeta.imageUrl}
31
- <img src={`https://turnipxenon.com${pageMeta.imageUrl}`}
32
- class="chum-bucket-image"
33
- alt={pageMeta.imageAlt}>
34
- {/if}
35
- <div>
36
- <h3><a href={`https://turnipxenon.com/${pageMeta.relativeLink}`}>{pageMeta.title}</a></h3>
37
- <p>{pageMeta.description}</p>
38
- </div>
39
- </div>
40
- {/each}
41
- </div>
42
- </div>
43
- </Card>
44
-
45
- <style>
46
- .chum-bucket-item {
47
- width: 100%;
48
- display: flex;
49
- flex-direction: row;
50
- align-items: flex-start;
51
- }
52
-
53
- .chum-bucket-image {
54
- max-width: 10em;
55
- height: auto;
56
- margin-top: 0.5em;
57
- margin-inline-end: 1em;
58
- }
59
-
60
-
61
- .chum-bucket {
62
- padding: 1.5lh 2em;
63
- max-width: 600px;
64
- }
65
-
66
- .chum-bucket-grid {
67
- display: flex;
68
- flex-direction: column;
69
- margin-top: 0.5lh;
70
- gap: 0.5lh;
71
- }
72
- </style>
13
+ </script>
14
+
15
+ <Card>
16
+ <div slot="content" class="chum-bucket">
17
+ <h2>More about me...</h2>
18
+ <p>Check out the latest things I've been rambling about at
19
+ <a href="https://turnipxenon.com" target="_blank">turnipxenon.com</a> or at
20
+ <a href="https://turnipxenon.com/blogs/coding-chagrin" target="_blank">turnipxenon.com/blogs/coding-chagrin.</a>
21
+ </p>
22
+
23
+ {#if pageMetaList.length > 0}
24
+ <h3><b>My latest blogs (sounds too fancy)</b></h3>
25
+ {/if}
26
+
27
+ <div class="chum-bucket-grid">
28
+ {#each pageMetaList as pageMeta}
29
+ <div class="chum-bucket-item">
30
+ {#if pageMeta.imageUrl}
31
+ <img src={`https://turnipxenon.com${pageMeta.imageUrl}`}
32
+ class="chum-bucket-image"
33
+ alt={pageMeta.imageAlt}>
34
+ {/if}
35
+ <div>
36
+ <h3><a href={`https://turnipxenon.com/${pageMeta.relativeLink}`}>{pageMeta.title}</a></h3>
37
+ <p>{pageMeta.description}</p>
38
+ </div>
39
+ </div>
40
+ {/each}
41
+ </div>
42
+ </div>
43
+ </Card>
44
+
45
+ <style>
46
+ .chum-bucket-item {
47
+ width: 100%;
48
+ display: flex;
49
+ flex-direction: row;
50
+ align-items: flex-start;
51
+ }
52
+
53
+ .chum-bucket-image {
54
+ max-width: 10em;
55
+ height: auto;
56
+ margin-top: 0.5em;
57
+ margin-inline-end: 1em;
58
+ }
59
+
60
+
61
+ .chum-bucket {
62
+ padding: 1.5lh 2em;
63
+ max-width: 600px;
64
+ }
65
+
66
+ .chum-bucket-grid {
67
+ display: flex;
68
+ flex-direction: column;
69
+ margin-top: 0.5lh;
70
+ gap: 0.5lh;
71
+ }
72
+ </style>
@@ -105,8 +105,7 @@ const filterSearchParams = (searchParams) => {
105
105
  onMount(async () => {
106
106
  if (!letChaos && serverSideQueryParams) {
107
107
  filterSearchParams(new URLSearchParams(serverSideQueryParams));
108
- }
109
- if (!letChaos && $page.url.searchParams) {
108
+ } else if (!letChaos && $page.url.searchParams) {
110
109
  filterSearchParams($page.url.searchParams);
111
110
  }
112
111
  if (letChaos) {
@@ -215,12 +214,12 @@ $:
215
214
 
216
215
  <h2>Highlight</h2>
217
216
  <p>Worked on Go backend microservices and Typescript React frontend app, serving <b>over 30 million daily
218
- active users</b> at Twitch</p>
217
+ active users</b> at Twitch (an Amazon Web Services subsidiary)</p>
219
218
 
220
219
  <h2>Software Engineer</h2>
221
220
  <div class="two-column-separated">
222
221
  <div>July 2023 – January 2024</div>
223
- <div style="text-align: end">Twitch, Remote</div>
222
+ <div style="text-align: end">Twitch (Amazon Web Services), Remote</div>
224
223
  </div>
225
224
  <ul>
226
225
  <li>
@@ -246,7 +245,7 @@ $:
246
245
  <h2>Software Engineer Intern</h2>
247
246
  <div class="two-column-separated">
248
247
  <div>May 2022 – Aug 2022</div>
249
- <div style="text-align: end">Twitch, San Francisco</div>
248
+ <div style="text-align: end">Twitch (Amazon Web Services), San Francisco</div>
250
249
  </div>
251
250
  <ul>
252
251
  <li>
@@ -279,7 +278,7 @@ $:
279
278
  <h2>Software Engineer Intern</h2>
280
279
  <div class="two-column-separated">
281
280
  <div>May 2021 – Dec 2021</div>
282
- <div style="text-align: end">Twitch / Amazon Web Services Canada, Remote</div>
281
+ <div style="text-align: end">Twitch (Amazon Web Services), Remote</div>
283
282
  </div>
284
283
  <ul>
285
284
  <li>
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@turnipxenon/pineapple",
3
3
  "description": "personal package for base styling for other personal projects",
4
- "version": "2.4.70",
4
+ "version": "2.4.72",
5
5
  "scripts": {
6
6
  "dev": "vite dev",
7
7
  "build": "vite build && yarn package",
@@ -33,6 +33,7 @@
33
33
  "postcss": "8.4.35",
34
34
  "prettier": "^3.2.5",
35
35
  "prettier-plugin-svelte": "^3.2.2",
36
+ "prisma": "^5.12.1",
36
37
  "svelte": "^4.2.12",
37
38
  "svelte-check": "^3.6.6",
38
39
  "svelte2tsx": "^0.6.20",
@@ -42,6 +43,7 @@
42
43
  "vite": "^5.1.5"
43
44
  },
44
45
  "dependencies": {
46
+ "@prisma/client": "^5.12.1",
45
47
  "@skeletonlabs/skeleton": "^2.9.0",
46
48
  "@skeletonlabs/tw-plugin": "^0.3.1",
47
49
  "@sveltejs/kit": "^2.5.2",
@@ -0,0 +1,7 @@
1
+ -- CreateTable
2
+ CREATE TABLE "SeaweedParams" (
3
+ "slug" TEXT NOT NULL,
4
+ "queryParams" TEXT NOT NULL,
5
+
6
+ CONSTRAINT "SeaweedParams_pkey" PRIMARY KEY ("slug")
7
+ );
@@ -0,0 +1,3 @@
1
+ # Please do not edit this file manually
2
+ # It should be added in your version-control system (i.e. Git)
3
+ provider = "postgresql"
@@ -0,0 +1,13 @@
1
+ generator client {
2
+ provider = "prisma-client-js"
3
+ }
4
+
5
+ datasource db {
6
+ provider = "postgresql"
7
+ url = env("POSTGRES_PRISMA_URL")
8
+ }
9
+
10
+ model SeaweedParams {
11
+ slug String @id
12
+ queryParams String
13
+ }
@@ -0,0 +1 @@
1
+ server-temp
@@ -1,7 +1,7 @@
1
- export const GetLatestBlogs = async () => {
2
- const resp = await fetch("http://turnipxenon.com/api/get-latest-blogs");
3
- if (!resp.ok) {
4
- return new Response(JSON.stringify([]));
5
- }
6
- return new Response(JSON.stringify(await resp.json()));
7
- };
1
+ export const GetLatestBlogs = async () => {
2
+ const resp = await fetch("http://turnipxenon.com/api/get-latest-blogs");
3
+ if (!resp.ok) {
4
+ return new Response(JSON.stringify([]));
5
+ }
6
+ return new Response(JSON.stringify(await resp.json()));
7
+ };
@@ -1,3 +1,3 @@
1
- // noinspection JSUnusedGlobalSymbols
2
-
3
- export * from "./GetLatestBlogs";
1
+ // noinspection JSUnusedGlobalSymbols
2
+
3
+ export * from "./GetLatestBlogs";
@@ -0,0 +1,3 @@
1
+ import { PrismaClient } from "@prisma/client";
2
+
3
+ export const prismaClient = new PrismaClient();
@@ -1,75 +1,75 @@
1
- <script lang="ts">
2
- import Card from "$pkg/components/Card.svelte";
3
- import { type PageMeta } from "$pkg";
4
- import { onMount } from "svelte";
5
-
6
- let pageMetaList: PageMeta[] = [];
7
- const loadPageMeta = async () => {
8
- fetch("/api/get-latest-blogs").then(resp => resp.json()).then(json => {
9
- pageMetaList = json as PageMeta[];
10
- });
11
- };
12
-
13
- onMount(() => {
14
- loadPageMeta();
15
- });
16
- </script>
17
-
18
- <Card>
19
- <div slot="content" class="chum-bucket">
20
- <h2>More about me...</h2>
21
- <p>Check out the latest things I've been rambling about at
22
- <a href="https://turnipxenon.com" target="_blank">turnipxenon.com</a> or at
23
- <a href="https://turnipxenon.com/blogs/coding-chagrin" target="_blank">turnipxenon.com/blogs/coding-chagrin.</a>
24
- </p>
25
-
26
- {#if pageMetaList.length > 0}
27
- <h3><b>My latest blogs (sounds too fancy)</b></h3>
28
- {/if}
29
-
30
- <div class="chum-bucket-grid">
31
- {#each pageMetaList as pageMeta}
32
- <div class="chum-bucket-item">
33
- {#if pageMeta.imageUrl}
34
- <img src={`https://turnipxenon.com${pageMeta.imageUrl}`}
35
- class="chum-bucket-image"
36
- alt={pageMeta.imageAlt}>
37
- {/if}
38
- <div>
39
- <h3><a href={`https://turnipxenon.com/${pageMeta.relativeLink}`}>{pageMeta.title}</a></h3>
40
- <p>{pageMeta.description}</p>
41
- </div>
42
- </div>
43
- {/each}
44
- </div>
45
- </div>
46
- </Card>
47
-
48
- <style lang="postcss">
49
- .chum-bucket-item {
50
- width: 100%;
51
- display: flex;
52
- flex-direction: row;
53
- align-items: flex-start;
54
- }
55
-
56
- .chum-bucket-image {
57
- max-width: 10em;
58
- height: auto;
59
- margin-top: 0.5em;
60
- margin-inline-end: 1em;
61
- }
62
-
63
-
64
- .chum-bucket {
65
- padding: 1.5lh 2em;
66
- max-width: 600px;
67
- }
68
-
69
- .chum-bucket-grid {
70
- display: flex;
71
- flex-direction: column;
72
- margin-top: 0.5lh;
73
- gap: 0.5lh;
74
- }
75
- </style>
1
+ <script lang="ts">
2
+ import Card from "$pkg/components/Card.svelte";
3
+ import { type PageMeta } from "$pkg";
4
+ import { onMount } from "svelte";
5
+
6
+ let pageMetaList: PageMeta[] = [];
7
+ const loadPageMeta = async () => {
8
+ fetch("/api/get-latest-blogs").then(resp => resp.json()).then(json => {
9
+ pageMetaList = json as PageMeta[];
10
+ });
11
+ };
12
+
13
+ onMount(() => {
14
+ loadPageMeta();
15
+ });
16
+ </script>
17
+
18
+ <Card>
19
+ <div slot="content" class="chum-bucket">
20
+ <h2>More about me...</h2>
21
+ <p>Check out the latest things I've been rambling about at
22
+ <a href="https://turnipxenon.com" target="_blank">turnipxenon.com</a> or at
23
+ <a href="https://turnipxenon.com/blogs/coding-chagrin" target="_blank">turnipxenon.com/blogs/coding-chagrin.</a>
24
+ </p>
25
+
26
+ {#if pageMetaList.length > 0}
27
+ <h3><b>My latest blogs (sounds too fancy)</b></h3>
28
+ {/if}
29
+
30
+ <div class="chum-bucket-grid">
31
+ {#each pageMetaList as pageMeta}
32
+ <div class="chum-bucket-item">
33
+ {#if pageMeta.imageUrl}
34
+ <img src={`https://turnipxenon.com${pageMeta.imageUrl}`}
35
+ class="chum-bucket-image"
36
+ alt={pageMeta.imageAlt}>
37
+ {/if}
38
+ <div>
39
+ <h3><a href={`https://turnipxenon.com/${pageMeta.relativeLink}`}>{pageMeta.title}</a></h3>
40
+ <p>{pageMeta.description}</p>
41
+ </div>
42
+ </div>
43
+ {/each}
44
+ </div>
45
+ </div>
46
+ </Card>
47
+
48
+ <style lang="postcss">
49
+ .chum-bucket-item {
50
+ width: 100%;
51
+ display: flex;
52
+ flex-direction: row;
53
+ align-items: flex-start;
54
+ }
55
+
56
+ .chum-bucket-image {
57
+ max-width: 10em;
58
+ height: auto;
59
+ margin-top: 0.5em;
60
+ margin-inline-end: 1em;
61
+ }
62
+
63
+
64
+ .chum-bucket {
65
+ padding: 1.5lh 2em;
66
+ max-width: 600px;
67
+ }
68
+
69
+ .chum-bucket-grid {
70
+ display: flex;
71
+ flex-direction: column;
72
+ margin-top: 0.5lh;
73
+ gap: 0.5lh;
74
+ }
75
+ </style>
@@ -152,9 +152,7 @@
152
152
  onMount(async () => {
153
153
  if (!letChaos && serverSideQueryParams) {
154
154
  filterSearchParams(new URLSearchParams(serverSideQueryParams));
155
- }
156
-
157
- if (!letChaos && $page.url.searchParams) {
155
+ } else if (!letChaos && $page.url.searchParams) {
158
156
  filterSearchParams($page.url.searchParams);
159
157
  }
160
158
 
@@ -276,12 +274,12 @@
276
274
 
277
275
  <h2>Highlight</h2>
278
276
  <p>Worked on Go backend microservices and Typescript React frontend app, serving <b>over 30 million daily
279
- active users</b> at Twitch</p>
277
+ active users</b> at Twitch (an Amazon Web Services subsidiary)</p>
280
278
 
281
279
  <h2>Software Engineer</h2>
282
280
  <div class="two-column-separated">
283
281
  <div>July 2023 – January 2024</div>
284
- <div style="text-align: end">Twitch, Remote</div>
282
+ <div style="text-align: end">Twitch (Amazon Web Services), Remote</div>
285
283
  </div>
286
284
  <ul>
287
285
  <li>
@@ -307,7 +305,7 @@
307
305
  <h2>Software Engineer Intern</h2>
308
306
  <div class="two-column-separated">
309
307
  <div>May 2022 – Aug 2022</div>
310
- <div style="text-align: end">Twitch, San Francisco</div>
308
+ <div style="text-align: end">Twitch (Amazon Web Services), San Francisco</div>
311
309
  </div>
312
310
  <ul>
313
311
  <li>
@@ -340,7 +338,7 @@
340
338
  <h2>Software Engineer Intern</h2>
341
339
  <div class="two-column-separated">
342
340
  <div>May 2021 – Dec 2021</div>
343
- <div style="text-align: end">Twitch / Amazon Web Services Canada, Remote</div>
341
+ <div style="text-align: end">Twitch (Amazon Web Services), Remote</div>
344
342
  </div>
345
343
  <ul>
346
344
  <li>
@@ -0,0 +1,35 @@
1
+ import type { PageServerLoad } from "./$types";
2
+ import type { SlugPageData } from "./SlugPageData";
3
+ import { prismaClient } from "$pkg/server-temp/prisma";
4
+
5
+
6
+ export const load: PageServerLoad = async ({ params }): Promise<SlugPageData> => {
7
+ const slug = params.slug;
8
+ if (slug) {
9
+ try {
10
+ const queryParams = await prismaClient.seaweedParams.findFirst({
11
+ select: {
12
+ queryParams: true
13
+ },
14
+ where: { slug }
15
+ });
16
+
17
+ if (queryParams && queryParams.queryParams) {
18
+ return {
19
+ queryParams: queryParams.queryParams,
20
+ slugFound: true
21
+ };
22
+ }
23
+ } catch (error) {
24
+ console.error("[slug] page server-temp error:", error);
25
+ } finally {
26
+ prismaClient.$disconnect();
27
+ }
28
+ }
29
+
30
+ return {
31
+ queryParams: "",
32
+ slugFound: false
33
+ };
34
+ };
35
+
@@ -0,0 +1,40 @@
1
+ <script lang="ts">
2
+ import type { SlugPageData } from "./SlugPageData";
3
+ import { getToastStore, type ToastSettings } from "@skeletonlabs/skeleton";
4
+ import { goto } from "$app/navigation";
5
+ import { onMount } from "svelte";
6
+ import { SeaweedTemplate } from "$pkg";
7
+
8
+ export let data: SlugPageData;
9
+
10
+ if (!data.slugFound) {
11
+ const toastStore = getToastStore();
12
+ const failToast: ToastSettings = {
13
+ message: "URL does not exist. Redirected to default page"
14
+ };
15
+ toastStore.trigger(failToast);
16
+ }
17
+
18
+ onMount(() => {
19
+ if (!data.slugFound) {
20
+ goto("/");
21
+ }
22
+ });
23
+ </script>
24
+
25
+ <svelte:head>
26
+ <meta charset="utf-8" />
27
+ <title>Welcome to Allan's portfolio</title>
28
+ <meta name="twitter:card" content="summary" />
29
+ <meta property="og:url" content="https://www.allanmanuba.com/" />
30
+ <meta property="og:title" content="Welcome to Allan's portfolio" />
31
+ <meta property="og:description" content="This is Allan's portfolio showcasing his experience, games, and projects" />
32
+ </svelte:head>
33
+
34
+ <SeaweedTemplate letChaos={false}
35
+ name="Allan"
36
+ email="allanmanuba@gmail.com"
37
+ linkedinSlug="allan-manuba"
38
+ serverSideQueryParams={data.queryParams}
39
+ domain="https://www.allanmanuba.com/">
40
+ </SeaweedTemplate>
@@ -0,0 +1,4 @@
1
+ export interface SlugPageData {
2
+ queryParams: string;
3
+ slugFound: boolean;
4
+ }
@@ -1,4 +1,4 @@
1
- import type { RequestHandler } from "./$types";
2
- import { GetLatestBlogs } from "$pkg/api/GetLatestBlogs";
3
-
4
- export const GET: RequestHandler = GetLatestBlogs;
1
+ import type { RequestHandler } from "./$types";
2
+ import { GetLatestBlogs } from "$pkg/api/GetLatestBlogs";
3
+
4
+ export const GET: RequestHandler = GetLatestBlogs;
package/yarn.lock CHANGED
@@ -276,6 +276,47 @@
276
276
  resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.24.tgz#58601079e11784d20f82d0585865bb42305c4df3"
277
277
  integrity sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==
278
278
 
279
+ "@prisma/client@^5.12.1":
280
+ version "5.12.1"
281
+ resolved "https://registry.yarnpkg.com/@prisma/client/-/client-5.12.1.tgz#c26a674fea76754b3a9e8b90a11e617f90212f76"
282
+ integrity sha512-6/JnizEdlSBxDIdiLbrBdMW5NqDxOmhXAJaNXiPpgzAPr/nLZResT6MMpbOHLo5yAbQ1Vv5UU8PTPRzb0WIxdA==
283
+
284
+ "@prisma/debug@5.12.1":
285
+ version "5.12.1"
286
+ resolved "https://registry.yarnpkg.com/@prisma/debug/-/debug-5.12.1.tgz#007c8ad2e466d565bcd0671b8846c27f8700c722"
287
+ integrity sha512-kd/wNsR0klrv79o1ITsbWxYyh4QWuBidvxsXSParPsYSu0ircUmNk3q4ojsgNc3/81b0ozg76iastOG43tbf8A==
288
+
289
+ "@prisma/engines-version@5.12.0-21.473ed3124229e22d881cb7addf559799debae1ab":
290
+ version "5.12.0-21.473ed3124229e22d881cb7addf559799debae1ab"
291
+ resolved "https://registry.yarnpkg.com/@prisma/engines-version/-/engines-version-5.12.0-21.473ed3124229e22d881cb7addf559799debae1ab.tgz#c78d099a3fe86d446db7442e64e56987e39e7f32"
292
+ integrity sha512-6yvO8s80Tym61aB4QNtYZfWVmE3pwqe807jEtzm8C5VDe7nw8O1FGX3TXUaXmWV0fQTIAfRbeL2Gwrndabp/0g==
293
+
294
+ "@prisma/engines@5.12.1":
295
+ version "5.12.1"
296
+ resolved "https://registry.yarnpkg.com/@prisma/engines/-/engines-5.12.1.tgz#a50649427d627a9af962a188a84c65d61c6e2b3f"
297
+ integrity sha512-HQDdglLw2bZR/TXD2Y+YfDMvi5Q8H+acbswqOsWyq9pPjBLYJ6gzM+ptlTU/AV6tl0XSZLU1/7F4qaWa8bqpJA==
298
+ dependencies:
299
+ "@prisma/debug" "5.12.1"
300
+ "@prisma/engines-version" "5.12.0-21.473ed3124229e22d881cb7addf559799debae1ab"
301
+ "@prisma/fetch-engine" "5.12.1"
302
+ "@prisma/get-platform" "5.12.1"
303
+
304
+ "@prisma/fetch-engine@5.12.1":
305
+ version "5.12.1"
306
+ resolved "https://registry.yarnpkg.com/@prisma/fetch-engine/-/fetch-engine-5.12.1.tgz#c38e9fa17fdc535b4c83cbb7645569ad0a511fa9"
307
+ integrity sha512-qSs3KcX1HKcea1A+hlJVK/ljj0PNIUHDxAayGMvgJBqmaN32P9tCidlKz1EGv6WoRFICYnk3Dd/YFLBwnFIozA==
308
+ dependencies:
309
+ "@prisma/debug" "5.12.1"
310
+ "@prisma/engines-version" "5.12.0-21.473ed3124229e22d881cb7addf559799debae1ab"
311
+ "@prisma/get-platform" "5.12.1"
312
+
313
+ "@prisma/get-platform@5.12.1":
314
+ version "5.12.1"
315
+ resolved "https://registry.yarnpkg.com/@prisma/get-platform/-/get-platform-5.12.1.tgz#33f427f6d744dee62a9e06858889691d78b50804"
316
+ integrity sha512-pgIR+pSvhYHiUcqXVEZS31NrFOTENC9yFUdEAcx7cdQBoZPmHVjtjN4Ss6NzVDMYPrKJJ51U14EhEoeuBlMioQ==
317
+ dependencies:
318
+ "@prisma/debug" "5.12.1"
319
+
279
320
  "@rollup/rollup-android-arm-eabi@4.12.1":
280
321
  version "4.12.1"
281
322
  resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.1.tgz#11aaa02a933864b87f0b31cf2b755734e1f22787"
@@ -1980,6 +2021,13 @@ prettier@^3.2.5:
1980
2021
  resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.2.5.tgz#e52bc3090586e824964a8813b09aba6233b28368"
1981
2022
  integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==
1982
2023
 
2024
+ prisma@^5.12.1:
2025
+ version "5.12.1"
2026
+ resolved "https://registry.yarnpkg.com/prisma/-/prisma-5.12.1.tgz#db4596253bb066afc9f08744642f200a398d8d51"
2027
+ integrity sha512-SkMnb6wyIxTv9ACqiHBI2u9gD6y98qXRoCoLEnZsF6yee5Qg828G+ARrESN+lQHdw4maSZFFSBPPDpvSiVTo0Q==
2028
+ dependencies:
2029
+ "@prisma/engines" "5.12.1"
2030
+
1983
2031
  publint@^0.2.7:
1984
2032
  version "0.2.7"
1985
2033
  resolved "https://registry.yarnpkg.com/publint/-/publint-0.2.7.tgz#7b57ec5ff117c329f56dfe98d328e2bd860e12bf"