@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.
Files changed (50) hide show
  1. package/bin/create-storefront-app.js +147 -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 +21 -0
  12. package/templates/backend/.cursor/rules/medusa-backend.mdc +54 -0
  13. package/templates/backend/config/README.md +23 -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 +210 -0
  23. package/templates/backend/tsconfig.json +24 -0
  24. package/templates/docker/Makefile +88 -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 +27 -0
  39. package/templates/root/.cursor/rules/monorepo-layout.mdc +55 -0
  40. package/templates/root/scripts/sync-publishable-key.mjs +108 -0
  41. package/templates/shared/.cursor/commands/change-theme-colors.md +1 -1
  42. package/templates/shared/.cursor/commands/fix-segment-issue.md +2 -2
  43. package/templates/shared/.cursor/commands/rebuild-storefront.md +1 -1
  44. package/templates/shared/.cursor/rules/customize-sections.mdc +7 -1
  45. package/templates/shared/.cursor/rules/customize-theme.mdc +1 -1
  46. package/templates/shared/.cursor/rules/storefront-architecture.mdc +3 -2
  47. package/templates/shared/.cursor/skills/fix-segment-issues/SKILL.md +1 -1
  48. package/templates/shared/README.md +100 -0
  49. package/templates/shared/root-gitignore +6 -0
  50. 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.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.2.3",
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).