@spree/cli 2.3.9 → 2.4.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.
Files changed (28) hide show
  1. package/dist/index.js +189 -167
  2. package/dist/templates/dashboard-starter/.env.example +4 -0
  3. package/dist/templates/dashboard-starter/README.md +36 -0
  4. package/dist/templates/dashboard-starter/biome.json +60 -0
  5. package/dist/templates/dashboard-starter/gitignore.template +6 -0
  6. package/dist/templates/dashboard-starter/index.html +27 -0
  7. package/dist/templates/dashboard-starter/package.json +33 -0
  8. package/dist/templates/dashboard-starter/src/main.tsx +30 -0
  9. package/dist/templates/dashboard-starter/src/plugins.ts +19 -0
  10. package/dist/templates/dashboard-starter/src/routeTree.gen.ts +1140 -0
  11. package/dist/templates/dashboard-starter/src/styles.css +8 -0
  12. package/dist/templates/dashboard-starter/tsconfig.json +20 -0
  13. package/dist/templates/dashboard-starter/vite.config.ts +33 -0
  14. package/dist/templates/plugin/LICENSE.tt +3 -0
  15. package/dist/templates/plugin/README.md.tt +52 -0
  16. package/dist/templates/plugin/package.json.tt +19 -0
  17. package/dist/templates/plugin/packages/dashboard/biome.json +24 -0
  18. package/dist/templates/plugin/packages/dashboard/package.json.tt +49 -0
  19. package/dist/templates/plugin/packages/dashboard/src/client.ts.tt +29 -0
  20. package/dist/templates/plugin/packages/dashboard/src/index.tsx.tt +89 -0
  21. package/dist/templates/plugin/packages/dashboard/src/locales/en.json.tt +25 -0
  22. package/dist/templates/plugin/packages/dashboard/src/pages/{{name}}-list.tsx.tt +50 -0
  23. package/dist/templates/plugin/packages/dashboard/src/routes/{{name}}.index.tsx.tt +26 -0
  24. package/dist/templates/plugin/packages/dashboard/src/slots/product-{{name}}-card.tsx.tt +33 -0
  25. package/dist/templates/plugin/packages/dashboard/src/types.ts.tt +17 -0
  26. package/dist/templates/plugin/packages/dashboard/tsconfig.json +26 -0
  27. package/dist/templates/plugin/pnpm-workspace.yaml +2 -0
  28. package/package.json +3 -3
