@pradip1995/create-storefront-app 0.2.3 → 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.
Files changed (48) hide show
  1. package/bin/create-storefront-app.js +141 -59
  2. package/lib/build-backend-package.js +54 -0
  3. package/lib/build-homepage-defaults.cjs +50 -0
  4. package/lib/deps.js +3 -1
  5. package/lib/docker-template-vars.js +32 -0
  6. package/lib/medusa-plugin-versions.json +55 -0
  7. package/lib/scaffold-backend.js +107 -0
  8. package/lib/scaffold-docker.js +82 -0
  9. package/lib/versions.js +4 -3
  10. package/package.json +3 -2
  11. package/templates/backend/.cursor/commands/seed-backend.md +16 -0
  12. package/templates/backend/.cursor/rules/medusa-backend.mdc +55 -0
  13. package/templates/backend/config/README.md +21 -0
  14. package/templates/backend/config/homepage-config.json +568 -0
  15. package/templates/backend/env.template +53 -0
  16. package/templates/backend/gitignore +8 -0
  17. package/templates/backend/medusa-config.full.ts +251 -0
  18. package/templates/backend/medusa-config.minimal.ts +141 -0
  19. package/templates/backend/scripts/build-dynamic-config-defaults.mjs +25 -0
  20. package/templates/backend/scripts/build-homepage-defaults.cjs +50 -0
  21. package/templates/backend/src/config/product-metadata-descriptors.ts +27 -0
  22. package/templates/backend/src/scripts/seed.ts +212 -0
  23. package/templates/backend/tsconfig.json +24 -0
  24. package/templates/docker/Makefile +86 -0
  25. package/templates/docker/backend/.dockerignore +8 -0
  26. package/templates/docker/backend/Dockerfile +30 -0
  27. package/templates/docker/data/README.md +12 -0
  28. package/templates/docker/data/dump.sql +3 -0
  29. package/templates/docker/docker/.env.example +36 -0
  30. package/templates/docker/docker/frontend.build.defaults +7 -0
  31. package/templates/docker/docker/gitignore +1 -0
  32. package/templates/docker/docker/postgres/01-create-postgres-role.sql +9 -0
  33. package/templates/docker/docker/postgres/docker-entrypoint-wrapper.sh +49 -0
  34. package/templates/docker/docker-compose.infra.yml +64 -0
  35. package/templates/docker/docker-compose.yml +138 -0
  36. package/templates/docker/storefront/.dockerignore +9 -0
  37. package/templates/docker/storefront/Dockerfile +53 -0
  38. package/templates/root/.cursor/commands/docker-dev.md +32 -0
  39. package/templates/root/.cursor/rules/monorepo-layout.mdc +55 -0
  40. package/templates/shared/.cursor/commands/change-theme-colors.md +1 -1
  41. package/templates/shared/.cursor/commands/fix-segment-issue.md +2 -2
  42. package/templates/shared/.cursor/commands/rebuild-storefront.md +1 -1
  43. package/templates/shared/.cursor/rules/customize-theme.mdc +1 -1
  44. package/templates/shared/.cursor/rules/storefront-architecture.mdc +3 -2
  45. package/templates/shared/.cursor/skills/fix-segment-issues/SKILL.md +1 -1
  46. package/templates/shared/README.md +100 -0
  47. package/templates/shared/root-gitignore +6 -0
  48. 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.0"
3
- export const FRAMEWORK_VERSION = "^0.2.0"
4
- export const COMPONENTS_VERSION = "^0.2.0"
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.2.3",
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`.