@pradip1995/create-storefront-app 0.2.3 → 0.3.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/bin/create-storefront-app.js +147 -59
- package/lib/build-backend-package.js +54 -0
- package/lib/build-homepage-defaults.cjs +50 -0
- package/lib/deps.js +3 -1
- package/lib/docker-template-vars.js +32 -0
- package/lib/medusa-plugin-versions.json +55 -0
- package/lib/scaffold-backend.js +107 -0
- package/lib/scaffold-docker.js +82 -0
- package/lib/versions.js +4 -3
- package/package.json +3 -2
- package/templates/backend/.cursor/commands/seed-backend.md +21 -0
- package/templates/backend/.cursor/rules/medusa-backend.mdc +54 -0
- package/templates/backend/config/README.md +23 -0
- package/templates/backend/config/homepage-config.json +568 -0
- package/templates/backend/env.template +53 -0
- package/templates/backend/gitignore +8 -0
- package/templates/backend/medusa-config.full.ts +251 -0
- package/templates/backend/medusa-config.minimal.ts +141 -0
- package/templates/backend/scripts/build-dynamic-config-defaults.mjs +25 -0
- package/templates/backend/scripts/build-homepage-defaults.cjs +50 -0
- package/templates/backend/src/config/product-metadata-descriptors.ts +27 -0
- package/templates/backend/src/scripts/seed.ts +210 -0
- package/templates/backend/tsconfig.json +24 -0
- package/templates/docker/Makefile +88 -0
- package/templates/docker/backend/.dockerignore +8 -0
- package/templates/docker/backend/Dockerfile +30 -0
- package/templates/docker/data/README.md +12 -0
- package/templates/docker/data/dump.sql +3 -0
- package/templates/docker/docker/.env.example +36 -0
- package/templates/docker/docker/frontend.build.defaults +7 -0
- package/templates/docker/docker/gitignore +1 -0
- package/templates/docker/docker/postgres/01-create-postgres-role.sql +9 -0
- package/templates/docker/docker/postgres/docker-entrypoint-wrapper.sh +49 -0
- package/templates/docker/docker-compose.infra.yml +64 -0
- package/templates/docker/docker-compose.yml +138 -0
- package/templates/docker/storefront/.dockerignore +9 -0
- package/templates/docker/storefront/Dockerfile +53 -0
- package/templates/root/.cursor/commands/docker-dev.md +27 -0
- package/templates/root/.cursor/rules/monorepo-layout.mdc +55 -0
- package/templates/root/scripts/sync-publishable-key.mjs +108 -0
- package/templates/shared/.cursor/commands/change-theme-colors.md +1 -1
- package/templates/shared/.cursor/commands/fix-segment-issue.md +2 -2
- package/templates/shared/.cursor/commands/rebuild-storefront.md +1 -1
- package/templates/shared/.cursor/rules/customize-sections.mdc +7 -1
- package/templates/shared/.cursor/rules/customize-theme.mdc +1 -1
- package/templates/shared/.cursor/rules/storefront-architecture.mdc +3 -2
- package/templates/shared/.cursor/skills/fix-segment-issues/SKILL.md +1 -1
- package/templates/shared/README.md +100 -0
- package/templates/shared/root-gitignore +6 -0
- package/templates/shared/storefront-only-README.md +25 -0
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { cpSync, existsSync, mkdirSync, readFileSync, writeFileSync, chmodSync } from "fs"
|
|
2
|
+
import { join, dirname } from "path"
|
|
3
|
+
import { fileURLToPath } from "url"
|
|
4
|
+
import { buildDockerTemplateVars } from "./docker-template-vars.js"
|
|
5
|
+
|
|
6
|
+
const __dirname = dirname(fileURLToPath(import.meta.url))
|
|
7
|
+
const PKG_ROOT = join(__dirname, "..")
|
|
8
|
+
const DOCKER_TEMPLATE = join(PKG_ROOT, "templates", "docker")
|
|
9
|
+
|
|
10
|
+
function applyTemplate(content, vars) {
|
|
11
|
+
return content.replace(/\{\{(\w+)\}\}/g, (_, key) => vars[key] ?? "")
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
function writeTemplatedFile(srcPath, destPath, vars) {
|
|
15
|
+
writeFileSync(destPath, applyTemplate(readFileSync(srcPath, "utf8"), vars))
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function copyBinaryOrTemplate(srcPath, destPath, vars, { binary = false } = {}) {
|
|
19
|
+
if (binary) {
|
|
20
|
+
cpSync(srcPath, destPath)
|
|
21
|
+
return
|
|
22
|
+
}
|
|
23
|
+
writeTemplatedFile(srcPath, destPath, vars)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/** Copy Docker Compose stack, Makefile, and docker/ config to project root */
|
|
27
|
+
export function scaffoldDocker(projectRoot, args) {
|
|
28
|
+
const vars = buildDockerTemplateVars(args)
|
|
29
|
+
|
|
30
|
+
writeTemplatedFile(join(DOCKER_TEMPLATE, "docker-compose.yml"), join(projectRoot, "docker-compose.yml"), vars)
|
|
31
|
+
writeTemplatedFile(
|
|
32
|
+
join(DOCKER_TEMPLATE, "docker-compose.infra.yml"),
|
|
33
|
+
join(projectRoot, "docker-compose.infra.yml"),
|
|
34
|
+
vars
|
|
35
|
+
)
|
|
36
|
+
writeTemplatedFile(join(DOCKER_TEMPLATE, "Makefile"), join(projectRoot, "Makefile"), vars)
|
|
37
|
+
|
|
38
|
+
const dockerDir = join(projectRoot, "docker")
|
|
39
|
+
mkdirSync(join(dockerDir, "postgres"), { recursive: true })
|
|
40
|
+
mkdirSync(join(projectRoot, "data"), { recursive: true })
|
|
41
|
+
|
|
42
|
+
writeTemplatedFile(
|
|
43
|
+
join(DOCKER_TEMPLATE, "docker", ".env.example"),
|
|
44
|
+
join(dockerDir, ".env.example"),
|
|
45
|
+
vars
|
|
46
|
+
)
|
|
47
|
+
writeTemplatedFile(join(DOCKER_TEMPLATE, "docker", ".env.example"), join(dockerDir, ".env"), vars)
|
|
48
|
+
writeTemplatedFile(
|
|
49
|
+
join(DOCKER_TEMPLATE, "docker", "frontend.build.defaults"),
|
|
50
|
+
join(dockerDir, "frontend.build.defaults"),
|
|
51
|
+
vars
|
|
52
|
+
)
|
|
53
|
+
cpSync(join(DOCKER_TEMPLATE, "docker", "gitignore"), join(dockerDir, ".gitignore"))
|
|
54
|
+
copyBinaryOrTemplate(
|
|
55
|
+
join(DOCKER_TEMPLATE, "docker", "postgres", "docker-entrypoint-wrapper.sh"),
|
|
56
|
+
join(dockerDir, "postgres", "docker-entrypoint-wrapper.sh"),
|
|
57
|
+
vars,
|
|
58
|
+
{ binary: true }
|
|
59
|
+
)
|
|
60
|
+
chmodSync(join(dockerDir, "postgres", "docker-entrypoint-wrapper.sh"), 0o755)
|
|
61
|
+
writeTemplatedFile(
|
|
62
|
+
join(DOCKER_TEMPLATE, "docker", "postgres", "01-create-postgres-role.sql"),
|
|
63
|
+
join(dockerDir, "postgres", "01-create-postgres-role.sql"),
|
|
64
|
+
vars
|
|
65
|
+
)
|
|
66
|
+
|
|
67
|
+
const dataReadme = join(DOCKER_TEMPLATE, "data", "README.md")
|
|
68
|
+
if (existsSync(dataReadme)) {
|
|
69
|
+
writeTemplatedFile(dataReadme, join(projectRoot, "data", "README.md"), vars)
|
|
70
|
+
}
|
|
71
|
+
cpSync(join(DOCKER_TEMPLATE, "data", "dump.sql"), join(projectRoot, "data", "dump.sql"))
|
|
72
|
+
|
|
73
|
+
cpSync(join(DOCKER_TEMPLATE, "backend", "Dockerfile"), join(projectRoot, "backend", "Dockerfile"))
|
|
74
|
+
cpSync(join(DOCKER_TEMPLATE, "backend", ".dockerignore"), join(projectRoot, "backend", ".dockerignore"))
|
|
75
|
+
cpSync(join(DOCKER_TEMPLATE, "storefront", "Dockerfile"), join(projectRoot, "storefront", "Dockerfile"))
|
|
76
|
+
cpSync(
|
|
77
|
+
join(DOCKER_TEMPLATE, "storefront", ".dockerignore"),
|
|
78
|
+
join(projectRoot, "storefront", ".dockerignore")
|
|
79
|
+
)
|
|
80
|
+
|
|
81
|
+
return projectRoot
|
|
82
|
+
}
|
package/lib/versions.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
/** Published package semver ranges — bump when releasing framework/components. */
|
|
2
|
-
export const COMMERCE_CORE_VERSION = "^4.0.
|
|
3
|
-
export const FRAMEWORK_VERSION = "^0.2.
|
|
4
|
-
export const
|
|
2
|
+
export const COMMERCE_CORE_VERSION = "^4.0.2"
|
|
3
|
+
export const FRAMEWORK_VERSION = "^0.2.1"
|
|
4
|
+
export const FRAMEWORK_COMPILER_VERSION = "^0.2.6"
|
|
5
|
+
export const COMPONENTS_VERSION = ">=0.2.0 <0.4.0"
|
|
5
6
|
|
|
6
7
|
export const FRAMEWORK_PACKAGES = [
|
|
7
8
|
"@pradip1995/plugin-sdk",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pradip1995/create-storefront-app",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.1",
|
|
4
4
|
"description": "Scaffold a segment-based Medusa storefront using @pradip1995/framework packages",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
"node": ">=20"
|
|
26
26
|
},
|
|
27
27
|
"scripts": {
|
|
28
|
-
"typecheck": "node --check bin/create-storefront-app.js && node --check lib/deps.js && node --check lib/versions.js"
|
|
28
|
+
"typecheck": "node --check bin/create-storefront-app.js && node --check lib/deps.js && node --check lib/versions.js && node --check lib/scaffold-backend.js && node --check lib/build-backend-package.js && node --check lib/scaffold-docker.js && node --check lib/docker-template-vars.js",
|
|
29
|
+
"verify-publish": "node scripts/verify-publish.mjs"
|
|
29
30
|
}
|
|
30
31
|
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Seed Medusa backend
|
|
2
|
+
|
|
3
|
+
From project root (recommended — also syncs publishable key to storefront):
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npm run seed
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
Backend only:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
cd backend
|
|
13
|
+
npm run seed
|
|
14
|
+
node ../scripts/sync-publishable-key.mjs --from-db
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
Requires PostgreSQL running and `DATABASE_URL` set in `backend/.env`.
|
|
18
|
+
|
|
19
|
+
## After seed
|
|
20
|
+
|
|
21
|
+
`scripts/sync-publishable-key.mjs` reads the publishable key from Postgres and updates `storefront/.env.local`. Then start storefront: `npm run dev:storefront`.
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Medusa backend — config, plugins, env, seed
|
|
3
|
+
globs: backend/**/*
|
|
4
|
+
alwaysApply: false
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Medusa backend
|
|
8
|
+
|
|
9
|
+
## Key files
|
|
10
|
+
|
|
11
|
+
| File | Purpose |
|
|
12
|
+
|------|---------|
|
|
13
|
+
| `medusa-config.ts` | Plugins + modules wiring |
|
|
14
|
+
| `config/medusa-plugin-versions.json` | npm version map for all plugins |
|
|
15
|
+
| `config/homepage-config.json` | Dynamic-config schema — **synced from storefront build** when sections change |
|
|
16
|
+
| `.env` | Database, CORS, secrets, integrations |
|
|
17
|
+
| `src/scripts/seed.ts` | Region, sales channel, publishable API key, sample product |
|
|
18
|
+
|
|
19
|
+
## Commands
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
cd backend
|
|
23
|
+
npm run dev # medusa develop
|
|
24
|
+
npm run build # medusa build
|
|
25
|
+
npm run seed # medusa exec ./src/scripts/seed.ts
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Docker
|
|
29
|
+
|
|
30
|
+
From project root: `make up-infra` then local `npm run dev`, or `make up` for full containerized stack. See `Makefile`.
|
|
31
|
+
|
|
32
|
+
## After seed
|
|
33
|
+
|
|
34
|
+
From project root, `npm run seed` or `make seed` syncs the publishable key into `storefront/.env.local` (via `scripts/sync-publishable-key.mjs`, reads from Postgres — no backend code changes).
|
|
35
|
+
|
|
36
|
+
## Plugin versions
|
|
37
|
+
|
|
38
|
+
Edit `config/medusa-plugin-versions.json`, then update `package.json` dependencies to match and run `npm install`.
|
|
39
|
+
|
|
40
|
+
## CORS
|
|
41
|
+
|
|
42
|
+
`STORE_CORS` and `AUTH_CORS` must include the storefront URL (`STOREFRONT_URL`).
|
|
43
|
+
|
|
44
|
+
## Dynamic config
|
|
45
|
+
|
|
46
|
+
Homepage fields in Admin come from `config/homepage-config.json` (registered in `medusa-config.ts`).
|
|
47
|
+
|
|
48
|
+
After editing the schema, run:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
npm run dynamic-config:defaults
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
The storefront reads **runtime values** from `GET /store/dynamic-config` — it does not generate or import schema files.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Dynamic config (backend)
|
|
2
|
+
|
|
3
|
+
| File | Purpose |
|
|
4
|
+
|------|---------|
|
|
5
|
+
| `homepage-config.json` | **Schema** for Medusa Admin — **auto-synced** from storefront build |
|
|
6
|
+
| `homepage-config.defaults.json` | Default values from schema `defaultValue` fields (auto-synced) |
|
|
7
|
+
|
|
8
|
+
## Workflow
|
|
9
|
+
|
|
10
|
+
1. Edit **`storefront/pages.config.json`** (add/remove/reorder segments).
|
|
11
|
+
2. Run **`npm run storefront:build`** in `storefront/` (or `npm run dev:storefront`).
|
|
12
|
+
3. `storefront-build` writes filtered schema here based on segments + workflows in use.
|
|
13
|
+
4. Restart Medusa backend so Admin picks up schema changes.
|
|
14
|
+
|
|
15
|
+
Optional manual refresh of defaults only:
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
cd backend && npm run dynamic-config:defaults
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Runtime content is edited in **Medusa Admin** (Dynamic Config). The storefront loads values via `GET /store/dynamic-config`.
|
|
22
|
+
|
|
23
|
+
Override entire schema: add `storefront/dynamic-config.schema.json` (see framework docs).
|