@@ -0,0 +1,8 @@
1
+ /* CSS entry. The Spree stylesheet chain provides Tailwind v4 layers, design
2
+ * tokens, and base styles; `spreeDashboardPlugin()` appends `@source`
3
+ * directives here at build time so Tailwind scans every Spree dashboard
4
+ * package and installed plugin for class usage.
5
+ *
6
+ * Add your own styles below the import. */
7
+
8
+ @import "@spree/dashboard/styles.css";
@@ -0,0 +1,20 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "ignoreDeprecations": "6.0",
5
+ "useDefineForClassFields": true,
6
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
7
+ "module": "ESNext",
8
+ "types": ["vite/client"],
9
+ "skipLibCheck": true,
10
+ "moduleResolution": "bundler",
11
+ "verbatimModuleSyntax": true,
12
+ "moduleDetection": "force",
13
+ "noEmit": true,
14
+ "jsx": "react-jsx",
15
+ "strict": true,
16
+ "noFallthroughCasesInSwitch": true,
17
+ "noUncheckedSideEffectImports": true
18
+ },
19
+ "include": ["src"]
20
+ }
@@ -0,0 +1,33 @@
1
+ import { spreeDashboardPlugin } from '@spree/dashboard/vite'
2
+ import react from '@vitejs/plugin-react'
3
+ import { defineConfig } from 'vite'
4
+
5
+ export default defineConfig({
6
+ // Sub-path mounting for the single-node topology (Rails serves the build at
7
+ // /dashboard): build with VITE_BASE_PATH=/dashboard/ so asset URLs resolve.
8
+ // Unset (dev, CDN root deploys) Vite defaults to '/'.
9
+ base: process.env.VITE_BASE_PATH,
10
+ // spreeDashboardPlugin bundles Tailwind, injects @source directives for
11
+ // every Spree dashboard package, auto-discovers installed dashboard
12
+ // plugins (package.json deps carrying the `spree.dashboard.plugin`
13
+ // marker), serves the `virtual:spree-dashboard-plugins` module that
14
+ // src/main.tsx imports to activate them, and composes the shell's and
15
+ // every plugin's file routes into src/routeTree.gen.ts on each dev
16
+ // start/build — commit that file; its diff shows what an upgrade added.
17
+ plugins: [spreeDashboardPlugin(), react()],
18
+ // Proxy /api to the Rails server so the SPA is same-origin with the API in
19
+ // dev — keeps the refresh-token cookie working under SameSite=Lax without
20
+ // HTTPS. /rails covers Active Storage's Disk-service presigned URLs.
21
+ server: {
22
+ proxy: {
23
+ '/api': {
24
+ target: process.env.VITE_SPREE_API_URL || 'http://localhost:3000',
25
+ changeOrigin: true,
26
+ },
27
+ '/rails': {
28
+ target: process.env.VITE_SPREE_API_URL || 'http://localhost:3000',
29
+ changeOrigin: true,
30
+ },
31
+ },
32
+ },
33
+ })
@@ -0,0 +1,3 @@
1
+ Copyright (c) {{year}} {{author_name}}
2
+
3
+ Licensed under the {{license}} License. See the license's full text for the canonical terms.
@@ -0,0 +1,52 @@
1
+ # {{plugin_name}}
2
+
3
+ A Spree plugin: **{{name}}**.
4
+
5
+ This is a hybrid Node/Ruby monorepo with two halves:
6
+
7
+ - `packages/dashboard/` — TypeScript dashboard plugin (extends the Spree 6.0 admin via [`@spree/dashboard-core`](https://www.npmjs.com/package/@spree/dashboard-core))
8
+ - `engine/` — Ruby Rails engine (Spree extension gem) that ships the Admin API endpoints and ActiveRecord models
9
+
10
+ Both halves work together: the engine ships `/api/v3/admin/...` endpoints, the dashboard plugin calls them via the SDK's `request` method.
11
+
12
+ ## Development setup
13
+
14
+ ```bash
15
+ # Install JavaScript dependencies
16
+ pnpm install
17
+
18
+ # Install Ruby dependencies for the engine
19
+ cd engine && bundle install && cd ..
20
+ ```
21
+
22
+ ## Running against a Spree host app
23
+
24
+ The engine needs to live alongside a Spree host (typically scaffolded via `create-spree-app`). Point your host's Gemfile at the local engine:
25
+
26
+ ```ruby
27
+ # in your Spree host's Gemfile
28
+ gem '{{ruby_name}}', path: '../path/to/{{plugin_name}}/engine'
29
+ ```
30
+
31
+ Activate the dashboard plugin with a side-effect import in the host's `main.tsx`, before the router mounts. This runs `defineDashboardPlugin` so the nav entry, route, slot widget, and table column register:
32
+
33
+ ```tsx
34
+ import '{{npm_dashboard_package}}'
35
+ ```
36
+
37
+ That's it — no `vite.config.ts` edit. This plugin's `package.json` declares `"spree": { "dashboard": { "plugin": true } }`, which `@spree/dashboard-core/vite`'s auto-discovery picks up so Tailwind v4 scans the plugin's source files for utility classes automatically.
38
+
39
+ If you'd rather opt out of auto-discovery and register manually, pass an explicit `plugins` array to `spreeDashboardPlugin` in the host's `vite.config.ts`.
40
+
41
+ ## Documentation
42
+
43
+ - [Dashboard overview](https://spreecommerce.org/docs/developer/dashboard/overview) — three-package split + when to plug-in vs. customize in-app
44
+ - [Customization quickstart](https://spreecommerce.org/docs/developer/dashboard/customization/quickstart) — the registries this plugin uses
45
+ - [Plugin overview](https://spreecommerce.org/docs/developer/dashboard/plugins/overview) — packaging + publishing your plugin to npm
46
+ - [Slots catalog](https://spreecommerce.org/docs/developer/dashboard/slots-catalog) — every named slot the dashboard exposes
47
+ - [Custom Admin Endpoints](https://spreecommerce.org/docs/developer/sdk/admin/extending) — adding your own API endpoints
48
+ - [Spree Extensions guide](https://spreecommerce.org/docs/developer/customization/extensions) — the Rails-engine side
49
+
50
+ ## License
51
+
52
+ {{license}} © {{year}} {{author_name}}
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "{{npm_package_name}}",
3
+ "private": true,
4
+ "version": "0.1.0",
5
+ "description": "Spree plugin: {{name}}",
6
+ "author": "{{author_name}} <{{author_email}}>",
7
+ "license": "{{license}}",
8
+ "type": "module",
9
+ "scripts": {
10
+ "build": "pnpm -r build",
11
+ "lint": "pnpm -r lint",
12
+ "typecheck": "pnpm -r typecheck",
13
+ "test": "pnpm -r test"
14
+ },
15
+ "packageManager": "pnpm@11.1.1",
16
+ "engines": {
17
+ "node": ">=22"
18
+ }
19
+ }
@@ -0,0 +1,24 @@
1
+ {
2
+ "$schema": "https://biomejs.dev/schemas/2.4.14/schema.json",
3
+ "files": {
4
+ "includes": ["src/**"]
5
+ },
6
+ "linter": {
7
+ "enabled": true,
8
+ "rules": {
9
+ "recommended": true
10
+ }
11
+ },
12
+ "formatter": {
13
+ "enabled": true,
14
+ "indentStyle": "space",
15
+ "indentWidth": 2,
16
+ "lineWidth": 100
17
+ },
18
+ "javascript": {
19
+ "formatter": {
20
+ "quoteStyle": "single",
21
+ "semicolons": "asNeeded"
22
+ }
23
+ }
24
+ }
@@ -0,0 +1,49 @@
1
+ {
2
+ "name": "{{npm_dashboard_package}}",
3
+ "private": true,
4
+ "version": "0.1.0",
5
+ "description": "Dashboard plugin half of {{plugin_name}}",
6
+ "author": "{{author_name}} <{{author_email}}>",
7
+ "license": "{{license}}",
8
+ "type": "module",
9
+ "main": "./src/index.tsx",
10
+ "module": "./src/index.tsx",
11
+ "types": "./src/index.tsx",
12
+ "exports": {
13
+ ".": "./src/index.tsx"
14
+ },
15
+ "files": [
16
+ "src",
17
+ "README.md"
18
+ ],
19
+ "scripts": {
20
+ "lint": "biome check src",
21
+ "lint:fix": "biome check --fix src",
22
+ "typecheck": "tsc --noEmit"
23
+ },
24
+ "spree": {
25
+ "dashboard": {
26
+ "plugin": true,
27
+ "routes": "./src/routes"
28
+ }
29
+ },
30
+ "peerDependencies": {
31
+ "@spree/admin-sdk": "^0.6.0",
32
+ "@spree/dashboard-core": "^0.10.0",
33
+ "@spree/dashboard-ui": "^0.10.0",
34
+ "@tanstack/react-query": "^5",
35
+ "@tanstack/react-router": "^1",
36
+ "i18next": "^26",
37
+ "lucide-react": "^1",
38
+ "react": "^19",
39
+ "react-dom": "^19",
40
+ "react-i18next": "^17"
41
+ },
42
+ "devDependencies": {
43
+ "@biomejs/biome": "^2.4.14",
44
+ "@types/react": "^19.2.14",
45
+ "@types/react-dom": "^19.2.3",
46
+ "typescript": "~6.0.3",
47
+ "vite": "^8"
48
+ }
49
+ }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Typed wrappers around `adminClient.request` for the {{name}} endpoints
3
+ * shipped by the engine. Keeping the wrappers in one file means consumers
4
+ * (route pages, slot widgets) never call `request` directly — they import
5
+ * from here, which makes it easy to swap implementations or rename paths.
6
+ *
7
+ * See https://spreecommerce.org/docs/developer/sdk/admin/extending for the
8
+ * underlying `request` API.
9
+ */
10
+ import type { PaginatedResponse } from '@spree/admin-sdk'
11
+ import { adminClient } from '@spree/dashboard-core'
12
+ import type { {{module_name}}, {{module_name}}CreateParams, {{module_name}}UpdateParams } from './types'
13
+
14
+ type ListParams = Record<string, string | number | boolean | (string | number)[] | undefined>
15
+
16
+ export const {{module_name}}Client = {
17
+ list: (params?: ListParams) =>
18
+ adminClient.request<PaginatedResponse<{{module_name}}>>('GET', '/{{name}}', { params }),
19
+
20
+ get: (id: string) => adminClient.request<{{module_name}}>('GET', `/{{name}}/${id}`),
21
+
22
+ create: (body: {{module_name}}CreateParams) =>
23
+ adminClient.request<{{module_name}}>('POST', '/{{name}}', { body }),
24
+
25
+ update: (id: string, body: {{module_name}}UpdateParams) =>
26
+ adminClient.request<{{module_name}}>('PATCH', `/{{name}}/${id}`, { body }),
27
+
28
+ delete: (id: string) => adminClient.request<void>('DELETE', `/{{name}}/${id}`),
29
+ }
@@ -0,0 +1,89 @@
1
+ /**
2
+ * {{plugin_name}} — dashboard plugin entry.
3
+ *
4
+ * Wires nav + route + slot + table extensions via defineDashboardPlugin and
5
+ * merges plugin translations into the dashboard's i18next namespace.
6
+ *
7
+ * Activation is automatic: the package.json's `spree.dashboard.plugin`
8
+ * marker makes `spreeDashboardPlugin()` discover this package and import it
9
+ * through `virtual:spree-dashboard-plugins` in the host's app entry, running
10
+ * every defineDashboardPlugin and i18n.addResourceBundle call below before
11
+ * the router mounts. Hosts without the virtual import can side-effect-import
12
+ * '{{npm_dashboard_package}}' directly.
13
+ */
14
+ import { defineDashboardPlugin, defineTable, i18n } from '@spree/dashboard-core'
15
+ import { RelativeTime } from '@spree/dashboard-ui'
16
+ import { PackageIcon } from 'lucide-react'
17
+ import { {{module_name}}Client } from './client'
18
+ import en from './locales/en.json'
19
+ import { {{module_name}}Card } from './slots/product-{{name}}-card'
20
+ import type { {{module_name}} } from './types'
21
+
22
+ // ---------------------------------------------------------------------------
23
+ // 1. Translations
24
+ // ---------------------------------------------------------------------------
25
+ // `deep: true` + `overwrite: true` merge our `admin.{{name}}_plugin.*` keys
26
+ // into the framework's `admin.*` namespace without dropping base translations.
27
+ i18n.addResourceBundle('en', 'translation', en, true, true)
28
+
29
+ // ---------------------------------------------------------------------------
30
+ // 2. Declare the table used by our list page
31
+ // ---------------------------------------------------------------------------
32
+ defineTable<{{module_name}}>('{{name}}', {
33
+ title: i18n.t('admin.{{name}}_plugin.table.title'),
34
+ searchParam: 'search',
35
+ searchPlaceholder: i18n.t('admin.{{name}}_plugin.table.search_placeholder'),
36
+ defaultSort: { field: 'name', direction: 'asc' },
37
+ emptyMessage: i18n.t('admin.{{name}}_plugin.table.empty'),
38
+ columns: [
39
+ {
40
+ key: 'name',
41
+ label: i18n.t('admin.{{name}}_plugin.fields.name'),
42
+ sortable: true,
43
+ filterable: true,
44
+ default: true,
45
+ // Add a detail route (path: '/{{name}}/$id') before linking here —
46
+ // see /developer/dashboard/customization/routes.
47
+ render: (record) => <span className="font-medium text-foreground">{record.name}</span>,
48
+ },
49
+ {
50
+ key: 'created_at',
51
+ label: i18n.t('admin.{{name}}_plugin.fields.created_at'),
52
+ sortable: true,
53
+ default: true,
54
+ render: (record) => <RelativeTime iso={record.created_at} />,
55
+ },
56
+ ],
57
+ })
58
+
59
+ // ---------------------------------------------------------------------------
60
+ // 3. Register everything else
61
+ // ---------------------------------------------------------------------------
62
+ defineDashboardPlugin({
63
+ nav: [
64
+ {
65
+ key: '{{name}}',
66
+ label: i18n.t('admin.{{name}}_plugin.nav'),
67
+ path: '/{{name}}',
68
+ icon: PackageIcon,
69
+ position: 50,
70
+ },
71
+ ],
72
+ // Routes ship as file routes in src/routes/ (see the package.json marker)
73
+ // and are compiled into the host's typed route tree. The `routes:` registry
74
+ // option remains available for dynamic host-app cases.
75
+ slots: {
76
+ 'product.form_sidebar': [
77
+ {
78
+ id: '{{name}}-card',
79
+ // dashboard-core types `slots` generically; the slot's context shape
80
+ // is documented in @spree/dashboard's source per slot name.
81
+ component: {{module_name}}Card as never,
82
+ position: 250,
83
+ },
84
+ ],
85
+ },
86
+ })
87
+
88
+ export { {{module_name}}Client } from './client'
89
+ export type { {{module_name}} } from './types'
@@ -0,0 +1,25 @@
1
+ {
2
+ "admin": {
3
+ "{{name}}_plugin": {
4
+ "nav": "{{module_name}}",
5
+ "page": {
6
+ "title": "{{module_name}}",
7
+ "subtitle": "Manage your {{name}}",
8
+ "new_cta": "New {{name}}"
9
+ },
10
+ "table": {
11
+ "title": "{{module_name}}",
12
+ "search_placeholder": "Search by name…",
13
+ "empty": "No {{name}} yet"
14
+ },
15
+ "fields": {
16
+ "name": "Name",
17
+ "created_at": "Created"
18
+ },
19
+ "product_card": {
20
+ "title": "{{module_name}}",
21
+ "placeholder": "Replace this widget with your own slot UI."
22
+ }
23
+ }
24
+ }
25
+ }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * {{module_name}} list page. Mounted at `/$storeId/{{name}}` via the plugin's
3
+ * route registration in `index.tsx`. Uses `<ResourceTable>` for filtering,
4
+ * sorting, pagination — the same UX as core's Products/Customers/Orders.
5
+ *
6
+ * Plugin route components receive `{ params, storeId, searchParams }` from
7
+ * the dashboard's catch-all dispatcher. We forward `searchParams` to
8
+ * ResourceTable so filter/sort/pagination round-trip through the URL.
9
+ */
10
+ import { PageHeader, type ResourceSearch, ResourceTable } from '@spree/dashboard-core'
11
+ import { Button, ResourceLayout } from '@spree/dashboard-ui'
12
+ import { PlusIcon } from 'lucide-react'
13
+ import { useTranslation } from 'react-i18next'
14
+ import { {{module_name}}Client } from '../client'
15
+ import type { {{module_name}} } from '../types'
16
+
17
+ interface {{module_name}}ListPageProps {
18
+ searchParams: Record<string, unknown>
19
+ }
20
+
21
+ export function {{module_name}}ListPage({ searchParams }: {{module_name}}ListPageProps) {
22
+ const { t } = useTranslation()
23
+
24
+ return (
25
+ <ResourceLayout
26
+ header={
27
+ <PageHeader
28
+ title={t('admin.{{name}}_plugin.page.title')}
29
+ subtitle={t('admin.{{name}}_plugin.page.subtitle')}
30
+ actions={
31
+ <Button size="sm">
32
+ <PlusIcon className="size-4" />
33
+ {t('admin.{{name}}_plugin.page.new_cta')}
34
+ </Button>
35
+ }
36
+ />
37
+ }
38
+ main={
39
+ <ResourceTable<{{module_name}}>
40
+ tableKey="{{name}}"
41
+ queryKey="{{name}}"
42
+ // ResourceTable hands `params` to queryFn as Record<string, unknown>;
43
+ // we narrow to our client's known param shape at the boundary.
44
+ queryFn={(params) => {{module_name}}Client.list(params as Record<string, never>)}
45
+ searchParams={searchParams as ResourceSearch}
46
+ />
47
+ }
48
+ />
49
+ )
50
+ }
@@ -0,0 +1,26 @@
1
+ /**
2
+ * File route for the {{name}} list — compiled into the host's typed route
3
+ * tree by `spreeDashboardPlugin()`. This directory is declared via the
4
+ * package.json marker (`"spree": { "dashboard": { "routes": "./src/routes" } }`).
5
+ *
6
+ * The path literal is the FINAL composed path (plugin routes mount under the
7
+ * dashboard's `_authenticated/$storeId` layout) — commit it exactly; the
8
+ * route generator verifies it.
9
+ *
10
+ * Route files type-check through a host app's build (they need a generated
11
+ * route tree in the program), so they're excluded from this package's
12
+ * standalone `tsc` run — develop against a dashboard host.
13
+ */
14
+ import { resourceSearchSchema } from '@spree/dashboard-core'
15
+ import { createFileRoute } from '@tanstack/react-router'
16
+ import { {{module_name}}ListPage } from '../pages/{{name}}-list'
17
+
18
+ export const Route = createFileRoute('/_authenticated/$storeId/{{name}}/')({
19
+ validateSearch: resourceSearchSchema,
20
+ component: {{module_name}}Route,
21
+ })
22
+
23
+ function {{module_name}}Route() {
24
+ const searchParams = Route.useSearch()
25
+ return <{{module_name}}ListPage searchParams={searchParams} />
26
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Sidebar widget rendered on the product detail page via the
3
+ * `product.form_sidebar` slot. Demonstrates the slot extension pattern:
4
+ * the host page knows nothing about {{name}}; the plugin contributes
5
+ * this card via the slot registry.
6
+ *
7
+ * The slot's context (typed by the dashboard's slot catalogue as
8
+ * `{ product }`) gives us the product being edited.
9
+ */
10
+ import { Card, CardContent, CardHeader, CardTitle } from '@spree/dashboard-ui'
11
+ import { useTranslation } from 'react-i18next'
12
+
13
+ interface {{module_name}}CardProps {
14
+ product: { id: string }
15
+ }
16
+
17
+ export function {{module_name}}Card({ product }: {{module_name}}CardProps) {
18
+ const { t } = useTranslation()
19
+
20
+ return (
21
+ <Card>
22
+ <CardHeader>
23
+ <CardTitle>{t('admin.{{name}}_plugin.product_card.title')}</CardTitle>
24
+ </CardHeader>
25
+ <CardContent>
26
+ <p className="text-sm text-muted-foreground">
27
+ {t('admin.{{name}}_plugin.product_card.placeholder')}
28
+ </p>
29
+ <p className="mt-2 text-xs font-mono text-muted-foreground">{product.id}</p>
30
+ </CardContent>
31
+ </Card>
32
+ )
33
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Shape of a {{module_name}} record returned by the engine. Generated by hand
3
+ * here; a real plugin should regenerate this from the Alba serializer via
4
+ * Spree's Typelizer pipeline once the engine is publishing types.
5
+ */
6
+ export interface {{module_name}} {
7
+ id: string
8
+ name: string
9
+ created_at: string
10
+ updated_at: string
11
+ }
12
+
13
+ export interface {{module_name}}CreateParams {
14
+ name: string
15
+ }
16
+
17
+ export type {{module_name}}UpdateParams = Partial<{{module_name}}CreateParams>
@@ -0,0 +1,26 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "ignoreDeprecations": "6.0",
5
+ "useDefineForClassFields": true,
6
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
7
+ "module": "ESNext",
8
+ "types": ["vite/client"],
9
+ "skipLibCheck": true,
10
+ "moduleResolution": "bundler",
11
+ "allowImportingTsExtensions": true,
12
+ "verbatimModuleSyntax": true,
13
+ "moduleDetection": "force",
14
+ "noEmit": true,
15
+ "jsx": "react-jsx",
16
+ "strict": true,
17
+ "noUnusedLocals": true,
18
+ "noUnusedParameters": true,
19
+ "erasableSyntaxOnly": true,
20
+ "noFallthroughCasesInSwitch": true,
21
+ "noUncheckedSideEffectImports": true,
22
+ "resolveJsonModule": true
23
+ },
24
+ "include": ["src"],
25
+ "exclude": ["src/routes"]
26
+ }
@@ -0,0 +1,2 @@
1
+ packages:
2
+ - "packages/*"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@spree/cli",
3
- "version": "2.3.9",
3
+ "version": "2.4.1",
4
4
  "description": "CLI for managing Spree Commerce projects",
5
5
  "type": "module",
6
6
  "bin": {
@@ -45,13 +45,13 @@
45
45
  "typescript": "^6.0.3",
46
46
  "vitest": "^4.1.5",
47
47
  "yaml": "^2.8.4",
48
- "@spree/admin-sdk": "^0.5.0"
48
+ "@spree/admin-sdk": "^0.6.0"
49
49
  },
50
50
  "engines": {
51
51
  "node": ">=20"
52
52
  },
53
53
  "scripts": {
54
- "build": "node scripts/bundle-spec.mjs && tsup",
54
+ "build": "node scripts/bundle-spec.mjs && node ../../scripts/sync-dashboard-starter.mjs templates/dashboard-starter && tsup",
55
55
  "dev": "tsup --watch",
56
56
  "test": "vitest run",
57
57
  "typecheck": "tsc --noEmit",