@skuio/cli 0.5.0 → 0.6.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.
- package/dist/index.js +10 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -176,9 +176,18 @@ ${green("\u2713")} Created ${bold(target)} from the ${bold(opts.template)} templ
|
|
|
176
176
|
console.log("Next:");
|
|
177
177
|
console.log(` ${dim("$")} cd ${opts.dir}`);
|
|
178
178
|
console.log(` ${dim("$")} npm install`);
|
|
179
|
-
console.log(` ${dim("$")} cp .
|
|
179
|
+
console.log(` ${dim("$")} cp .dev.vars.example .dev.vars ${dim("# manual payments + console mail need no keys")}`);
|
|
180
|
+
console.log(`
|
|
181
|
+
${bold("On Cloudflare Workers + D1")} ${dim("(default)")}`);
|
|
182
|
+
console.log(` ${dim("$")} npx wrangler d1 create ${opts.dir} ${dim("# paste the id into wrangler.jsonc")}`);
|
|
183
|
+
console.log(` ${dim("$")} npm run db:migrate:local && npm run seed`);
|
|
180
184
|
console.log(` ${dim("$")} npm run dev`);
|
|
181
185
|
console.log(` ${dim("$")} npm run owner:create:local -- --email you@example.com --name "Your Name" ${dim("# the owner who signs in at /admin")}`);
|
|
186
|
+
console.log(`
|
|
187
|
+
${bold("On any Node host")} ${dim("(SQLite file)")}`);
|
|
188
|
+
console.log(` ${dim("$")} export STORE_HOST=node DATABASE_PATH=data/store.db`);
|
|
189
|
+
console.log(` ${dim("$")} npm run seed:sqlite && npm run dev`);
|
|
190
|
+
console.log(` ${dim("$")} npm run owner:create:sqlite -- --email you@example.com --name "Your Name"`);
|
|
182
191
|
if (linkedSdk) {
|
|
183
192
|
console.log(`
|
|
184
193
|
${dim("@skuio/storefront is linked from your kit checkout (" + linkedSdk + ").")}`);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/add.ts","../src/registry.ts","../src/ui.ts","../src/create.ts","../src/index.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { loadRegistry, readText, resolveRegistrySource, type RegistryBlock } from './registry.js'\nimport { bold, dim, green, yellow } from './ui.js'\n\nexport interface AddOptions {\n names: string[]\n cwd: string\n overwrite: boolean\n}\n\n/**\n * Copy blocks into the project. Copy-and-own: once a file is in the project it\n * is the project's, and a later `add` only replaces it when asked to.\n */\nexport async function add(opts: AddOptions): Promise<void> {\n const source = resolveRegistrySource()\n const registry = await loadRegistry(source)\n const byName = new Map(registry.blocks.map((b) => [b.name, b]))\n\n // Resolve registry dependencies transitively, dependencies first.\n const wanted: RegistryBlock[] = []\n const seen = new Set<string>()\n const visit = (name: string, requestedBy?: string) => {\n if (seen.has(name)) return\n const block = byName.get(name)\n if (!block) {\n const via = requestedBy ? ` (needed by ${requestedBy})` : ''\n throw new Error(`No block named \"${name}\"${via}. Run \\`skuio list\\` to see what exists.`)\n }\n seen.add(name)\n for (const dep of block.registryDependencies ?? []) visit(dep, name)\n wanted.push(block)\n }\n opts.names.forEach((n) => visit(n))\n\n const deps = new Set<string>()\n let written = 0\n let skipped = 0\n\n for (const block of wanted) {\n console.log(`\\n${bold(block.name)} ${dim('—')} ${block.description}`)\n for (const file of block.files) {\n const target = join(opts.cwd, file.to)\n const content = await readText(source, `registry/blocks/${block.name}/${file.from}`)\n\n if (existsSync(target) && !opts.overwrite) {\n const same = readFileSync(target, 'utf8') === content\n console.log(\n ` ${yellow('skip')} ${file.to} ${dim(same ? '(identical)' : '(exists — pass --overwrite to replace)')}`\n )\n skipped++\n continue\n }\n\n mkdirSync(dirname(target), { recursive: true })\n writeFileSync(target, content)\n console.log(` ${green('write')} ${file.to}`)\n written++\n }\n block.dependencies?.forEach((d) => deps.add(d))\n }\n\n console.log(`\\n${written} file(s) written, ${skipped} skipped.`)\n if (deps.size) {\n console.log(`\\nInstall the packages these blocks import:\\n ${bold(`npm install ${[...deps].join(' ')}`)}`)\n }\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { dirname, join, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nexport interface RegistryFile {\n /** Relative to the block's directory in the registry. */\n from: string\n /** Relative to the project root. */\n to: string\n}\n\nexport interface RegistryBlock {\n name: string\n description: string\n files: RegistryFile[]\n /** npm packages the block needs. */\n dependencies?: string[]\n /** Other registry blocks the block imports. */\n registryDependencies?: string[]\n}\n\nexport interface Registry {\n version: number\n blocks: RegistryBlock[]\n}\n\nexport type RegistrySource = { kind: 'local'; root: string } | { kind: 'remote'; base: string }\n\nexport const DEFAULT_REMOTE = 'https://raw.githubusercontent.com/skuio/storefront/main'\n\n/**\n * Where blocks come from, in priority order:\n * 1. SKUIO_REGISTRY — a local path or an https base URL\n * 2. the monorepo, when the CLI is running from inside it\n * 3. the public repo on GitHub\n */\nexport function resolveRegistrySource(): RegistrySource {\n const env = process.env.SKUIO_REGISTRY\n if (env) {\n if (/^https?:\\/\\//.test(env)) return { kind: 'remote', base: env.replace(/\\/$/, '') }\n return { kind: 'local', root: resolve(env) }\n }\n\n let dir = dirname(fileURLToPath(import.meta.url))\n for (let i = 0; i < 6; i++) {\n if (existsSync(join(dir, 'registry', 'registry.json'))) return { kind: 'local', root: dir }\n dir = dirname(dir)\n }\n\n return { kind: 'remote', base: DEFAULT_REMOTE }\n}\n\nexport async function readText(source: RegistrySource, relPath: string): Promise<string> {\n if (source.kind === 'local') {\n const file = join(source.root, relPath)\n if (!existsSync(file)) throw new Error(`Not found in local registry: ${relPath}`)\n return readFileSync(file, 'utf8')\n }\n const url = `${source.base}/${relPath}`\n const res = await fetch(url)\n if (!res.ok) throw new Error(`${res.status} fetching ${url}`)\n return res.text()\n}\n\nexport async function loadRegistry(source: RegistrySource): Promise<Registry> {\n return JSON.parse(await readText(source, 'registry/registry.json')) as Registry\n}\n","const on = process.stdout.isTTY && !process.env.NO_COLOR\nconst ESC = '\\u001b'\nconst wrap = (code: number) => (s: string) => (on ? `${ESC}[${code}m${s}${ESC}[0m` : s)\nexport const bold = wrap(1)\nexport const dim = wrap(2)\nexport const green = wrap(32)\nexport const yellow = wrap(33)\nexport const red = wrap(31)\n","import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs'\nimport { tmpdir } from 'node:os'\nimport { basename, join, relative, resolve } from 'node:path'\nimport { execFileSync } from 'node:child_process'\nimport { resolveRegistrySource } from './registry.js'\nimport { bold, dim, green } from './ui.js'\n\nexport interface CreateOptions {\n dir: string\n template: string\n cwd: string\n}\n\n/**\n * The published SDK range a scaffolded store depends on. It lives in the CLI's\n * own package.json so it ships with the package, and `scripts/check-sdk-range.mjs`\n * fails the build when it drifts from the SDK's current minor — a stale range here\n * scaffolds stores that cannot resolve the dependency at all.\n */\nfunction publishedSdkRange(): string {\n const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')) as { sdkRange?: string }\n if (!pkg.sdkRange) {\n throw new Error('@skuio/cli package.json is missing \"sdkRange\"')\n }\n return pkg.sdkRange\n}\n\nconst SKIP = new Set([\n 'node_modules', 'dist', '.astro', '.wrangler', '.env', '.dev.vars', '.store-api-key', 'migrations', 'test-results', 'playwright-report',\n])\n\n/**\n * Scaffold a new store from a template.\n *\n * The result is a plain project with no link back to this repo: it depends on\n * @skuio/storefront from npm and owns every other file outright.\n */\nexport async function create(opts: CreateOptions): Promise<void> {\n const target = resolve(opts.cwd, opts.dir)\n if (existsSync(target)) throw new Error(`${target} already exists`)\n\n const source = resolveRegistrySource()\n let templateDir: string\n let cleanup = () => {}\n\n if (source.kind === 'local') {\n templateDir = join(source.root, 'templates', opts.template)\n if (!existsSync(templateDir)) throw new Error(`No template \"${opts.template}\" in ${source.root}/templates`)\n } else {\n // Pull the repo tarball and take just the template out of it.\n const tmp = mkdtempSync(join(tmpdir(), 'skuio-'))\n cleanup = () => rmSync(tmp, { recursive: true, force: true })\n const tarball = join(tmp, 'repo.tgz')\n const res = await fetch('https://codeload.github.com/skuio/storefront/tar.gz/main')\n if (!res.ok) throw new Error(`Could not download template: HTTP ${res.status}`)\n writeFileSync(tarball, Buffer.from(await res.arrayBuffer()))\n execFileSync(\n 'tar',\n ['-xzf', tarball, '-C', tmp, '--strip-components=1', `storefront-main/templates/${opts.template}`],\n { stdio: 'ignore' }\n )\n templateDir = join(tmp, 'templates', opts.template)\n if (!existsSync(templateDir)) {\n cleanup()\n throw new Error(`Template \"${opts.template}\" is not in the published repo`)\n }\n }\n\n mkdirSync(target, { recursive: true })\n cpSync(templateDir, target, { recursive: true, filter: (src) => !SKIP.has(basename(src)) })\n\n // Detach from the monorepo: real package name, real dependency range.\n const pkgPath = join(target, 'package.json')\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as Record<string, unknown>\n pkg.name = basename(target).toLowerCase().replace(/[^a-z0-9-]/g, '-')\n pkg.private = true\n delete pkg.description\n const deps = (pkg.dependencies ?? {}) as Record<string, string>\n const sdkRange = deps['@skuio/storefront']\n let linkedSdk: string | null = null\n if (sdkRange === '*' || sdkRange?.startsWith('workspace')) {\n if (source.kind === 'local') {\n // Scaffolded from a checkout of the kit: link the SDK on disk so the\n // store builds before the package is on npm. Swap for a range to publish.\n linkedSdk = `file:${relative(target, join(source.root, 'packages', 'sdk')) || '.'}`\n deps['@skuio/storefront'] = linkedSdk\n // Astro pins vite 6; without this npm may hoist a second vite next to it.\n pkg.overrides = { ...((pkg.overrides as Record<string, string>) ?? {}), vite: '^6.4.3' }\n } else {\n deps['@skuio/storefront'] = publishedSdkRange()\n }\n }\n writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\\n')\n\n cleanup()\n\n console.log(`\\n${green('✓')} Created ${bold(target)} from the ${bold(opts.template)} template.\\n`)\n console.log('Next:')\n console.log(` ${dim('$')} cd ${opts.dir}`)\n console.log(` ${dim('$')} npm install`)\n console.log(` ${dim('$')} cp .env.example .env ${dim('# add a Stripe test key')}`)\n console.log(` ${dim('$')} npm run dev`)\n console.log(` ${dim('$')} npm run owner:create:local -- --email you@example.com --name \"Your Name\" ${dim('# the owner who signs in at /admin')}`)\n if (linkedSdk) {\n console.log(`\\n${dim('@skuio/storefront is linked from your kit checkout (' + linkedSdk + ').')}`)\n console.log(dim('Run `npm run build` in the kit first, and replace the link with a version range before publishing.'))\n }\n console.log(`\\nThen open ${bold('CLAUDE.md')} — it tells your coding agent how the store is put together.\\n`)\n}\n","import { add } from './add.js'\nimport { create } from './create.js'\nimport { loadRegistry, resolveRegistrySource } from './registry.js'\nimport { bold, dim, red } from './ui.js'\n\nconst USAGE = `\n${bold('skuio')} — scaffold a SKU.io storefront and add blocks\n\n ${bold('skuio create')} <dir> [--template default] scaffold a new store\n ${bold('skuio add')} <block...> [--overwrite] copy blocks into this project\n ${bold('skuio list')} show available blocks\n\nBlocks are copied, not installed: after \\`add\\`, the files are yours to change.\nSet ${dim('SKUIO_REGISTRY')} to a path or URL to use a different registry.\n`\n\nasync function main(argv: string[]) {\n const [cmd, ...rest] = argv\n const flags = new Set(rest.filter((a) => a.startsWith('--')))\n const args = rest.filter((a, i) => !a.startsWith('--') && rest[i - 1] !== '--template')\n const flagValue = (name: string) => {\n const i = rest.indexOf(`--${name}`)\n return i > -1 ? rest[i + 1] : undefined\n }\n\n switch (cmd) {\n case 'create': {\n const dir = args[0]\n if (!dir) throw new Error('create needs a directory name')\n await create({ dir, template: flagValue('template') ?? 'default', cwd: process.cwd() })\n return\n }\n case 'add': {\n if (args.length === 0) throw new Error('add needs at least one block name')\n await add({ names: args, cwd: process.cwd(), overwrite: flags.has('--overwrite') })\n return\n }\n case 'list': {\n const registry = await loadRegistry(resolveRegistrySource())\n const width = Math.max(...registry.blocks.map((b) => b.name.length))\n for (const b of registry.blocks) console.log(` ${bold(b.name.padEnd(width))} ${dim(b.description)}`)\n return\n }\n case undefined:\n case 'help':\n case '--help':\n case '-h':\n console.log(USAGE)\n return\n default:\n throw new Error(`Unknown command \"${cmd}\"\\n${USAGE}`)\n }\n}\n\nmain(process.argv.slice(2)).catch((err: unknown) => {\n console.error(`\\n${red('error')} ${err instanceof Error ? err.message : String(err)}\\n`)\n process.exit(1)\n})\n"],"mappings":"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","names":["existsSync","readFileSync","dirname","join","join","existsSync","readFileSync","dirname","existsSync","mkdirSync","readFileSync","writeFileSync","join","resolve","readFileSync","resolve","existsSync","join","writeFileSync","mkdirSync"]}
|
|
1
|
+
{"version":3,"sources":["../src/add.ts","../src/registry.ts","../src/ui.ts","../src/create.ts","../src/index.ts"],"sourcesContent":["import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport { dirname, join } from 'node:path'\nimport { loadRegistry, readText, resolveRegistrySource, type RegistryBlock } from './registry.js'\nimport { bold, dim, green, yellow } from './ui.js'\n\nexport interface AddOptions {\n names: string[]\n cwd: string\n overwrite: boolean\n}\n\n/**\n * Copy blocks into the project. Copy-and-own: once a file is in the project it\n * is the project's, and a later `add` only replaces it when asked to.\n */\nexport async function add(opts: AddOptions): Promise<void> {\n const source = resolveRegistrySource()\n const registry = await loadRegistry(source)\n const byName = new Map(registry.blocks.map((b) => [b.name, b]))\n\n // Resolve registry dependencies transitively, dependencies first.\n const wanted: RegistryBlock[] = []\n const seen = new Set<string>()\n const visit = (name: string, requestedBy?: string) => {\n if (seen.has(name)) return\n const block = byName.get(name)\n if (!block) {\n const via = requestedBy ? ` (needed by ${requestedBy})` : ''\n throw new Error(`No block named \"${name}\"${via}. Run \\`skuio list\\` to see what exists.`)\n }\n seen.add(name)\n for (const dep of block.registryDependencies ?? []) visit(dep, name)\n wanted.push(block)\n }\n opts.names.forEach((n) => visit(n))\n\n const deps = new Set<string>()\n let written = 0\n let skipped = 0\n\n for (const block of wanted) {\n console.log(`\\n${bold(block.name)} ${dim('—')} ${block.description}`)\n for (const file of block.files) {\n const target = join(opts.cwd, file.to)\n const content = await readText(source, `registry/blocks/${block.name}/${file.from}`)\n\n if (existsSync(target) && !opts.overwrite) {\n const same = readFileSync(target, 'utf8') === content\n console.log(\n ` ${yellow('skip')} ${file.to} ${dim(same ? '(identical)' : '(exists — pass --overwrite to replace)')}`\n )\n skipped++\n continue\n }\n\n mkdirSync(dirname(target), { recursive: true })\n writeFileSync(target, content)\n console.log(` ${green('write')} ${file.to}`)\n written++\n }\n block.dependencies?.forEach((d) => deps.add(d))\n }\n\n console.log(`\\n${written} file(s) written, ${skipped} skipped.`)\n if (deps.size) {\n console.log(`\\nInstall the packages these blocks import:\\n ${bold(`npm install ${[...deps].join(' ')}`)}`)\n }\n}\n","import { existsSync, readFileSync } from 'node:fs'\nimport { dirname, join, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\n\nexport interface RegistryFile {\n /** Relative to the block's directory in the registry. */\n from: string\n /** Relative to the project root. */\n to: string\n}\n\nexport interface RegistryBlock {\n name: string\n description: string\n files: RegistryFile[]\n /** npm packages the block needs. */\n dependencies?: string[]\n /** Other registry blocks the block imports. */\n registryDependencies?: string[]\n}\n\nexport interface Registry {\n version: number\n blocks: RegistryBlock[]\n}\n\nexport type RegistrySource = { kind: 'local'; root: string } | { kind: 'remote'; base: string }\n\nexport const DEFAULT_REMOTE = 'https://raw.githubusercontent.com/skuio/storefront/main'\n\n/**\n * Where blocks come from, in priority order:\n * 1. SKUIO_REGISTRY — a local path or an https base URL\n * 2. the monorepo, when the CLI is running from inside it\n * 3. the public repo on GitHub\n */\nexport function resolveRegistrySource(): RegistrySource {\n const env = process.env.SKUIO_REGISTRY\n if (env) {\n if (/^https?:\\/\\//.test(env)) return { kind: 'remote', base: env.replace(/\\/$/, '') }\n return { kind: 'local', root: resolve(env) }\n }\n\n let dir = dirname(fileURLToPath(import.meta.url))\n for (let i = 0; i < 6; i++) {\n if (existsSync(join(dir, 'registry', 'registry.json'))) return { kind: 'local', root: dir }\n dir = dirname(dir)\n }\n\n return { kind: 'remote', base: DEFAULT_REMOTE }\n}\n\nexport async function readText(source: RegistrySource, relPath: string): Promise<string> {\n if (source.kind === 'local') {\n const file = join(source.root, relPath)\n if (!existsSync(file)) throw new Error(`Not found in local registry: ${relPath}`)\n return readFileSync(file, 'utf8')\n }\n const url = `${source.base}/${relPath}`\n const res = await fetch(url)\n if (!res.ok) throw new Error(`${res.status} fetching ${url}`)\n return res.text()\n}\n\nexport async function loadRegistry(source: RegistrySource): Promise<Registry> {\n return JSON.parse(await readText(source, 'registry/registry.json')) as Registry\n}\n","const on = process.stdout.isTTY && !process.env.NO_COLOR\nconst ESC = '\\u001b'\nconst wrap = (code: number) => (s: string) => (on ? `${ESC}[${code}m${s}${ESC}[0m` : s)\nexport const bold = wrap(1)\nexport const dim = wrap(2)\nexport const green = wrap(32)\nexport const yellow = wrap(33)\nexport const red = wrap(31)\n","import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from 'node:fs'\nimport { tmpdir } from 'node:os'\nimport { basename, join, relative, resolve } from 'node:path'\nimport { execFileSync } from 'node:child_process'\nimport { resolveRegistrySource } from './registry.js'\nimport { bold, dim, green } from './ui.js'\n\nexport interface CreateOptions {\n dir: string\n template: string\n cwd: string\n}\n\n/**\n * The published SDK range a scaffolded store depends on. It lives in the CLI's\n * own package.json so it ships with the package, and `scripts/check-sdk-range.mjs`\n * fails the build when it drifts from the SDK's current minor — a stale range here\n * scaffolds stores that cannot resolve the dependency at all.\n */\nfunction publishedSdkRange(): string {\n const pkg = JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')) as { sdkRange?: string }\n if (!pkg.sdkRange) {\n throw new Error('@skuio/cli package.json is missing \"sdkRange\"')\n }\n return pkg.sdkRange\n}\n\nconst SKIP = new Set([\n 'node_modules', 'dist', '.astro', '.wrangler', '.env', '.dev.vars', '.store-api-key', 'migrations', 'test-results', 'playwright-report',\n])\n\n/**\n * Scaffold a new store from a template.\n *\n * The result is a plain project with no link back to this repo: it depends on\n * @skuio/storefront from npm and owns every other file outright.\n */\nexport async function create(opts: CreateOptions): Promise<void> {\n const target = resolve(opts.cwd, opts.dir)\n if (existsSync(target)) throw new Error(`${target} already exists`)\n\n const source = resolveRegistrySource()\n let templateDir: string\n let cleanup = () => {}\n\n if (source.kind === 'local') {\n templateDir = join(source.root, 'templates', opts.template)\n if (!existsSync(templateDir)) throw new Error(`No template \"${opts.template}\" in ${source.root}/templates`)\n } else {\n // Pull the repo tarball and take just the template out of it.\n const tmp = mkdtempSync(join(tmpdir(), 'skuio-'))\n cleanup = () => rmSync(tmp, { recursive: true, force: true })\n const tarball = join(tmp, 'repo.tgz')\n const res = await fetch('https://codeload.github.com/skuio/storefront/tar.gz/main')\n if (!res.ok) throw new Error(`Could not download template: HTTP ${res.status}`)\n writeFileSync(tarball, Buffer.from(await res.arrayBuffer()))\n execFileSync(\n 'tar',\n ['-xzf', tarball, '-C', tmp, '--strip-components=1', `storefront-main/templates/${opts.template}`],\n { stdio: 'ignore' }\n )\n templateDir = join(tmp, 'templates', opts.template)\n if (!existsSync(templateDir)) {\n cleanup()\n throw new Error(`Template \"${opts.template}\" is not in the published repo`)\n }\n }\n\n mkdirSync(target, { recursive: true })\n cpSync(templateDir, target, { recursive: true, filter: (src) => !SKIP.has(basename(src)) })\n\n // Detach from the monorepo: real package name, real dependency range.\n const pkgPath = join(target, 'package.json')\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as Record<string, unknown>\n pkg.name = basename(target).toLowerCase().replace(/[^a-z0-9-]/g, '-')\n pkg.private = true\n delete pkg.description\n const deps = (pkg.dependencies ?? {}) as Record<string, string>\n const sdkRange = deps['@skuio/storefront']\n let linkedSdk: string | null = null\n if (sdkRange === '*' || sdkRange?.startsWith('workspace')) {\n if (source.kind === 'local') {\n // Scaffolded from a checkout of the kit: link the SDK on disk so the\n // store builds before the package is on npm. Swap for a range to publish.\n linkedSdk = `file:${relative(target, join(source.root, 'packages', 'sdk')) || '.'}`\n deps['@skuio/storefront'] = linkedSdk\n // Astro pins vite 6; without this npm may hoist a second vite next to it.\n pkg.overrides = { ...((pkg.overrides as Record<string, string>) ?? {}), vite: '^6.4.3' }\n } else {\n deps['@skuio/storefront'] = publishedSdkRange()\n }\n }\n writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\\n')\n\n cleanup()\n\n console.log(`\\n${green('✓')} Created ${bold(target)} from the ${bold(opts.template)} template.\\n`)\n console.log('Next:')\n console.log(` ${dim('$')} cd ${opts.dir}`)\n console.log(` ${dim('$')} npm install`)\n console.log(` ${dim('$')} cp .dev.vars.example .dev.vars ${dim('# manual payments + console mail need no keys')}`)\n console.log(`\\n ${bold('On Cloudflare Workers + D1')} ${dim('(default)')}`)\n console.log(` ${dim('$')} npx wrangler d1 create ${opts.dir} ${dim('# paste the id into wrangler.jsonc')}`)\n console.log(` ${dim('$')} npm run db:migrate:local && npm run seed`)\n console.log(` ${dim('$')} npm run dev`)\n console.log(` ${dim('$')} npm run owner:create:local -- --email you@example.com --name \"Your Name\" ${dim('# the owner who signs in at /admin')}`)\n console.log(`\\n ${bold('On any Node host')} ${dim('(SQLite file)')}`)\n console.log(` ${dim('$')} export STORE_HOST=node DATABASE_PATH=data/store.db`)\n console.log(` ${dim('$')} npm run seed:sqlite && npm run dev`)\n console.log(` ${dim('$')} npm run owner:create:sqlite -- --email you@example.com --name \"Your Name\"`)\n if (linkedSdk) {\n console.log(`\\n${dim('@skuio/storefront is linked from your kit checkout (' + linkedSdk + ').')}`)\n console.log(dim('Run `npm run build` in the kit first, and replace the link with a version range before publishing.'))\n }\n console.log(`\\nThen open ${bold('CLAUDE.md')} — it tells your coding agent how the store is put together.\\n`)\n}\n","import { add } from './add.js'\nimport { create } from './create.js'\nimport { loadRegistry, resolveRegistrySource } from './registry.js'\nimport { bold, dim, red } from './ui.js'\n\nconst USAGE = `\n${bold('skuio')} — scaffold a SKU.io storefront and add blocks\n\n ${bold('skuio create')} <dir> [--template default] scaffold a new store\n ${bold('skuio add')} <block...> [--overwrite] copy blocks into this project\n ${bold('skuio list')} show available blocks\n\nBlocks are copied, not installed: after \\`add\\`, the files are yours to change.\nSet ${dim('SKUIO_REGISTRY')} to a path or URL to use a different registry.\n`\n\nasync function main(argv: string[]) {\n const [cmd, ...rest] = argv\n const flags = new Set(rest.filter((a) => a.startsWith('--')))\n const args = rest.filter((a, i) => !a.startsWith('--') && rest[i - 1] !== '--template')\n const flagValue = (name: string) => {\n const i = rest.indexOf(`--${name}`)\n return i > -1 ? rest[i + 1] : undefined\n }\n\n switch (cmd) {\n case 'create': {\n const dir = args[0]\n if (!dir) throw new Error('create needs a directory name')\n await create({ dir, template: flagValue('template') ?? 'default', cwd: process.cwd() })\n return\n }\n case 'add': {\n if (args.length === 0) throw new Error('add needs at least one block name')\n await add({ names: args, cwd: process.cwd(), overwrite: flags.has('--overwrite') })\n return\n }\n case 'list': {\n const registry = await loadRegistry(resolveRegistrySource())\n const width = Math.max(...registry.blocks.map((b) => b.name.length))\n for (const b of registry.blocks) console.log(` ${bold(b.name.padEnd(width))} ${dim(b.description)}`)\n return\n }\n case undefined:\n case 'help':\n case '--help':\n case '-h':\n console.log(USAGE)\n return\n default:\n throw new Error(`Unknown command \"${cmd}\"\\n${USAGE}`)\n }\n}\n\nmain(process.argv.slice(2)).catch((err: unknown) => {\n console.error(`\\n${red('error')} ${err instanceof Error ? err.message : String(err)}\\n`)\n process.exit(1)\n})\n"],"mappings":"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","names":["existsSync","readFileSync","dirname","join","join","existsSync","readFileSync","dirname","existsSync","mkdirSync","readFileSync","writeFileSync","join","resolve","readFileSync","resolve","existsSync","join","writeFileSync","mkdirSync"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@skuio/cli",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"sdkRange": "^0.
|
|
3
|
+
"version": "0.6.1",
|
|
4
|
+
"sdkRange": "^0.6.0",
|
|
5
5
|
"description": "Scaffold a SKU.io storefront and add blocks from the registry. `npx @skuio/cli create my-store`.",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"type": "module",
|