0.0.9
Publish npm package / publish (push) Failing after 16s

This commit is contained in:
2026-10-08 09:39:38 +02:00
parent 8e3abca9d7
commit 6afe1f7b67
25 changed files with 340 additions and 170 deletions
@@ -12,15 +12,20 @@
"check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch"
},
"devDependencies": {
"@sveltejs/adapter-auto": "^7.0.1",
"@sveltejs/kit": "^2.57.0",
"@sveltejs/vite-plugin-svelte": "^7.0.0",
"svelte": "^5.55.2",
"svelte-check": "^4.4.6",
"typescript": "^6.0.2",
"vite": "^8.0.7"
"@sveltejs/adapter-auto": "^8.0.0",
"@sveltejs/kit": "^3.0.0",
"@sveltejs/vite-plugin-svelte": "^7.2.0",
"svelte": "^5.57.1",
"svelte-check": "^4.6.0",
"typescript": "^6.0.3",
"vite": "^8.3.0"
},
"imports": {
"#lib": "./src/lib/index.js",
"#lib/*": "./src/lib/*"
},
"dependencies": {
"@<@var(context.project.name)>/rpc": "workspace:*"
"@<@var(context.project.name)>/rpc": "workspace:*",
"gsap": "^3.15.0"
}
}
@@ -0,0 +1,13 @@
// See https://svelte.dev/docs/kit/types#app.d.ts
// for information about these interfaces
declare global {
namespace App {
// interface Error {}
// interface Locals {}
// interface PageData {}
// interface PageState {}
// interface Platform {}
}
}
export {};
@@ -1 +1 @@
// place files you want to import through the `$lib` alias in this folder.
// place files you want to import through the `#lib` alias in this folder.
@@ -1,7 +1,8 @@
<script lang="ts">
import favicon from '$lib/assets/favicon.svg';
import favicon from '#lib/assets/favicon.svg';
import type { LayoutProps } from './$types';
let { children } = $props();
let { children }: LayoutProps = $props();
</script>
<svelte:head>
@@ -1,16 +1,35 @@
<script lang="ts">
import { tick } from "svelte"
import { gsap } from "gsap"
import { Flip } from "gsap/Flip"
import { createRouter, type Todo } from "@<@var(context.project.name)>/rpc"
const router = createRouter("http://127.0.0.1:8080");
gsap.registerPlugin(Flip)
const router = createRouter("http://127.0.0.1:8080")
// Changes made elsewhere (another tab, the mobile app) show up within this interval.
const syncIntervalMs = 2000
let todos = $state<Todo[]>([])
let offline = $state(false)
let todoToCreateTask = $state<string>("")
// Like the mobile app: rows spring into their new place when the list re-sorts, new rows fade in.
const showTodos = async (next: Todo[]) => {
const rows = Flip.getState(".todo-row")
todos = next
await tick()
Flip.from(rows, {
targets: ".todo-row",
duration: 0.5,
ease: "back.out(1.4)",
onEnter: (entering) => gsap.fromTo(entering, { opacity: 0 }, { opacity: 1, duration: 0.3 }),
})
}
const fetchTodos = () => {
router.todos.listTodos({}).then((r) => {
offline = false
// Polling returns the same list most of the time; skip re-rendering it.
if (JSON.stringify($state.snapshot(todos)) !== JSON.stringify(r.todos)) todos = r.todos
if (JSON.stringify($state.snapshot(todos)) !== JSON.stringify(r.todos)) showTodos(r.todos)
}).catch(() => offline = true)
}
$effect(() => {
@@ -26,7 +45,8 @@
}
const deleteTodo = (id: string) => {
return () => {
return async (event: Event & { currentTarget: HTMLElement }) => {
await gsap.to(event.currentTarget.closest(".todo-row"), { opacity: 0, duration: 0.3 })
router.todos.deleteTodo({ todo: { id } }).then(fetchTodos, () => offline = true)
}
}
@@ -41,16 +61,26 @@
}
</script>
<div>
<main>
<h1>Create Todo</h1>
{#if offline}<p style="color: #d32f2f">Can't reach the API, retrying…</p>{/if}
<input bind:value={todoToCreateTask} type="text" placeholder="What needs to be done?"/>
<button onclick={createTodo}> create </button>
{#if offline}<p class="offline">Can't reach the API, retrying…</p>{/if}
<form onsubmit={(event) => { event.preventDefault(); createTodo() }}>
<input bind:value={todoToCreateTask} type="text" placeholder="What needs to be done?"/>
<button>create Todo</button>
</form>
{#each todos as todo (todo.id)}
<div>
{todo.task}
<input type='checkbox' checked={todo.done} onchange={setTodoDone(todo.id || "",todo.task)}/>
<button onclick={deleteTodo(todo.id || "")}>delete</button>
</div>
<div class="todo-row" data-flip-id={todo.id}>
<span>{todo.task}</span>
<input type="checkbox" checked={todo.done} onchange={setTodoDone(todo.id || "", todo.task)}/>
<button onclick={deleteTodo(todo.id || "")}>delete</button>
</div>
{/each}
</div>
</main>
<style>
main { max-width: 32rem; margin: 2rem auto; font-family: system-ui, sans-serif; }
form, .todo-row { display: flex; gap: 0.75rem; align-items: center; margin-bottom: 0.75rem; }
input[type="text"] { flex: 1; padding: 0.5rem; border: 1px solid #8e8e93; border-radius: 8px; }
.todo-row span { flex: 1; }
.offline { color: #d32f2f; }
</style>
@@ -1,17 +0,0 @@
import adapter from '@sveltejs/adapter-auto';
/** @type {import('@sveltejs/kit').Config} */
const config = {
compilerOptions: {
// Force runes mode for the project, except for libraries. Can be removed in svelte 6.
runes: ({ filename }) => (filename.split(/[/\\]/).includes('node_modules') ? undefined : true)
},
kit: {
// adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list.
// If your environment is not supported, or you settled on a specific environment, switch out the adapter.
// See https://svelte.dev/docs/kit/adapters for more information about adapters.
adapter: adapter()
}
};
export default config;
@@ -1,20 +1,7 @@
{
"extends": "./.svelte-kit/tsconfig.json",
"extends": "$app/tsconfig",
"compilerOptions": {
"rewriteRelativeImportExtensions": true,
"allowJs": true,
"checkJs": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"skipLibCheck": true,
"sourceMap": true,
"strict": true,
"moduleResolution": "bundler"
}
// Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias
// except $lib which is handled by https://svelte.dev/docs/kit/configuration#files
//
// To make changes to top-level options such as include and exclude, we recommend extending
// the generated config; see https://svelte.dev/docs/kit/configuration#typescript
"strict": true
},
"include": ["src", "vite.config.ts"]
}
@@ -1,6 +1,20 @@
import adapter from '@sveltejs/adapter-auto';
import { sveltekit } from '@sveltejs/kit/vite';
import { defineConfig } from 'vite';
export default defineConfig({
plugins: [sveltekit()]
plugins: [
sveltekit({
compilerOptions: {
// Force runes mode for the project, except for libraries. Can be removed in svelte 6.
runes: ({ filename }) =>
filename.split(/[/\\]/).includes('node_modules') ? undefined : true
},
// adapter-auto only supports some environments, see https://svelte.dev/docs/kit/adapter-auto for a list.
// If your environment is not supported, or you settled on a specific environment, switch out the adapter.
// See https://svelte.dev/docs/kit/adapters for more information about adapters.
adapter: adapter()
})
]
});