@somewhere-tech/cli 0.34.4 → 0.35.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-feature-template.js","sourceRoot":"","sources":["../../src/lib/init-feature-template.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,120 @@
1
+ // The module menu for `somewhere init --features`. A const table, not a
2
+ // plugin system: each module names what it requires, and the resolver adds
3
+ // those requirements and reports them. Files come from init-feature-template.ts.
4
+ export const INIT_MODULE_IDS = ['auth', 'private-data'];
5
+ export const INIT_UI_MODES = ['styled', 'headless'];
6
+ const MODULES = [
7
+ {
8
+ id: 'auth',
9
+ summary: 'Email/password sign-up, sign-in and sign-out through the SDK cookie session: the packaged /api/auth route, auth hooks over the SDK provider, a sign-in page, and a per-user private boundary behind a loading state. This is what plain `somewhere init` writes.',
10
+ requires: [],
11
+ },
12
+ {
13
+ id: 'private-data',
14
+ summary: 'A notes table each signed-in user owns (db/schema.ts owner()), read and written from the browser through the generated somewhere:data client, with form validation, error mapping, no-change results, and a per-user reset on sign-out or account switch.',
15
+ requires: ['auth'],
16
+ },
17
+ ];
18
+ const UI_MODES = [
19
+ { id: 'styled', summary: 'Styled views in src/ui plus src/styles/tokens.css and app.css. Replace them without touching auth or data behaviour.' },
20
+ { id: 'headless', summary: 'The same pages, hooks and view props; src/ui holds plain semantic views and there is no CSS, for an app that brings its own UI.' },
21
+ ];
22
+ // Listed so an agent reading the catalog does not invent them from scratch.
23
+ const NOT_OFFERED = [
24
+ { id: 'private-files', reason: 'Not offered by init yet; see `somewhere docs declared-files`.' },
25
+ { id: 'password-reset', reason: 'Not generated. Build it on the documented auth contract (`somewhere docs sw.auth`).' },
26
+ { id: 'oauth', reason: 'Not generated. See `somewhere docs auth-client`.' },
27
+ { id: 'mfa', reason: 'Not generated.' },
28
+ { id: 'payments', reason: 'Not generated. See `somewhere docs payments`.' },
29
+ { id: 'teams', reason: 'Not generated. See member() scopes in `somewhere docs declared-data`.' },
30
+ { id: 'public-sharing', reason: 'Not generated. See publicRead in `somewhere docs declared-data`.' },
31
+ ];
32
+ /** A usage error: the command exits 2 before any login, request or write. */
33
+ export class InitSelectionError extends Error {
34
+ }
35
+ function isModuleId(value) {
36
+ return INIT_MODULE_IDS.includes(value);
37
+ }
38
+ function isUiMode(value) {
39
+ return INIT_UI_MODES.includes(value);
40
+ }
41
+ export function resolveInitSelection(features, ui = 'styled') {
42
+ const ids = features.split(',').map((value) => value.trim()).filter(Boolean);
43
+ if (ids.length === 0) {
44
+ throw new InitSelectionError(`--features needs at least one module: ${INIT_MODULE_IDS.join(', ')}.`);
45
+ }
46
+ const unknown = ids.filter((id) => !isModuleId(id));
47
+ if (unknown.length) {
48
+ const offered = NOT_OFFERED.filter((entry) => unknown.includes(entry.id));
49
+ const detail = offered.map((entry) => ` ${entry.id}: ${entry.reason}`).join('');
50
+ throw new InitSelectionError(`Unknown --features ${unknown.join(', ')}. Available: ${INIT_MODULE_IDS.join(', ')}.${detail}`);
51
+ }
52
+ if (!isUiMode(ui)) {
53
+ throw new InitSelectionError(`Unknown --ui ${ui}. Use one of: ${INIT_UI_MODES.join(', ')}.`);
54
+ }
55
+ const wanted = new Set(ids);
56
+ const selected = new Set();
57
+ const visit = (id) => {
58
+ if (selected.has(id))
59
+ return;
60
+ selected.add(id);
61
+ for (const dependency of moduleDefinition(id).requires)
62
+ visit(dependency);
63
+ };
64
+ for (const id of wanted)
65
+ visit(id);
66
+ const inOrder = (set) => INIT_MODULE_IDS.filter((id) => set.has(id));
67
+ return {
68
+ requested: inOrder(wanted),
69
+ added: INIT_MODULE_IDS.filter((id) => selected.has(id) && !wanted.has(id)),
70
+ modules: inOrder(selected),
71
+ ui,
72
+ };
73
+ }
74
+ function moduleDefinition(id) {
75
+ return MODULES.find((entry) => entry.id === id);
76
+ }
77
+ /**
78
+ * The machine-readable menu. `generate` writes a selection's files; each
79
+ * module's `files` are the paths it adds over its requirements (styled), and
80
+ * each UI mode's `files` are the paths whose content that mode decides.
81
+ */
82
+ export function initCatalog(generate) {
83
+ const filesFor = (selection) => generate(selection).map((file) => file.path);
84
+ const selection = (modules, ui = 'styled') => ({ requested: modules, added: [], modules, ui });
85
+ const difference = (all, base) => all.filter((path) => !base.includes(path)).sort();
86
+ const everything = [...INIT_MODULE_IDS];
87
+ return {
88
+ version: 1,
89
+ command: 'somewhere init --name <slug> --features <ids> [--ui styled|headless] [--dry-run] [--json]',
90
+ modules: MODULES.map((entry) => ({
91
+ id: entry.id,
92
+ summary: entry.summary,
93
+ requires: [...entry.requires],
94
+ files: difference(filesFor(selection([...entry.requires, entry.id])), entry.requires.length ? filesFor(selection([...entry.requires])) : []),
95
+ })),
96
+ ui: UI_MODES.map((mode) => {
97
+ const other = new Map(generate(selection(everything, mode.id === 'styled' ? 'headless' : 'styled'))
98
+ .map((file) => [file.path, file.content]));
99
+ return {
100
+ id: mode.id,
101
+ summary: mode.summary,
102
+ files: generate(selection(everything, mode.id))
103
+ .filter((file) => other.get(file.path) !== file.content && !file.path.endsWith('.md') && file.path !== 'src/main.tsx')
104
+ .map((file) => file.path)
105
+ .sort(),
106
+ };
107
+ }),
108
+ defaults: { ui: 'styled' },
109
+ not_offered: NOT_OFFERED.map((entry) => ({ ...entry })),
110
+ };
111
+ }
112
+ /** One line for humans: "auth, private-data (auth added: required by private-data) · ui styled". */
113
+ export function describeSelection(selection) {
114
+ const added = selection.added.map((id) => {
115
+ const by = selection.requested.filter((requested) => moduleDefinition(requested).requires.includes(id));
116
+ return `${id} added: required by ${by.join(', ')}`;
117
+ });
118
+ return `${selection.modules.join(', ')}${added.length ? ` (${added.join('; ')})` : ''} · ui ${selection.ui}`;
119
+ }
120
+ //# sourceMappingURL=init-features.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init-features.js","sourceRoot":"","sources":["../../src/lib/init-features.ts"],"names":[],"mappings":"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"}
@@ -22,6 +22,18 @@ export function canWriteInitScaffold(dir) {
22
22
  * overwrite checks. No partial scaffold is written on a preflight failure.
23
23
  */
24
24
  export function writeInitScaffold(dir, files) {
25
+ const targets = preflightInitScaffold(dir, files);
26
+ for (const [target, file] of targets) {
27
+ mkdirSync(dirname(target), { recursive: true });
28
+ writeFileSync(target, file.content, { encoding: 'utf8', flag: 'wx' });
29
+ }
30
+ return { created: [...targets.values()].map(({ path }) => path) };
31
+ }
32
+ /**
33
+ * The confinement and overwrite checks alone, with nothing written, so a
34
+ * caller can refuse a plan before any remote mutation.
35
+ */
36
+ export function preflightInitScaffold(dir, files) {
25
37
  const root = resolve(dir);
26
38
  const targets = new Map();
27
39
  for (const file of files) {
@@ -43,11 +55,7 @@ export function writeInitScaffold(dir, files) {
43
55
  }
44
56
  targets.set(target, { path: normalizedPath, content: file.content });
45
57
  }
46
- for (const [target, file] of targets) {
47
- mkdirSync(dirname(target), { recursive: true });
48
- writeFileSync(target, file.content, { encoding: 'utf8', flag: 'wx' });
49
- }
50
- return { created: [...targets.values()].map(({ path }) => path) };
58
+ return targets;
51
59
  }
52
60
  /**
53
61
  * `init --bare` keeps the agent workflow guide without the starter: each
@@ -1 +1 @@
1
- {"version":3,"file":"init-scaffold.js","sourceRoot":"","sources":["../../src/lib/init-scaffold.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"init-scaffold.js","sourceRoot":"","sources":["../../src/lib/init-scaffold.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EACV,SAAS,EACT,SAAS,EACT,WAAW,EACX,aAAa,GACd,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWvD,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;IAC5B,WAAW;IACX,MAAM;IACN,WAAW;IACX,iBAAiB;CAClB,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,GAAW;IAC9C,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAClC,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AACnE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAW,EACX,KAAkC;IAElC,MAAM,OAAO,GAAG,qBAAqB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAClD,KAAK,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;QACrC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACxE,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;AACpE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,GAAW,EACX,KAAkC;IAElC,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1B,MAAM,OAAO,GAAG,IAAI,GAAG,EAA4B,CAAC;IAEpD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QACzE,IAAI,CAAC,cAAc,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,+BAA+B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QAC7C,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACnC,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,gDAAgD,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,iCAAiC,cAAc,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC;YACpE,MAAM,IAAI,KAAK,CAAC,kCAAkC,IAAI,KAAK,cAAc,EAAE,CAAC,CAAC;QAC/E,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,GAAW,EACX,KAAkC;IAElC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,KAAK,CAAC,mCAAmC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;QACD,IAAI,CAAC;YACH,aAAa,CAAC,OAAO,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACvF,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAK,GAA6B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,GAAG,CAAC;YAChE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC"}
@@ -9,7 +9,7 @@ const PACKAGE_JSON = `{
9
9
  "typecheck": "tsc --noEmit"
10
10
  },
11
11
  "dependencies": {
12
- "@somewhere-tech/sdk": "^0.10.0",
12
+ "@somewhere-tech/sdk": "^0.11.1",
13
13
  "react": "^19.2.0",
14
14
  "react-dom": "^19.2.0",
15
15
  "react-router-dom": "^7.9.5"
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@somewhere-tech/cli",
3
- "version": "0.34.4",
3
+ "version": "0.35.1",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@somewhere-tech/cli",
9
- "version": "0.34.4",
9
+ "version": "0.35.1",
10
10
  "bundleDependencies": [
11
11
  "@modelcontextprotocol/sdk",
12
12
  "chokidar",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@somewhere-tech/cli",
3
- "version": "0.34.4",
3
+ "version": "0.35.1",
4
4
  "description": "CLI for somewhere.tech — auth, projects, deploy, pull, promote, db, logs, env, MCP bridge.",
5
5
  "keywords": [
6
6
  "somewhere",
@@ -1,235 +0,0 @@
1
- import { INIT_AGENTS_MD, INIT_CLAUDE_MD } from './init-agent-guide.js';
2
- // The default `somewhere init` starter: cookie sign-in through the SDK client
3
- // and the SDK's packaged /api/auth handler, plus one protected endpoint.
4
- // `--template minimal` keeps the no-auth starter (init-green-template.ts).
5
- const PACKAGE_JSON = `{
6
- "name": "somewhere-starter",
7
- "private": true,
8
- "version": "0.1.0",
9
- "type": "module",
10
- "scripts": {
11
- "dev": "somewhere dev",
12
- "typecheck": "somewhere typecheck"
13
- },
14
- "dependencies": {
15
- "@somewhere-tech/sdk": "0.10.0",
16
- "react": "19.2.7",
17
- "react-dom": "19.2.7"
18
- },
19
- "devDependencies": {
20
- "@types/react": "19.2.2",
21
- "@types/react-dom": "19.2.2",
22
- "typescript": "5.9.3",
23
- "vite": "7.2.2"
24
- }
25
- }
26
- `;
27
- const TSCONFIG = `{
28
- "compilerOptions": {
29
- "target": "ES2022",
30
- "lib": ["ES2022", "DOM", "DOM.Iterable"],
31
- "strict": true,
32
- "noEmit": true,
33
- "skipLibCheck": true,
34
- "module": "ESNext",
35
- "moduleResolution": "Bundler",
36
- "isolatedModules": true,
37
- "jsx": "react-jsx"
38
- },
39
- "include": ["src", "api", "db", "types"]
40
- }
41
- `;
42
- const APP_TYPES = `export interface GreetingResponse {
43
- message: string;
44
- }
45
- `;
46
- const SCHEMA = `import { id, schema, serverOnly, table, text } from 'somewhere/db';
47
-
48
- export default schema({
49
- greetings: table({
50
- id: id(),
51
- message: text({ default: 'You are signed in.' }),
52
- }, {
53
- scope: serverOnly(),
54
- }),
55
- });
56
- `;
57
- const AUTH_API = `export { somewhereAuth as default } from '@somewhere-tech/sdk/server';
58
- `;
59
- const GREETING_API = `export default sw.endpoint({
60
- auth: 'required',
61
- rateLimit: '30/minute',
62
- handler: async ({ user }, sw) => {
63
- const result = await sw.db.from('greetings', { limit: 1 });
64
- const message = result.data[0]?.message;
65
- return { message: \`\${typeof message === 'string' ? message : 'You are signed in.'} (\${user.email ?? user.id})\` };
66
- },
67
- });
68
- `;
69
- const AUTH_SERVICE = `import { createSomewhereAuth, type User } from '@somewhere-tech/sdk/auth';
70
-
71
- // Talks to api/auth/[...path].ts. The session is an httpOnly cookie; this
72
- // code never sees a token.
73
- export const auth = createSomewhereAuth();
74
- export type { User };
75
- `;
76
- const GREETING_SERVICE = `import type { GreetingResponse } from '../../types/app';
77
-
78
- export async function loadGreeting(): Promise<GreetingResponse> {
79
- const response = await fetch('/api/greeting', { credentials: 'include' });
80
- const body = (await response.json().catch(() => ({}))) as Partial<GreetingResponse> & { message?: string };
81
- if (!response.ok) throw new Error(body.message ?? \`Request failed (\${response.status})\`);
82
- return { message: body.message ?? '' };
83
- }
84
- `;
85
- const APP = `import { useEffect, useState, type FormEvent } from 'react';
86
- import { auth, type User } from './services/auth';
87
- import { loadGreeting } from './services/greeting';
88
-
89
- export function App() {
90
- const [user, setUser] = useState<User | null>(auth.getCachedUser());
91
- const [checking, setChecking] = useState(true);
92
- const [mode, setMode] = useState<'signIn' | 'signUp'>('signIn');
93
- const [email, setEmail] = useState('');
94
- const [password, setPassword] = useState('');
95
- const [error, setError] = useState('');
96
- const [message, setMessage] = useState('');
97
-
98
- // This page is the app's single entry and sign-in gate; build on it. Every
99
- // extensionless path serves index.html, so add pages by routing on
100
- // location.pathname here. getUser() reads /api/auth/me ({ user: null } when
101
- // signed out, never a 401), and the Loading… state keeps the page from
102
- // rendering blank.
103
- useEffect(() => {
104
- void auth.getUser().then(setUser).finally(() => setChecking(false));
105
- }, []);
106
-
107
- useEffect(() => {
108
- if (!user) return;
109
- void loadGreeting()
110
- .then((result) => setMessage(result.message))
111
- .catch((reason: unknown) => setMessage(reason instanceof Error ? reason.message : 'Could not load the greeting.'));
112
- }, [user]);
113
-
114
- async function submit(event: FormEvent<HTMLFormElement>) {
115
- event.preventDefault();
116
- setError('');
117
- try {
118
- const next = mode === 'signIn'
119
- ? await auth.signIn({ email, password })
120
- : await auth.signUp({ email, password });
121
- setUser(next);
122
- } catch (reason: unknown) {
123
- setError(reason instanceof Error ? reason.message : 'Sign-in failed.');
124
- }
125
- }
126
-
127
- async function signOut() {
128
- await auth.signOut();
129
- setUser(null);
130
- setMessage('');
131
- setMode('signIn');
132
- }
133
-
134
- if (checking && !user) return <main><p className="hint">Loading…</p></main>;
135
-
136
- if (user) {
137
- return (
138
- <main>
139
- <p className="eyebrow">somewhere.tech starter</p>
140
- <h1>You are signed in.</h1>
141
- <p className="message">{message || 'Loading your greeting…'}</p>
142
- <button type="button" onClick={() => void signOut()}>Sign out</button>
143
- </main>
144
- );
145
- }
146
-
147
- return (
148
- <main>
149
- <p className="eyebrow">somewhere.tech starter</p>
150
- <h1>{mode === 'signIn' ? 'Sign in' : 'Create an account'}</h1>
151
- <form onSubmit={(event) => void submit(event)}>
152
- <label>Email<input type="email" name="email" autoComplete="email" required value={email} onChange={(event) => setEmail(event.target.value)} /></label>
153
- <label>Password<input type="password" name="password" autoComplete={mode === 'signIn' ? 'current-password' : 'new-password'} required minLength={8} value={password} onChange={(event) => setPassword(event.target.value)} /></label>
154
- {error ? <p className="error" role="alert">{error}</p> : null}
155
- <button type="submit">{mode === 'signIn' ? 'Sign in' : 'Create account'}</button>
156
- </form>
157
- <button type="button" className="link" onClick={() => { setMode(mode === 'signIn' ? 'signUp' : 'signIn'); setError(''); }}>
158
- {mode === 'signIn' ? 'New here? Create an account' : 'Have an account? Sign in'}
159
- </button>
160
- </main>
161
- );
162
- }
163
- `;
164
- const MAIN = `import { StrictMode } from 'react';
165
- import { createRoot } from 'react-dom/client';
166
- import { App } from './App';
167
- import './styles.css';
168
-
169
- createRoot(document.getElementById('root')!).render(
170
- <StrictMode>
171
- <App />
172
- </StrictMode>,
173
- );
174
- `;
175
- const STYLES = `:root {
176
- font-family: Inter, ui-sans-serif, system-ui, sans-serif;
177
- color: #17201c;
178
- background: #edf4ef;
179
- }
180
-
181
- * { box-sizing: border-box; }
182
- body { margin: 0; min-width: 320px; }
183
- main { width: min(480px, calc(100% - 32px)); margin: 12vh auto; }
184
- h1 { margin: 12px 0 24px; font-size: clamp(2.2rem, 7vw, 3.6rem); line-height: 1; letter-spacing: -.04em; }
185
- .eyebrow { color: #14734c; font-weight: 750; text-transform: uppercase; letter-spacing: .12em; }
186
- form { display: grid; gap: 14px; }
187
- label { display: grid; gap: 6px; font-weight: 600; }
188
- input { padding: 12px 14px; border: 1px solid #c6d8ce; border-radius: 10px; font: inherit; }
189
- button { padding: 12px 16px; border: 0; border-radius: 10px; background: #14734c; color: #fff; font: inherit; font-weight: 650; cursor: pointer; }
190
- button.link { margin-top: 12px; padding: 0; background: none; color: #0e6542; }
191
- .message { padding: 20px 22px; border: 1px solid #c6d8ce; border-radius: 16px; background: rgba(255, 255, 255, .82); }
192
- .error { margin: 0; color: #a3261b; }
193
- .hint { color: #4f665b; }
194
- `;
195
- const README = `# somewhere.tech starter
196
-
197
- This project starts signed in: a React page signs users up and in with the
198
- SDK client (\`src/services/auth.ts\`), \`api/auth/[...path].ts\` is the SDK's
199
- packaged auth handler, and \`api/greeting.ts\` is a protected endpoint
200
- (\`sw.endpoint({ auth: 'required' })\`). The session is an httpOnly cookie.
201
-
202
- \`\`\`sh
203
- somewhere typecheck
204
- somewhere deploy
205
- somewhere verify
206
- \`\`\`
207
-
208
- Deploy the raw source. The platform compiles it; do not create or deploy a
209
- \`dist/\` or \`build/\` directory. For a starter without sign-in, run
210
- \`somewhere init --template minimal\` in an empty directory.
211
- `;
212
- export function createAuthTemplate() {
213
- return [
214
- { path: '.gitignore', content: 'node_modules\ndist\nbuild\n.env\n' },
215
- { path: 'AGENTS.md', content: INIT_AGENTS_MD },
216
- { path: 'CLAUDE.md', content: INIT_CLAUDE_MD },
217
- { path: 'README.md', content: README },
218
- { path: 'package.json', content: PACKAGE_JSON },
219
- { path: 'tsconfig.json', content: TSCONFIG },
220
- {
221
- path: 'index.html',
222
- content: '<!doctype html>\n<html lang="en">\n <head>\n <meta charset="UTF-8" />\n <meta name="viewport" content="width=device-width, initial-scale=1.0" />\n <title>somewhere.tech starter</title>\n </head>\n <body>\n <div id="root"></div>\n <script type="module" src="/src/main.tsx"></script>\n </body>\n</html>\n',
223
- },
224
- { path: 'src/App.tsx', content: APP },
225
- { path: 'src/main.tsx', content: MAIN },
226
- { path: 'src/services/auth.ts', content: AUTH_SERVICE },
227
- { path: 'src/services/greeting.ts', content: GREETING_SERVICE },
228
- { path: 'src/styles.css', content: STYLES },
229
- { path: 'api/auth/[...path].ts', content: AUTH_API },
230
- { path: 'api/greeting.ts', content: GREETING_API },
231
- { path: 'db/schema.ts', content: SCHEMA },
232
- { path: 'types/app.ts', content: APP_TYPES },
233
- ];
234
- }
235
- //# sourceMappingURL=init-auth-template.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init-auth-template.js","sourceRoot":"","sources":["../../src/lib/init-auth-template.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvE,8EAA8E;AAC9E,yEAAyE;AACzE,2EAA2E;AAE3E,MAAM,YAAY,GAAG;;;;;;;;;;;;;;;;;;;;;CAqBpB,CAAC;AAEF,MAAM,QAAQ,GAAG;;;;;;;;;;;;;;CAchB,CAAC;AAEF,MAAM,SAAS,GAAG;;;CAGjB,CAAC;AAEF,MAAM,MAAM,GAAG;;;;;;;;;;CAUd,CAAC;AAEF,MAAM,QAAQ,GAAG;CAChB,CAAC;AAEF,MAAM,YAAY,GAAG;;;;;;;;;CASpB,CAAC;AAEF,MAAM,YAAY,GAAG;;;;;;CAMpB,CAAC;AAEF,MAAM,gBAAgB,GAAG;;;;;;;;CAQxB,CAAC;AAEF,MAAM,GAAG,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA8EX,CAAC;AAEF,MAAM,IAAI,GAAG;;;;;;;;;;CAUZ,CAAC;AAEF,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;;;;CAmBd,CAAC;AAEF,MAAM,MAAM,GAAG;;;;;;;;;;;;;;;;CAgBd,CAAC;AAEF,MAAM,UAAU,kBAAkB;IAChC,OAAO;QACL,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,mCAAmC,EAAE;QACpE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE;QAC9C,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE;QAC9C,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE;QACtC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,YAAY,EAAE;QAC/C,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE;QAC5C;YACE,IAAI,EAAE,YAAY;YAClB,OAAO,EAAE,mUAAmU;SAC7U;QACD,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,EAAE;QACrC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE;QACvC,EAAE,IAAI,EAAE,sBAAsB,EAAE,OAAO,EAAE,YAAY,EAAE;QACvD,EAAE,IAAI,EAAE,0BAA0B,EAAE,OAAO,EAAE,gBAAgB,EAAE;QAC/D,EAAE,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,EAAE;QAC3C,EAAE,IAAI,EAAE,uBAAuB,EAAE,OAAO,EAAE,QAAQ,EAAE;QACpD,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,YAAY,EAAE;QAClD,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE;QACzC,EAAE,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE;KAC7C,CAAC;AACJ,CAAC"}