@askrjs/cli 0.0.3 → 0.0.4
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/README.md +37 -0
- package/dist/add.d.ts +16 -0
- package/dist/add.js +33 -29
- package/dist/cli.d.ts +5 -0
- package/dist/cli.js +0 -2
- package/dist/create.d.ts +5 -0
- package/dist/create.js +104 -26
- package/dist/directory-swap-DWoHtx7C.js +35 -0
- package/dist/discovery-Difb7Y4G.js +0 -2
- package/dist/generate.d.ts +5 -0
- package/dist/generate.js +77 -12
- package/dist/is-direct-execution-Cdlr-ZUl.js +0 -2
- package/dist/openapi.d.ts +25 -0
- package/dist/openapi.js +44 -12
- package/dist/planner-VAj7qlxr.js +0 -2
- package/dist/range-YUs9eimn.js +0 -2
- package/dist/registry-CyrRHRG5.js +0 -2
- package/dist/skills/askr-ssr-ssg/SKILL.md +3 -1
- package/dist/{skills-Bh0mEhIx.js → skills-B7CbWur9.js} +89 -26
- package/dist/skills.d.ts +18 -0
- package/dist/skills.js +1 -1
- package/dist/specification-DXnDOC-0.js +0 -2
- package/dist/ssg-config.d.ts +41 -0
- package/dist/ssg-config.js +1 -0
- package/dist/ssg.d.ts +61 -0
- package/dist/ssg.js +360 -24
- package/dist/templates/full-stack/package.json +1 -1
- package/dist/templates/full-stack/src/server/action-registry.ts +0 -1
- package/dist/templates/full-stack/tsconfig.json +1 -1
- package/dist/templates/spa/package.json +2 -3
- package/dist/templates/spa/src/pages/app/_routes.tsx +2 -0
- package/dist/templates/spa/src/pages/public/_routes.tsx +2 -0
- package/dist/templates/spa/tsconfig.json +2 -1
- package/dist/templates/spa/vitest.config.ts +0 -4
- package/dist/templates/ssg/README.md +1 -1
- package/dist/templates/ssg/package.json +1 -1
- package/dist/templates/ssg/ssg.config.ts +7 -0
- package/dist/templates/ssg/tests/ssg-config.test.ts +2 -0
- package/dist/templates/ssg/tsconfig.json +2 -1
- package/dist/templates/ssg/vitest.config.ts +0 -4
- package/dist/templates/ssr/package.json +2 -2
- package/dist/templates/startkit/package.json +2 -2
- package/dist/templates/startkit/src/lib/mock-data.ts +17 -39
- package/dist/templates/startkit/tsconfig.json +2 -1
- package/dist/update.d.ts +41 -0
- package/dist/update.js +0 -2
- package/dist/writer-D8qe_7ud.js +0 -2
- package/package.json +13 -8
- package/dist/add.js.map +0 -1
- package/dist/cli.js.map +0 -1
- package/dist/create.js.map +0 -1
- package/dist/discovery-Difb7Y4G.js.map +0 -1
- package/dist/generate.js.map +0 -1
- package/dist/is-direct-execution-Cdlr-ZUl.js.map +0 -1
- package/dist/openapi.js.map +0 -1
- package/dist/planner-VAj7qlxr.js.map +0 -1
- package/dist/range-YUs9eimn.js.map +0 -1
- package/dist/registry-CyrRHRG5.js.map +0 -1
- package/dist/skills-Bh0mEhIx.js.map +0 -1
- package/dist/specification-DXnDOC-0.js.map +0 -1
- package/dist/ssg.js.map +0 -1
- package/dist/templates/full-stack/src/vite-server.d.ts +0 -5
- package/dist/templates/spa/src/styles.d.ts +0 -1
- package/dist/templates/ssg/src/vite-env.d.ts +0 -5
- package/dist/templates/ssr/src/vite-server.d.ts +0 -7
- package/dist/templates/startkit/src/vite-env.d.ts +0 -5
- package/dist/update.js.map +0 -1
- package/dist/writer-D8qe_7ud.js.map +0 -1
- package/skills/askr-accessibility/SKILL.md +0 -68
- package/skills/askr-accessibility/agents/openai.yaml +0 -4
- package/skills/askr-agent-execution/SKILL.md +0 -85
- package/skills/askr-agent-execution/agents/openai.yaml +0 -4
- package/skills/askr-agent-workflows/SKILL.md +0 -57
- package/skills/askr-agent-workflows/agents/openai.yaml +0 -4
- package/skills/askr-api-integration/SKILL.md +0 -79
- package/skills/askr-api-integration/agents/openai.yaml +0 -4
- package/skills/askr-app-builder/SKILL.md +0 -99
- package/skills/askr-app-builder/agents/openai.yaml +0 -4
- package/skills/askr-auth-access/SKILL.md +0 -74
- package/skills/askr-auth-access/agents/openai.yaml +0 -4
- package/skills/askr-cli-vite/SKILL.md +0 -76
- package/skills/askr-cli-vite/agents/openai.yaml +0 -4
- package/skills/askr-dashboard-charts/SKILL.md +0 -99
- package/skills/askr-dashboard-charts/agents/openai.yaml +0 -4
- package/skills/askr-design-system/SKILL.md +0 -86
- package/skills/askr-design-system/agents/openai.yaml +0 -4
- package/skills/askr-env-config/SKILL.md +0 -74
- package/skills/askr-env-config/agents/openai.yaml +0 -4
- package/skills/askr-error-loading-empty/SKILL.md +0 -89
- package/skills/askr-error-loading-empty/agents/openai.yaml +0 -4
- package/skills/askr-file-upload-artifacts/SKILL.md +0 -77
- package/skills/askr-file-upload-artifacts/agents/openai.yaml +0 -4
- package/skills/askr-forms-tables-crud/SKILL.md +0 -98
- package/skills/askr-forms-tables-crud/agents/openai.yaml +0 -4
- package/skills/askr-mental-model/SKILL.md +0 -109
- package/skills/askr-mental-model/agents/openai.yaml +0 -4
- package/skills/askr-migration-react/SKILL.md +0 -81
- package/skills/askr-migration-react/agents/openai.yaml +0 -4
- package/skills/askr-observability-debugging/SKILL.md +0 -83
- package/skills/askr-observability-debugging/agents/openai.yaml +0 -4
- package/skills/askr-project-structure/SKILL.md +0 -79
- package/skills/askr-project-structure/agents/openai.yaml +0 -4
- package/skills/askr-query-mutation/SKILL.md +0 -115
- package/skills/askr-query-mutation/agents/openai.yaml +0 -4
- package/skills/askr-realtime-streaming/SKILL.md +0 -76
- package/skills/askr-realtime-streaming/agents/openai.yaml +0 -4
- package/skills/askr-resources-data/SKILL.md +0 -100
- package/skills/askr-resources-data/agents/openai.yaml +0 -4
- package/skills/askr-routing-layouts/SKILL.md +0 -107
- package/skills/askr-routing-layouts/agents/openai.yaml +0 -4
- package/skills/askr-runtime-reactivity/SKILL.md +0 -92
- package/skills/askr-runtime-reactivity/agents/openai.yaml +0 -4
- package/skills/askr-ssr-ssg/SKILL.md +0 -76
- package/skills/askr-ssr-ssg/agents/openai.yaml +0 -4
- package/skills/askr-testing-determinism/SKILL.md +0 -75
- package/skills/askr-testing-determinism/agents/openai.yaml +0 -4
- package/skills/askr-theming/SKILL.md +0 -86
- package/skills/askr-theming/agents/openai.yaml +0 -4
- package/skills/askr-ui-composition/SKILL.md +0 -92
- package/skills/askr-ui-composition/agents/openai.yaml +0 -4
- package/templates/full-stack/AGENTS.md +0 -11
- package/templates/full-stack/README.md +0 -17
- package/templates/full-stack/gitignore.template +0 -4
- package/templates/full-stack/index.html +0 -13
- package/templates/full-stack/package.json +0 -39
- package/templates/full-stack/server.ts +0 -9
- package/templates/full-stack/src/action-authorizations.ts +0 -10
- package/templates/full-stack/src/actions/create-message.ts +0 -10
- package/templates/full-stack/src/i18n.ts +0 -8
- package/templates/full-stack/src/main.tsx +0 -11
- package/templates/full-stack/src/pages/home.tsx +0 -25
- package/templates/full-stack/src/pages/layout.tsx +0 -43
- package/templates/full-stack/src/pages/not-found.tsx +0 -7
- package/templates/full-stack/src/routes.tsx +0 -19
- package/templates/full-stack/src/schemas.ts +0 -10
- package/templates/full-stack/src/server/action-registry.ts +0 -8
- package/templates/full-stack/src/server/actions/create-message.ts +0 -14
- package/templates/full-stack/src/server/app.ts +0 -76
- package/templates/full-stack/src/server/dependencies.ts +0 -55
- package/templates/full-stack/src/server/entry-server.ts +0 -8
- package/templates/full-stack/src/telemetry.ts +0 -3
- package/templates/full-stack/src/vite-server.d.ts +0 -5
- package/templates/full-stack/tests/actions/create-message.test.ts +0 -12
- package/templates/full-stack/tsconfig.json +0 -15
- package/templates/full-stack/vite.config.ts +0 -10
- package/templates/spa/AGENTS.md +0 -60
- package/templates/spa/README.md +0 -96
- package/templates/spa/gitignore.template +0 -16
- package/templates/spa/index.html +0 -13
- package/templates/spa/package.json +0 -35
- package/templates/spa/src/adapters/operations-client.ts +0 -95
- package/templates/spa/src/components/shared/metric-card.tsx +0 -27
- package/templates/spa/src/components/shared/status-badge.tsx +0 -24
- package/templates/spa/src/features/operations/operations.query.ts +0 -9
- package/templates/spa/src/main.tsx +0 -10
- package/templates/spa/src/pages/_layout.tsx +0 -9
- package/templates/spa/src/pages/_routes.tsx +0 -27
- package/templates/spa/src/pages/app/_layout.tsx +0 -94
- package/templates/spa/src/pages/app/_routes.tsx +0 -10
- package/templates/spa/src/pages/app/admin-home.tsx +0 -170
- package/templates/spa/src/pages/app/agent-runs.tsx +0 -93
- package/templates/spa/src/pages/app/settings.tsx +0 -91
- package/templates/spa/src/pages/auth/_layout.tsx +0 -38
- package/templates/spa/src/pages/auth/_routes.tsx +0 -6
- package/templates/spa/src/pages/auth/login.tsx +0 -63
- package/templates/spa/src/pages/not-found.tsx +0 -22
- package/templates/spa/src/pages/public/_layout.tsx +0 -47
- package/templates/spa/src/pages/public/_routes.tsx +0 -6
- package/templates/spa/src/pages/public/home.tsx +0 -143
- package/templates/spa/src/shared/format.ts +0 -12
- package/templates/spa/src/shared/navigation.ts +0 -15
- package/templates/spa/src/styles/components.css +0 -49
- package/templates/spa/src/styles/layout.css +0 -192
- package/templates/spa/src/styles/reset.css +0 -44
- package/templates/spa/src/styles/theme.css +0 -57
- package/templates/spa/src/styles/tokens.css +0 -20
- package/templates/spa/src/styles.css +0 -7
- package/templates/spa/src/styles.d.ts +0 -1
- package/templates/spa/tests/app.test.tsx +0 -37
- package/templates/spa/tests/components/shared.test.tsx +0 -12
- package/templates/spa/tests/resources.test.ts +0 -22
- package/templates/spa/tsconfig.json +0 -20
- package/templates/spa/tsconfig.node.json +0 -10
- package/templates/spa/vite.config.ts +0 -24
- package/templates/spa/vitest.config.ts +0 -17
- package/templates/ssg/AGENTS.md +0 -55
- package/templates/ssg/README.md +0 -39
- package/templates/ssg/gitignore.template +0 -17
- package/templates/ssg/index.html +0 -13
- package/templates/ssg/package.json +0 -35
- package/templates/ssg/src/app.tsx +0 -14
- package/templates/ssg/src/components/badge.tsx +0 -3
- package/templates/ssg/src/components/counter.tsx +0 -30
- package/templates/ssg/src/components/site-shell.tsx +0 -111
- package/templates/ssg/src/jsx.d.ts +0 -23
- package/templates/ssg/src/main.tsx +0 -8
- package/templates/ssg/src/pages/about.tsx +0 -82
- package/templates/ssg/src/pages/content.tsx +0 -63
- package/templates/ssg/src/pages/example.tsx +0 -97
- package/templates/ssg/src/pages/home.tsx +0 -51
- package/templates/ssg/src/resources/user.ts +0 -15
- package/templates/ssg/src/routes.tsx +0 -15
- package/templates/ssg/src/styles.css +0 -89
- package/templates/ssg/src/vite-env.d.ts +0 -5
- package/templates/ssg/ssg.config.ts +0 -34
- package/templates/ssg/tests/app.test.tsx +0 -19
- package/templates/ssg/tests/components/counter.test.tsx +0 -18
- package/templates/ssg/tests/resources.test.ts +0 -11
- package/templates/ssg/tests/ssg-config.test.ts +0 -11
- package/templates/ssg/tsconfig.json +0 -20
- package/templates/ssg/tsconfig.node.json +0 -10
- package/templates/ssg/vite.config.ts +0 -24
- package/templates/ssg/vitest.config.ts +0 -17
- package/templates/ssr/AGENTS.md +0 -28
- package/templates/ssr/README.md +0 -38
- package/templates/ssr/gitignore.template +0 -16
- package/templates/ssr/index.html +0 -13
- package/templates/ssr/package.json +0 -34
- package/templates/ssr/server.ts +0 -10
- package/templates/ssr/src/app.tsx +0 -21
- package/templates/ssr/src/components/counter.tsx +0 -26
- package/templates/ssr/src/entry-server.tsx +0 -12
- package/templates/ssr/src/main.tsx +0 -11
- package/templates/ssr/src/pages/about.tsx +0 -75
- package/templates/ssr/src/pages/example.tsx +0 -113
- package/templates/ssr/src/pages/home.tsx +0 -56
- package/templates/ssr/src/resources/user.ts +0 -15
- package/templates/ssr/src/routes.tsx +0 -13
- package/templates/ssr/src/styles.css +0 -148
- package/templates/ssr/src/vite-server.d.ts +0 -7
- package/templates/ssr/tests/app.test.tsx +0 -24
- package/templates/ssr/tests/components/counter.test.tsx +0 -13
- package/templates/ssr/tests/resources.test.ts +0 -11
- package/templates/ssr/tsconfig.json +0 -22
- package/templates/ssr/tsconfig.node.json +0 -10
- package/templates/ssr/tsconfig.server.json +0 -15
- package/templates/ssr/vite.config.ts +0 -25
- package/templates/ssr/vitest.config.ts +0 -13
- package/templates/startkit/AGENTS.md +0 -77
- package/templates/startkit/README.md +0 -192
- package/templates/startkit/gitignore.template +0 -16
- package/templates/startkit/index.html +0 -13
- package/templates/startkit/package.json +0 -35
- package/templates/startkit/src/components/app-header.tsx +0 -93
- package/templates/startkit/src/components/app-sidebar.tsx +0 -95
- package/templates/startkit/src/components/data-table.tsx +0 -80
- package/templates/startkit/src/components/empty-state.tsx +0 -13
- package/templates/startkit/src/components/page-header.tsx +0 -23
- package/templates/startkit/src/components/stat-card.tsx +0 -24
- package/templates/startkit/src/features/accounts/account-filters.tsx +0 -61
- package/templates/startkit/src/features/accounts/account-table.tsx +0 -79
- package/templates/startkit/src/lib/format.ts +0 -31
- package/templates/startkit/src/lib/mock-data.ts +0 -441
- package/templates/startkit/src/lib/routes.ts +0 -116
- package/templates/startkit/src/main.tsx +0 -12
- package/templates/startkit/src/pages/_layout.tsx +0 -56
- package/templates/startkit/src/pages/auth/_layout.tsx +0 -7
- package/templates/startkit/src/pages/auth/login.tsx +0 -129
- package/templates/startkit/src/pages/home.tsx +0 -83
- package/templates/startkit/src/pages/not-found.tsx +0 -24
- package/templates/startkit/src/pages/workspace/_layout.tsx +0 -17
- package/templates/startkit/src/pages/workspace/accounts/index.tsx +0 -217
- package/templates/startkit/src/pages/workspace/dashboard.tsx +0 -118
- package/templates/startkit/src/pages/workspace/settings.tsx +0 -218
- package/templates/startkit/src/router.tsx +0 -7
- package/templates/startkit/src/routes/auth-config.ts +0 -38
- package/templates/startkit/src/routes/auth.ts +0 -8
- package/templates/startkit/src/routes/index.ts +0 -28
- package/templates/startkit/src/routes/public.ts +0 -8
- package/templates/startkit/src/routes/workspace/accounts.ts +0 -8
- package/templates/startkit/src/routes/workspace/index.ts +0 -14
- package/templates/startkit/src/styles/components.css +0 -396
- package/templates/startkit/src/styles/layout.css +0 -192
- package/templates/startkit/src/styles/reset.css +0 -38
- package/templates/startkit/src/styles/theme.css +0 -76
- package/templates/startkit/src/styles/tokens.css +0 -67
- package/templates/startkit/src/styles.css +0 -7
- package/templates/startkit/src/toast.ts +0 -55
- package/templates/startkit/src/utils/join-classes.ts +0 -4
- package/templates/startkit/src/vite-env.d.ts +0 -5
- package/templates/startkit/tests/app.test.tsx +0 -32
- package/templates/startkit/tests/preferences.test.ts +0 -43
- package/templates/startkit/tests/resources.test.ts +0 -82
- package/templates/startkit/tsconfig.json +0 -20
- package/templates/startkit/tsconfig.node.json +0 -10
- package/templates/startkit/vite.config.ts +0 -32
- package/templates/startkit/vitest.config.ts +0 -13
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { Link } from '@askrjs/askr/router';
|
|
2
|
-
import { Button } from '@askrjs/ui';
|
|
3
|
-
import {
|
|
4
|
-
ActionRow,
|
|
5
|
-
Card,
|
|
6
|
-
CardGrid,
|
|
7
|
-
SectionHeader,
|
|
8
|
-
} from '../components/site-shell';
|
|
9
|
-
|
|
10
|
-
const highlights = [
|
|
11
|
-
{
|
|
12
|
-
title: 'Fast feedback',
|
|
13
|
-
body: 'Run npm run dev and edit a page to stay in a SPA-style authoring loop.',
|
|
14
|
-
},
|
|
15
|
-
{
|
|
16
|
-
title: 'Deterministic output',
|
|
17
|
-
body: 'Keep one explicit route registry in src/routes.tsx so dev and generated output cannot drift.',
|
|
18
|
-
},
|
|
19
|
-
{
|
|
20
|
-
title: 'Hydrated preview',
|
|
21
|
-
body: 'Keep one interactive route so you can verify static output and browser behavior together.',
|
|
22
|
-
},
|
|
23
|
-
];
|
|
24
|
-
|
|
25
|
-
export default function Home() {
|
|
26
|
-
return (
|
|
27
|
-
<>
|
|
28
|
-
<SectionHeader
|
|
29
|
-
eyebrow="Static site generation"
|
|
30
|
-
title="Build a multi-page site, then ship it as plain HTML."
|
|
31
|
-
description="This sample keeps the loop small: author routes, preview in the SPA dev server, generate static files, and inspect the output."
|
|
32
|
-
actions={
|
|
33
|
-
<ActionRow>
|
|
34
|
-
<Button asChild>
|
|
35
|
-
<Link href="/workflow">See the workflow</Link>
|
|
36
|
-
</Button>
|
|
37
|
-
<Button asChild>
|
|
38
|
-
<Link href="/preview">Open the preview</Link>
|
|
39
|
-
</Button>
|
|
40
|
-
</ActionRow>
|
|
41
|
-
}
|
|
42
|
-
/>
|
|
43
|
-
|
|
44
|
-
<CardGrid>
|
|
45
|
-
{highlights.map((highlight) => (
|
|
46
|
-
<Card title={highlight.title} description={highlight.body} />
|
|
47
|
-
))}
|
|
48
|
-
</CardGrid>
|
|
49
|
-
</>
|
|
50
|
-
);
|
|
51
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { resource } from '@askrjs/askr/resources';
|
|
2
|
-
|
|
3
|
-
export function fetchUser(id: number) {
|
|
4
|
-
return resource(
|
|
5
|
-
async ({ signal }: { signal: AbortSignal }) => {
|
|
6
|
-
// Simulate API call
|
|
7
|
-
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
8
|
-
if (signal.aborted) {
|
|
9
|
-
throw new DOMException('Request aborted', 'AbortError');
|
|
10
|
-
}
|
|
11
|
-
return { id, name: `User ${id}`, email: `user${id}@example.com` };
|
|
12
|
-
},
|
|
13
|
-
[id]
|
|
14
|
-
);
|
|
15
|
-
}
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { createRouteRegistry, group, route } from '@askrjs/askr/router';
|
|
2
|
-
import AppLayout from './app';
|
|
3
|
-
import Home from './pages/home';
|
|
4
|
-
import Workflow from './pages/about';
|
|
5
|
-
import Content from './pages/content';
|
|
6
|
-
import Preview from './pages/example';
|
|
7
|
-
|
|
8
|
-
export const pageRegistry = createRouteRegistry(() => {
|
|
9
|
-
group({ layout: AppLayout }, () => {
|
|
10
|
-
route('/', Home);
|
|
11
|
-
route('/workflow', Workflow);
|
|
12
|
-
route('/content', Content);
|
|
13
|
-
route('/preview', Preview);
|
|
14
|
-
});
|
|
15
|
-
});
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
@import '@askrjs/themes/default';
|
|
2
|
-
|
|
3
|
-
* {
|
|
4
|
-
box-sizing: border-box;
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
:root {
|
|
8
|
-
color-scheme: light;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
body {
|
|
12
|
-
margin: 0;
|
|
13
|
-
min-height: 100vh;
|
|
14
|
-
color: var(--ak-color-fg);
|
|
15
|
-
font-family: var(--ak-font-family);
|
|
16
|
-
line-height: 1.5;
|
|
17
|
-
background: var(--ak-color-bg);
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
a {
|
|
21
|
-
color: inherit;
|
|
22
|
-
text-decoration: none;
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
.site-shell {
|
|
26
|
-
min-height: 100vh;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
.site-main {
|
|
30
|
-
padding-block: clamp(2rem, 4vw, 4rem);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
.brand {
|
|
34
|
-
display: grid;
|
|
35
|
-
gap: 0.15rem;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
.brand strong {
|
|
39
|
-
font-size: 1.05rem;
|
|
40
|
-
letter-spacing: 0.02em;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
.brand span {
|
|
44
|
-
color: var(--ak-color-text-muted);
|
|
45
|
-
font-size: var(--ak-font-size-sm);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
.action-row {
|
|
49
|
-
display: flex;
|
|
50
|
-
flex-wrap: wrap;
|
|
51
|
-
gap: var(--ak-space-sm);
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
.card-grid {
|
|
55
|
-
display: grid;
|
|
56
|
-
gap: var(--ak-space-lg);
|
|
57
|
-
grid-template-columns: repeat(auto-fit, minmax(min(100%, 16rem), 1fr));
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
.text-muted {
|
|
61
|
-
color: var(--ak-color-text-muted);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
code {
|
|
65
|
-
padding: 0.15em 0.4em;
|
|
66
|
-
border-radius: 0.4rem;
|
|
67
|
-
background: var(--ak-color-surface-muted);
|
|
68
|
-
font-size: 0.9em;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
.counter-value {
|
|
72
|
-
font-size: clamp(2rem, 4vw, 3.25rem);
|
|
73
|
-
font-weight: var(--ak-font-weight-bold);
|
|
74
|
-
letter-spacing: -0.05em;
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
.counter-controls,
|
|
78
|
-
.preview-controls,
|
|
79
|
-
.resource-status {
|
|
80
|
-
display: flex;
|
|
81
|
-
flex-wrap: wrap;
|
|
82
|
-
gap: var(--ak-space-sm);
|
|
83
|
-
align-items: center;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
.resource-panel {
|
|
87
|
-
display: grid;
|
|
88
|
-
gap: var(--ak-space-sm);
|
|
89
|
-
}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from 'node:fs';
|
|
2
|
-
import { resolve } from 'node:path';
|
|
3
|
-
import type { DocumentRenderArgs } from '@askrjs/askr/ssg';
|
|
4
|
-
import { pageRegistry } from './src/routes';
|
|
5
|
-
|
|
6
|
-
export const outputDir = './dist';
|
|
7
|
-
|
|
8
|
-
let clientTemplate: string | undefined;
|
|
9
|
-
|
|
10
|
-
function renderDocument({ appHtml }: DocumentRenderArgs) {
|
|
11
|
-
clientTemplate ??= readFileSync(
|
|
12
|
-
resolve(process.cwd(), '.askr/client/index.html'),
|
|
13
|
-
'utf8'
|
|
14
|
-
);
|
|
15
|
-
|
|
16
|
-
const appRoot = /<div([^>]*\bid=["']app["'][^>]*)>\s*<\/div>/i;
|
|
17
|
-
if (!appRoot.test(clientTemplate)) {
|
|
18
|
-
throw new Error('Built client template must contain an empty #app root.');
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
return clientTemplate.replace(appRoot, `<div$1>${appHtml}</div>`);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export const staticConfig = {
|
|
25
|
-
registry: pageRegistry,
|
|
26
|
-
outputDir,
|
|
27
|
-
document: renderDocument,
|
|
28
|
-
assets: [
|
|
29
|
-
{
|
|
30
|
-
from: resolve(process.cwd(), '.askr/client/assets'),
|
|
31
|
-
to: 'assets',
|
|
32
|
-
},
|
|
33
|
-
],
|
|
34
|
-
};
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vite-plus/test';
|
|
2
|
-
import { navItems } from '../src/app';
|
|
3
|
-
|
|
4
|
-
describe('App shell', () => {
|
|
5
|
-
it('exposes the workflow-focused navigation order', () => {
|
|
6
|
-
expect(navItems.map((item) => item.label)).toEqual([
|
|
7
|
-
'Home',
|
|
8
|
-
'Workflow',
|
|
9
|
-
'Content',
|
|
10
|
-
'Preview',
|
|
11
|
-
]);
|
|
12
|
-
expect(navItems.map((item) => item.href)).toEqual([
|
|
13
|
-
'/',
|
|
14
|
-
'/workflow',
|
|
15
|
-
'/content',
|
|
16
|
-
'/preview',
|
|
17
|
-
]);
|
|
18
|
-
});
|
|
19
|
-
});
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vite-plus/test';
|
|
2
|
-
import { renderToString } from '@askrjs/askr/ssr';
|
|
3
|
-
import Counter from '../../src/components/counter';
|
|
4
|
-
|
|
5
|
-
describe('Counter', () => {
|
|
6
|
-
it('renders the initial hydration check view', () => {
|
|
7
|
-
const html = renderToString(() => <Counter />);
|
|
8
|
-
|
|
9
|
-
expect(html).toContain('Hydration check');
|
|
10
|
-
expect(html).toContain(
|
|
11
|
-
'This counter should still feel live after static generation.'
|
|
12
|
-
);
|
|
13
|
-
expect(html).toContain('0');
|
|
14
|
-
expect(html).toContain('even');
|
|
15
|
-
expect(html).toContain('- Decrement');
|
|
16
|
-
expect(html).toContain('+ Increment');
|
|
17
|
-
});
|
|
18
|
-
});
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vite-plus/test';
|
|
2
|
-
import { fetchUser } from '../src/resources/user';
|
|
3
|
-
|
|
4
|
-
describe('Resources', () => {
|
|
5
|
-
it('creates a resource for fetching user data', () => {
|
|
6
|
-
// Resources are called during component render
|
|
7
|
-
// Here we just verify the function is defined
|
|
8
|
-
expect(fetchUser).toBeDefined();
|
|
9
|
-
expect(typeof fetchUser).toBe('function');
|
|
10
|
-
});
|
|
11
|
-
});
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vite-plus/test';
|
|
2
|
-
import { staticConfig } from '../ssg.config';
|
|
3
|
-
|
|
4
|
-
describe('SSG config', () => {
|
|
5
|
-
it('keeps the sample route tree explicit', () => {
|
|
6
|
-
expect(
|
|
7
|
-
staticConfig.registry.manifest.records.map((route) => route.path).sort()
|
|
8
|
-
).toEqual(['/', '/content', '/preview', '/workflow'].sort());
|
|
9
|
-
expect(staticConfig.registry.routes).toHaveLength(4);
|
|
10
|
-
});
|
|
11
|
-
});
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"compilerOptions": {
|
|
3
|
-
"target": "ES2020",
|
|
4
|
-
"useDefineForClassFields": true,
|
|
5
|
-
"lib": ["ES2020", "DOM", "DOM.Iterable"],
|
|
6
|
-
"module": "ESNext",
|
|
7
|
-
"moduleResolution": "bundler",
|
|
8
|
-
"skipLibCheck": true,
|
|
9
|
-
"esModuleInterop": true,
|
|
10
|
-
"allowSyntheticDefaultImports": true,
|
|
11
|
-
"strict": true,
|
|
12
|
-
"resolveJsonModule": true,
|
|
13
|
-
"isolatedModules": true,
|
|
14
|
-
"noEmit": true,
|
|
15
|
-
"jsx": "react-jsx",
|
|
16
|
-
"jsxImportSource": "@askrjs/askr"
|
|
17
|
-
},
|
|
18
|
-
"include": ["src"],
|
|
19
|
-
"references": [{ "path": "./tsconfig.node.json" }]
|
|
20
|
-
}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import { defineConfig } from 'vite-plus';
|
|
2
|
-
import { askr } from '@askrjs/vite';
|
|
3
|
-
|
|
4
|
-
export default defineConfig({
|
|
5
|
-
plugins: [askr()],
|
|
6
|
-
lint: {
|
|
7
|
-
ignorePatterns: ['dist/**', 'node_modules/**', 'coverage/**'],
|
|
8
|
-
},
|
|
9
|
-
fmt: {
|
|
10
|
-
semi: true,
|
|
11
|
-
singleQuote: true,
|
|
12
|
-
trailingComma: 'es5',
|
|
13
|
-
printWidth: 80,
|
|
14
|
-
tabWidth: 2,
|
|
15
|
-
},
|
|
16
|
-
server: {
|
|
17
|
-
port: 5173,
|
|
18
|
-
open: true,
|
|
19
|
-
},
|
|
20
|
-
build: {
|
|
21
|
-
outDir: 'dist',
|
|
22
|
-
sourcemap: true,
|
|
23
|
-
},
|
|
24
|
-
});
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { defineConfig } from 'vite-plus';
|
|
2
|
-
import { askr } from '@askrjs/vite';
|
|
3
|
-
|
|
4
|
-
export default defineConfig({
|
|
5
|
-
plugins: [askr()],
|
|
6
|
-
esbuild: {
|
|
7
|
-
jsx: 'automatic',
|
|
8
|
-
jsxImportSource: '@askrjs/askr',
|
|
9
|
-
},
|
|
10
|
-
test: {
|
|
11
|
-
environment: 'jsdom',
|
|
12
|
-
globals: true,
|
|
13
|
-
coverage: {
|
|
14
|
-
reporter: ['text', 'json', 'html'],
|
|
15
|
-
},
|
|
16
|
-
},
|
|
17
|
-
});
|
package/templates/ssr/AGENTS.md
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
# {{appName}}
|
|
2
|
-
|
|
3
|
-
This is a strict TypeScript, ESM-only Askr SSR application.
|
|
4
|
-
|
|
5
|
-
## Architecture
|
|
6
|
-
|
|
7
|
-
- `src/routes.tsx` owns the shared `createRouteRegistry()` result.
|
|
8
|
-
- `src/entry-server.tsx` exports a composed `ServerApp` using `@askrjs/server/askr`.
|
|
9
|
-
- `index.html` is the only document source and contains exactly one `<!--askr-head-->` marker and one `<!--askr-app-->` marker.
|
|
10
|
-
- `@askrjs/vite/server` owns development and production document composition.
|
|
11
|
-
- `server.ts` only starts the production app through `@askrjs/node`.
|
|
12
|
-
- `src/main.tsx` hydrates server HTML or starts the SPA when no fragment is present.
|
|
13
|
-
|
|
14
|
-
Do not add Express, a `render(url)` convention, inline document markup, or manual marker replacement to application code.
|
|
15
|
-
|
|
16
|
-
## Commands
|
|
17
|
-
|
|
18
|
-
```bash
|
|
19
|
-
npm run dev
|
|
20
|
-
npm run build
|
|
21
|
-
npm run preview
|
|
22
|
-
npm test
|
|
23
|
-
npm run typecheck
|
|
24
|
-
npm run lint
|
|
25
|
-
npm run fmt
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
Use askr-ui primitives for interactive controls, `--ak-*` theme tokens for styling, and preserve the shared server/browser route registry.
|
package/templates/ssr/README.md
DELETED
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
# {{appName}}
|
|
2
|
-
|
|
3
|
-
An Askr application with server rendering, browser hydration, and a Node production adapter.
|
|
4
|
-
|
|
5
|
-
## Commands
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
npm install
|
|
9
|
-
npm run dev
|
|
10
|
-
npm run build
|
|
11
|
-
npm run preview
|
|
12
|
-
npm test
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
## Rendering model
|
|
16
|
-
|
|
17
|
-
`src/routes.tsx` exports one route registry shared by the browser and server. The server entry composes `createServerApp()` with `createAskrPageHandler()`, which returns an Askr HTML fragment plus normalized document metadata. The Vite server integration preserves static head content, injects Askr-owned metadata at the single `<!--askr-head-->` marker, and inserts the fragment at the single `<!--askr-app-->` marker.
|
|
18
|
-
|
|
19
|
-
In development, Vite reloads the server entry and document for each HTML request. The production build emits a document-composing server app; `server.ts` only adapts that Web `ServerApp` to Node transport.
|
|
20
|
-
|
|
21
|
-
API responses and other non-fragment responses pass through without document composition.
|
|
22
|
-
|
|
23
|
-
## Structure
|
|
24
|
-
|
|
25
|
-
```text
|
|
26
|
-
index.html document source and sole askr-head and askr-app markers
|
|
27
|
-
server.ts production Node launcher
|
|
28
|
-
src/
|
|
29
|
-
main.tsx browser hydration
|
|
30
|
-
entry-server.tsx composed ServerApp
|
|
31
|
-
routes.tsx shared route registry
|
|
32
|
-
app.tsx root layout
|
|
33
|
-
pages/ route components
|
|
34
|
-
components/ reusable components
|
|
35
|
-
resources/ data resources
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
The application source does not construct document markup or expose a `render(url)` callback. Document ownership stays in `index.html` and `@askrjs/vite/server`.
|
package/templates/ssr/index.html
DELETED
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
<!doctype html>
|
|
2
|
-
<html lang="en">
|
|
3
|
-
<head>
|
|
4
|
-
<meta charset="UTF-8" />
|
|
5
|
-
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
-
<title>{{appName}}</title>
|
|
7
|
-
<!--askr-head-->
|
|
8
|
-
</head>
|
|
9
|
-
<body>
|
|
10
|
-
<div id="app"><!--askr-app--></div>
|
|
11
|
-
<script type="module" src="/src/main.tsx"></script>
|
|
12
|
-
</body>
|
|
13
|
-
</html>
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "{{appName}}",
|
|
3
|
-
"version": "0.1.0",
|
|
4
|
-
"type": "module",
|
|
5
|
-
"scripts": {
|
|
6
|
-
"dev": "vp dev",
|
|
7
|
-
"build": "vp build && vp build --ssr server.ts --outDir dist/server",
|
|
8
|
-
"preview": "node dist/server/server.js",
|
|
9
|
-
"test": "vp test run",
|
|
10
|
-
"typecheck": "tsc --noEmit",
|
|
11
|
-
"lint": "vp lint src server.ts tests vite.config.ts",
|
|
12
|
-
"lint:fix": "npm run lint -- --fix",
|
|
13
|
-
"fmt": "vp fmt \"src/**/*.{ts,tsx,css}\" \"server.ts\" \"tests/**/*.{ts,tsx}\" \"*.md\"",
|
|
14
|
-
"check": "npm run lint && npm run typecheck && npm test && npm run build"
|
|
15
|
-
},
|
|
16
|
-
"dependencies": {
|
|
17
|
-
"@askrjs/askr": ">=0.0.53 <0.1.0",
|
|
18
|
-
"@askrjs/node": ">=0.0.1 <0.1.0",
|
|
19
|
-
"@askrjs/server": ">=0.0.1 <0.1.0",
|
|
20
|
-
"@askrjs/themes": ">=0.0.12 <0.1.0",
|
|
21
|
-
"@askrjs/ui": ">=0.0.13 <0.1.0"
|
|
22
|
-
},
|
|
23
|
-
"devDependencies": {
|
|
24
|
-
"@askrjs/vite": ">=0.0.6 <0.1.0",
|
|
25
|
-
"@types/node": "^26.0.0",
|
|
26
|
-
"jsdom": "^29.1.1",
|
|
27
|
-
"tsx": "^4.23.1",
|
|
28
|
-
"typescript": "^6.0.3",
|
|
29
|
-
"vite-plus": "^0.2.4"
|
|
30
|
-
},
|
|
31
|
-
"engines": {
|
|
32
|
-
"node": "^20.19.0 || >=22.12.0"
|
|
33
|
-
}
|
|
34
|
-
}
|
package/templates/ssr/server.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { serve } from '@askrjs/node';
|
|
2
|
-
import app from 'virtual:askr-server';
|
|
3
|
-
|
|
4
|
-
const port = Number(process.env.PORT ?? 3000);
|
|
5
|
-
const running = await serve(app, {
|
|
6
|
-
host: process.env.HOST ?? '127.0.0.1',
|
|
7
|
-
port,
|
|
8
|
-
assets: { root: new URL('./dist', import.meta.url).pathname },
|
|
9
|
-
});
|
|
10
|
-
console.log(`Server started at ${running.url}`);
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import './styles.css';
|
|
2
|
-
import { Link } from '@askrjs/askr/router';
|
|
3
|
-
|
|
4
|
-
export default function App({ children }: { children?: unknown }) {
|
|
5
|
-
return (
|
|
6
|
-
<div>
|
|
7
|
-
<header>
|
|
8
|
-
<nav>
|
|
9
|
-
<Link href="/">
|
|
10
|
-
<strong>{'{{appName}}'}</strong>
|
|
11
|
-
</Link>
|
|
12
|
-
<div class="nav-links">
|
|
13
|
-
<Link href="/example">Example</Link>
|
|
14
|
-
<Link href="/about">About</Link>
|
|
15
|
-
</div>
|
|
16
|
-
</nav>
|
|
17
|
-
</header>
|
|
18
|
-
<main>{children}</main>
|
|
19
|
-
</div>
|
|
20
|
-
);
|
|
21
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { state, derive } from '@askrjs/askr';
|
|
2
|
-
import { Button } from '@askrjs/ui/button';
|
|
3
|
-
|
|
4
|
-
export default function Counter() {
|
|
5
|
-
const [count, setCount] = state(0);
|
|
6
|
-
const parity = derive(() => (count() % 2 === 0 ? 'even' : 'odd'));
|
|
7
|
-
|
|
8
|
-
return (
|
|
9
|
-
<div class="counter">
|
|
10
|
-
<h2>Interactive Counter</h2>
|
|
11
|
-
<p class="text-muted">
|
|
12
|
-
Built with <code>state()</code> and <code>derive()</code>
|
|
13
|
-
</p>
|
|
14
|
-
<div class="counter-value">{count()}</div>
|
|
15
|
-
<div>
|
|
16
|
-
<span class="badge">{parity()}</span>
|
|
17
|
-
</div>
|
|
18
|
-
<div class="counter-controls">
|
|
19
|
-
<Button onPress={() => setCount((c) => Math.max(0, c - 1))}>
|
|
20
|
-
- Decrement
|
|
21
|
-
</Button>
|
|
22
|
-
<Button onPress={() => setCount((c) => c + 1)}>+ Increment</Button>
|
|
23
|
-
</div>
|
|
24
|
-
</div>
|
|
25
|
-
);
|
|
26
|
-
}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { createAskrApp } from '@askrjs/server/askr';
|
|
2
|
-
import { pageRegistry } from './routes';
|
|
3
|
-
|
|
4
|
-
const app = createAskrApp({
|
|
5
|
-
name: '{{appName}}',
|
|
6
|
-
version: '0.1.0',
|
|
7
|
-
dependencies: undefined,
|
|
8
|
-
pages: pageRegistry,
|
|
9
|
-
});
|
|
10
|
-
|
|
11
|
-
export { app };
|
|
12
|
-
export default app;
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { createSPA, hydrateSPA } from '@askrjs/askr/boot';
|
|
2
|
-
import { pageRegistry } from './routes';
|
|
3
|
-
|
|
4
|
-
const root = document.getElementById('app');
|
|
5
|
-
if (!root) throw new Error('Missing #app root element.');
|
|
6
|
-
|
|
7
|
-
if (root.hasChildNodes()) {
|
|
8
|
-
await hydrateSPA({ root, registry: pageRegistry });
|
|
9
|
-
} else {
|
|
10
|
-
await createSPA({ root, registry: pageRegistry });
|
|
11
|
-
}
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
export default function About() {
|
|
2
|
-
return (
|
|
3
|
-
<>
|
|
4
|
-
<h1>About Askr</h1>
|
|
5
|
-
<p class="text-muted">
|
|
6
|
-
A modern reactive framework for building fast, maintainable web
|
|
7
|
-
applications.
|
|
8
|
-
</p>
|
|
9
|
-
|
|
10
|
-
<section class="section">
|
|
11
|
-
<h2>Why Askr Exists</h2>
|
|
12
|
-
<p>
|
|
13
|
-
Modern web development has become unnecessarily complex. Frameworks
|
|
14
|
-
have grown bloated with abstractions, requiring developers to learn
|
|
15
|
-
extensive APIs and fight against the framework rather than work with
|
|
16
|
-
it.
|
|
17
|
-
</p>
|
|
18
|
-
<p>
|
|
19
|
-
Askr was created to bring simplicity back to web development. It
|
|
20
|
-
provides just enough structure to build sophisticated applications
|
|
21
|
-
while staying out of your way.
|
|
22
|
-
</p>
|
|
23
|
-
</section>
|
|
24
|
-
|
|
25
|
-
<section class="section">
|
|
26
|
-
<h2>Core Primitives</h2>
|
|
27
|
-
<div class="features">
|
|
28
|
-
<div class="feature-card">
|
|
29
|
-
<h3>Fine-grained Reactivity</h3>
|
|
30
|
-
<p>
|
|
31
|
-
<code>state()</code> for reactive values with automatic dependency
|
|
32
|
-
tracking. Updates are surgical — only the specific DOM nodes that
|
|
33
|
-
need to change are updated.
|
|
34
|
-
</p>
|
|
35
|
-
</div>
|
|
36
|
-
<div class="feature-card">
|
|
37
|
-
<h3>Simple Async Data</h3>
|
|
38
|
-
<p>
|
|
39
|
-
<code>resource()</code> handles async data fetching with built-in
|
|
40
|
-
loading states, error handling, and automatic refetching when
|
|
41
|
-
dependencies change.
|
|
42
|
-
</p>
|
|
43
|
-
</div>
|
|
44
|
-
<div class="feature-card">
|
|
45
|
-
<h3>Declarative Routing</h3>
|
|
46
|
-
<p>
|
|
47
|
-
Routes are declared at module-load time with{' '}
|
|
48
|
-
<code>createRouteRegistry()</code>, <code>group()</code>, and{' '}
|
|
49
|
-
<code>route()</code>. Clean, type-safe, and no configuration
|
|
50
|
-
needed.
|
|
51
|
-
</p>
|
|
52
|
-
</div>
|
|
53
|
-
</div>
|
|
54
|
-
</section>
|
|
55
|
-
|
|
56
|
-
<section class="section">
|
|
57
|
-
<h2>The Ecosystem</h2>
|
|
58
|
-
<p>
|
|
59
|
-
<strong>askr</strong> — the core framework with reactive primitives,
|
|
60
|
-
routing, SSR, and SSG support. Zero runtime dependencies.
|
|
61
|
-
</p>
|
|
62
|
-
<p>
|
|
63
|
-
<strong>askr-ui</strong> — headless, accessible UI components. Button,
|
|
64
|
-
Accordion, Dialog, and 30+ more. All interaction logic, no opinions on
|
|
65
|
-
style.
|
|
66
|
-
</p>
|
|
67
|
-
<p>
|
|
68
|
-
<strong>askr-themes</strong> — CSS-only themes that target askr-ui's{' '}
|
|
69
|
-
<code>data-slot</code> attributes. Swap themes with a single import
|
|
70
|
-
change.
|
|
71
|
-
</p>
|
|
72
|
-
</section>
|
|
73
|
-
</>
|
|
74
|
-
);
|
|
75
|
-
}
|