@pradip1995/create-storefront-app 0.2.2 → 0.3.0
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 +149 -53
- 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 +16 -0
- package/templates/backend/.cursor/rules/medusa-backend.mdc +55 -0
- package/templates/backend/config/README.md +21 -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 +212 -0
- package/templates/backend/tsconfig.json +24 -0
- package/templates/docker/Makefile +86 -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 +32 -0
- package/templates/root/.cursor/rules/monorepo-layout.mdc +55 -0
- package/templates/shared/.cursor/commands/change-theme-colors.md +28 -0
- package/templates/shared/.cursor/commands/fix-segment-issue.md +56 -0
- package/templates/shared/.cursor/commands/rebuild-storefront.md +19 -0
- package/templates/shared/.cursor/commands/update-home-sections.md +50 -0
- package/templates/shared/.cursor/rules/customize-sections.mdc +49 -0
- package/templates/shared/.cursor/rules/customize-theme.mdc +57 -0
- package/templates/shared/.cursor/rules/storefront-architecture.mdc +41 -0
- package/templates/shared/.cursor/skills/customize-storefront-theme/SKILL.md +47 -0
- package/templates/shared/.cursor/skills/fix-segment-issues/SKILL.md +68 -0
- package/templates/shared/.cursor/skills/update-storefront-sections/SKILL.md +52 -0
- package/templates/shared/README.md +100 -0
- package/templates/shared/root-gitignore +6 -0
- package/templates/shared/storefront-only-README.md +25 -0
- package/templates/shared/theme-overrides.css +16 -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.4"
|
|
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.0",
|
|
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,16 @@
|
|
|
1
|
+
# Seed Medusa backend
|
|
2
|
+
|
|
3
|
+
From project root:
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
cd backend
|
|
7
|
+
npm run seed
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
Requires PostgreSQL running and `DATABASE_URL` set in `backend/.env`.
|
|
11
|
+
|
|
12
|
+
After seed:
|
|
13
|
+
|
|
14
|
+
1. Start backend: `npm run dev`
|
|
15
|
+
2. Copy publishable API key from Admin into `storefront/.env.local`
|
|
16
|
+
3. Start storefront: `cd ../storefront && npm run dev`
|
|
@@ -0,0 +1,55 @@
|
|
|
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 (sync with storefront build) |
|
|
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
|
+
1. Open Medusa Admin → Settings → Publishable API Keys
|
|
35
|
+
2. Copy token into `storefront/.env.local` as `NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY`
|
|
36
|
+
|
|
37
|
+
## Plugin versions
|
|
38
|
+
|
|
39
|
+
Edit `config/medusa-plugin-versions.json`, then update `package.json` dependencies to match and run `npm install`.
|
|
40
|
+
|
|
41
|
+
## CORS
|
|
42
|
+
|
|
43
|
+
`STORE_CORS` and `AUTH_CORS` must include the storefront URL (`STOREFRONT_URL`).
|
|
44
|
+
|
|
45
|
+
## Dynamic config
|
|
46
|
+
|
|
47
|
+
Homepage fields in Admin come from `config/homepage-config.json` (registered in `medusa-config.ts`).
|
|
48
|
+
|
|
49
|
+
After editing the schema, run:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
npm run dynamic-config:defaults
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
The storefront reads **runtime values** from `GET /store/dynamic-config` — it does not generate or import schema files.
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# Dynamic config (backend)
|
|
2
|
+
|
|
3
|
+
| File | Purpose |
|
|
4
|
+
|------|---------|
|
|
5
|
+
| `homepage-config.json` | **Schema** — field definitions for Medusa Admin (`medusa-plugin-dynamic-config`) |
|
|
6
|
+
| `homepage-config.defaults.json` | **Default values** extracted from schema `defaultValue` fields (reference + bootstrap) |
|
|
7
|
+
|
|
8
|
+
## Workflow
|
|
9
|
+
|
|
10
|
+
1. Edit `homepage-config.json` when adding/removing admin fields.
|
|
11
|
+
2. Run `npm run dynamic-config:defaults` to refresh default values.
|
|
12
|
+
3. Restart backend — schema is loaded from `medusa-config.ts`.
|
|
13
|
+
4. Set live content in **Medusa Admin** (Dynamic Config).
|
|
14
|
+
|
|
15
|
+
The **storefront does not copy this schema**. It reads runtime values from:
|
|
16
|
+
|
|
17
|
+
```
|
|
18
|
+
GET /store/dynamic-config
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Configure values in Admin after `npm run seed`.
|