@vendure-platform/create 0.1.0 → 0.2.1-nightly.202605190703
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/README.md +37 -27
- package/dist/assets/storefront/.env.example +14 -14
- package/dist/assets/storefront/messages/de.json +2 -3
- package/dist/assets/storefront/messages/en.json +2 -3
- package/dist/assets/storefront/next.config.ts +22 -21
- package/dist/assets/storefront/package.json +75 -75
- package/dist/assets/storefront/public/scenarios/customer/logo.svg +4 -0
- package/dist/assets/storefront/src/app/[locale]/layout.tsx +0 -4
- package/dist/assets/storefront/src/app/[locale]/sign-in/login-form.tsx +70 -102
- package/dist/assets/storefront/src/app/[locale]/sign-in/page.tsx +2 -3
- package/dist/assets/storefront/src/config/scenario-meta.ts +3 -7
- package/dist/assets/storefront/src/config/scenario.ts +14 -30
- package/dist/assets/storefront/src/graphql-env.d.ts +456 -0
- package/dist/assets/storefront/src/scenarios/customer/branding.ts +142 -0
- package/dist/assets/storefront/src/scenarios/customer/hero.tsx +76 -0
- package/dist/assets/storefront/src/scenarios/{default → customer}/index.ts +3 -3
- package/dist/assets/storefront/src/scenarios/{default → customer}/meta.ts +1 -1
- package/dist/assets/storefront/src/schema.graphql +5852 -0
- package/dist/assets/storefront/tsconfig.json +17 -8
- package/dist/assets/templates/README.md.hbs +1 -1
- package/dist/assets/templates/docker-compose.yml.hbs +0 -4
- package/dist/assets/templates/env.hbs +13 -7
- package/dist/assets/templates/environment.d.ts.hbs +1 -5
- package/dist/assets/templates/npmrc.hbs +1 -1
- package/dist/assets/templates/populate.ts.hbs +17 -0
- package/dist/assets/templates/server-package.json.hbs +3 -2
- package/dist/bin/run.js +17 -3
- package/dist/bin/run.js.map +1 -1
- package/dist/cli.d.ts +6 -1
- package/dist/cli.js +147 -25
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.js +9 -3
- package/dist/index.js.map +1 -1
- package/dist/plugin-registry.d.ts +43 -6
- package/dist/plugin-registry.js +139 -421
- package/dist/plugin-registry.js.map +1 -1
- package/dist/registry.d.ts +18 -0
- package/dist/registry.js +29 -0
- package/dist/registry.js.map +1 -0
- package/dist/scaffold-shared.d.ts +19 -0
- package/dist/scaffold-shared.js +114 -0
- package/dist/scaffold-shared.js.map +1 -0
- package/dist/scaffold-storefront-only.d.ts +6 -0
- package/dist/scaffold-storefront-only.js +101 -0
- package/dist/scaffold-storefront-only.js.map +1 -0
- package/dist/scaffolder.js +22 -42
- package/dist/scaffolder.js.map +1 -1
- package/dist/storefront-copier.d.ts +26 -3
- package/dist/storefront-copier.js +63 -12
- package/dist/storefront-copier.js.map +1 -1
- package/dist/template-renderer.d.ts +24 -7
- package/dist/template-renderer.js +32 -64
- package/dist/template-renderer.js.map +1 -1
- package/dist/types.d.ts +46 -27
- package/package.json +3 -1
- package/dist/assets/storefront/.env.local +0 -1
- package/dist/assets/storefront/public/scenarios/b2b-wholesale/hero/hero-bg.webp +0 -0
- package/dist/assets/storefront/public/scenarios/b2b-wholesale/logo.svg +0 -4
- package/dist/assets/storefront/public/scenarios/default/logo.svg +0 -4
- package/dist/assets/storefront/public/scenarios/kaminpro/hero/hero-bg.webp +0 -0
- package/dist/assets/storefront/public/scenarios/kaminpro/logo.svg +0 -7
- package/dist/assets/storefront/src/components/shared/scenario-paused.tsx +0 -80
- package/dist/assets/storefront/src/scenarios/b2b-wholesale/branding.ts +0 -180
- package/dist/assets/storefront/src/scenarios/b2b-wholesale/hero.tsx +0 -122
- package/dist/assets/storefront/src/scenarios/b2b-wholesale/index.ts +0 -21
- package/dist/assets/storefront/src/scenarios/b2b-wholesale/meta.ts +0 -3
- package/dist/assets/storefront/src/scenarios/default/branding.ts +0 -148
- package/dist/assets/storefront/src/scenarios/default/hero.tsx +0 -107
- package/dist/assets/storefront/src/scenarios/kaminpro/auth-gate.tsx +0 -36
- package/dist/assets/storefront/src/scenarios/kaminpro/branding.ts +0 -238
- package/dist/assets/storefront/src/scenarios/kaminpro/cart-items.tsx +0 -359
- package/dist/assets/storefront/src/scenarios/kaminpro/hero.tsx +0 -123
- package/dist/assets/storefront/src/scenarios/kaminpro/index.ts +0 -50
- package/dist/assets/storefront/src/scenarios/kaminpro/meta.ts +0 -9
- package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/banners.tsx +0 -21
- package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/bom-basket.tsx +0 -221
- package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/btn.tsx +0 -38
- package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/chip.tsx +0 -35
- package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/config-header.tsx +0 -72
- package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/field-row.tsx +0 -126
- package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/info-dot.tsx +0 -38
- package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/login-notice.tsx +0 -81
- package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/module-panel.tsx +0 -144
- package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/quote-dialog.tsx +0 -110
- package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/schematic.tsx +0 -674
- package/dist/assets/storefront/src/scenarios/kaminpro/pdp/components/why-panel.tsx +0 -66
- package/dist/assets/storefront/src/scenarios/kaminpro/pdp/configurator-pdp.tsx +0 -43
- package/dist/assets/storefront/src/scenarios/kaminpro/pdp/configurator-shell.tsx +0 -320
- package/dist/assets/storefront/src/scenarios/kaminpro/pdp/lib/data.ts +0 -150
- package/dist/assets/storefront/src/scenarios/kaminpro/pdp/lib/types.ts +0 -30
- package/dist/assets/storefront/src/scenarios/kaminpro/pdp/styles.css +0 -104
- package/dist/assets/storefront/src/scenarios/kaminpro/shop-by-system.tsx +0 -97
- package/dist/assets/storefront/src/scenarios/kaminpro/system-finder/decision-tree.ts +0 -261
- package/dist/assets/storefront/src/scenarios/kaminpro/system-finder/page.tsx +0 -21
- package/dist/assets/storefront/src/scenarios/kaminpro/system-finder/wizard.tsx +0 -600
- package/dist/assets/storefront/src/schema.graphql.placeholder +0 -5
package/dist/registry.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Single source of truth for the @vendure-platform private registry URL.
|
|
4
|
+
*
|
|
5
|
+
* The URL appears in three places at scaffold time:
|
|
6
|
+
* - the project-root `.npmrc` scope mapping (via the `npmrc.hbs` template)
|
|
7
|
+
* - the storefront `.npmrc` scope mapping (written by `storefront-copier`)
|
|
8
|
+
* - the actionable 401 message in `scaffold-shared.ts` (login command +
|
|
9
|
+
* regex that fingerprints private-registry failures in stderr)
|
|
10
|
+
*
|
|
11
|
+
* Keeping the URL in one place means the next registry rename is a single-
|
|
12
|
+
* file edit. The `VENDURE_REGISTRY_URL` override is intended for local
|
|
13
|
+
* Verdaccio testing — set it before invoking the create CLI to scaffold a
|
|
14
|
+
* project pointed at a local registry without needing to patch the template
|
|
15
|
+
* post-scaffold.
|
|
16
|
+
*/
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
exports.DEFAULT_REGISTRY_URL = void 0;
|
|
19
|
+
exports.getRegistryUrl = getRegistryUrl;
|
|
20
|
+
exports.getRegistryHostname = getRegistryHostname;
|
|
21
|
+
exports.DEFAULT_REGISTRY_URL = 'https://registry.platform.vendure.io/';
|
|
22
|
+
function getRegistryUrl() {
|
|
23
|
+
var _a;
|
|
24
|
+
return (_a = process.env.VENDURE_REGISTRY_URL) !== null && _a !== void 0 ? _a : exports.DEFAULT_REGISTRY_URL;
|
|
25
|
+
}
|
|
26
|
+
function getRegistryHostname() {
|
|
27
|
+
return new URL(getRegistryUrl()).hostname;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;GAcG;;;AAIH,wCAEC;AAED,kDAEC;AARY,QAAA,oBAAoB,GAAG,uCAAuC,CAAC;AAE5E,SAAgB,cAAc;;IAC1B,OAAO,MAAA,OAAO,CAAC,GAAG,CAAC,oBAAoB,mCAAI,4BAAoB,CAAC;AACpE,CAAC;AAED,SAAgB,mBAAmB;IAC/B,OAAO,IAAI,GAAG,CAAC,cAAc,EAAE,CAAC,CAAC,QAAQ,CAAC;AAC9C,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import * as p from '@clack/prompts';
|
|
2
|
+
import { PackageManager } from './types';
|
|
3
|
+
type Spinner = ReturnType<typeof p.spinner>;
|
|
4
|
+
/**
|
|
5
|
+
* Run the package manager's install step inside the scaffolded project.
|
|
6
|
+
* Logs the last few lines of stderr on failure but never throws — install
|
|
7
|
+
* failures are reported as a warning so the customer can retry manually.
|
|
8
|
+
*
|
|
9
|
+
* Special-cases the private-registry 401 because that's the most common
|
|
10
|
+
* first-time failure and the generic "run install manually" message gives
|
|
11
|
+
* no clue about where to look.
|
|
12
|
+
*/
|
|
13
|
+
export declare function installDependencies(projectDir: string, packageManager: PackageManager, spinner: Spinner): Promise<void>;
|
|
14
|
+
/**
|
|
15
|
+
* Initialise a git repo in the scaffolded project, optionally pushing to a
|
|
16
|
+
* fresh GitHub repo. Never throws — git/gh failures are reported as a warning.
|
|
17
|
+
*/
|
|
18
|
+
export declare function initRepository(projectDir: string, createGithubRepo: boolean, githubOrg: string | undefined, spinner: Spinner): Promise<void>;
|
|
19
|
+
export {};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.installDependencies = installDependencies;
|
|
37
|
+
exports.initRepository = initRepository;
|
|
38
|
+
const p = __importStar(require("@clack/prompts"));
|
|
39
|
+
const child_process_1 = require("child_process");
|
|
40
|
+
const util_1 = require("util");
|
|
41
|
+
const git_init_1 = require("./git-init");
|
|
42
|
+
const registry_1 = require("./registry");
|
|
43
|
+
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
44
|
+
/**
|
|
45
|
+
* Run the package manager's install step inside the scaffolded project.
|
|
46
|
+
* Logs the last few lines of stderr on failure but never throws — install
|
|
47
|
+
* failures are reported as a warning so the customer can retry manually.
|
|
48
|
+
*
|
|
49
|
+
* Special-cases the private-registry 401 because that's the most common
|
|
50
|
+
* first-time failure and the generic "run install manually" message gives
|
|
51
|
+
* no clue about where to look.
|
|
52
|
+
*/
|
|
53
|
+
async function installDependencies(projectDir, packageManager, spinner) {
|
|
54
|
+
var _a;
|
|
55
|
+
spinner.message(`Installing dependencies with ${packageManager} (this may take a few minutes)...`);
|
|
56
|
+
try {
|
|
57
|
+
await execAsync(`${packageManager} install`, { cwd: projectDir });
|
|
58
|
+
}
|
|
59
|
+
catch (err) {
|
|
60
|
+
spinner.stop(`${packageManager} install failed.`);
|
|
61
|
+
const stderr = err instanceof Error && 'stderr' in err
|
|
62
|
+
? (_a = err.stderr) === null || _a === void 0 ? void 0 : _a.trim()
|
|
63
|
+
: undefined;
|
|
64
|
+
if (stderr) {
|
|
65
|
+
p.log.error(stderr.split('\n').slice(-5).join('\n'));
|
|
66
|
+
}
|
|
67
|
+
if (stderr && isRegistryAuthFailure(stderr)) {
|
|
68
|
+
p.log.warn(registryAuthFailureMessage(packageManager, projectDir));
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
p.log.warn(`Dependency install failed — run \`${packageManager} install\` manually in the project directory.`);
|
|
72
|
+
}
|
|
73
|
+
spinner.start('Continuing...');
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
function isRegistryAuthFailure(stderr) {
|
|
77
|
+
const hostnamePattern = (0, registry_1.getRegistryHostname)().replace(/\./g, '\\.');
|
|
78
|
+
return new RegExp(`\\bE401\\b|401 Unauthorized|${hostnamePattern}`, 'i').test(stderr);
|
|
79
|
+
}
|
|
80
|
+
function registryAuthFailureMessage(packageManager, projectDir) {
|
|
81
|
+
// `npm login` accepts the URL with or without a trailing slash; strip it
|
|
82
|
+
// for the user-facing copy so the command looks tidy.
|
|
83
|
+
const loginUrl = (0, registry_1.getRegistryUrl)().replace(/\/+$/, '');
|
|
84
|
+
return [
|
|
85
|
+
'Install failed: not authenticated to the Vendure private registry',
|
|
86
|
+
'(or your existing token has expired).',
|
|
87
|
+
'',
|
|
88
|
+
'To authenticate (or re-authenticate), run:',
|
|
89
|
+
` npm login --auth-type=web --registry=${loginUrl}`,
|
|
90
|
+
'',
|
|
91
|
+
'Setup guide: https://portal.vendure.io/getting-started',
|
|
92
|
+
'',
|
|
93
|
+
`Then re-run \`${packageManager} install\` in ${projectDir}.`,
|
|
94
|
+
].join('\n');
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Initialise a git repo in the scaffolded project, optionally pushing to a
|
|
98
|
+
* fresh GitHub repo. Never throws — git/gh failures are reported as a warning.
|
|
99
|
+
*/
|
|
100
|
+
async function initRepository(projectDir, createGithubRepo, githubOrg, spinner) {
|
|
101
|
+
spinner.message('Initializing git...');
|
|
102
|
+
try {
|
|
103
|
+
await (0, git_init_1.initGit)(projectDir, createGithubRepo, githubOrg);
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
spinner.stop('Git setup had issues.');
|
|
107
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
108
|
+
p.log.warn(createGithubRepo
|
|
109
|
+
? `Git/GitHub setup had issues — make sure the gh CLI is installed and authenticated. (${message})`
|
|
110
|
+
: `Git init had issues — initialise the repo manually if needed. (${message})`);
|
|
111
|
+
spinner.start('Continuing...');
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=scaffold-shared.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold-shared.js","sourceRoot":"","sources":["../src/scaffold-shared.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { StorefrontOnlyOptions } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Scaffold a standalone Vendure storefront pointed at an external Shop API.
|
|
4
|
+
* No server, no plugins, no demo data — just the Next.js storefront.
|
|
5
|
+
*/
|
|
6
|
+
export declare function scaffoldStorefrontOnly(options: StorefrontOnlyOptions): Promise<void>;
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.scaffoldStorefrontOnly = scaffoldStorefrontOnly;
|
|
37
|
+
const fs = __importStar(require("fs-extra"));
|
|
38
|
+
const path = __importStar(require("path"));
|
|
39
|
+
const p = __importStar(require("@clack/prompts"));
|
|
40
|
+
const storefront_copier_1 = require("./storefront-copier");
|
|
41
|
+
const scaffold_shared_1 = require("./scaffold-shared");
|
|
42
|
+
/**
|
|
43
|
+
* Scaffold a standalone Vendure storefront pointed at an external Shop API.
|
|
44
|
+
* No server, no plugins, no demo data — just the Next.js storefront.
|
|
45
|
+
*/
|
|
46
|
+
async function scaffoldStorefrontOnly(options) {
|
|
47
|
+
const { projectName, apiUrl, scenario, packageManager, skipInstall, skipGit, dryRun } = options;
|
|
48
|
+
const projectDir = path.resolve(process.cwd(), projectName);
|
|
49
|
+
if (await fs.pathExists(projectDir)) {
|
|
50
|
+
const entries = await fs.readdir(projectDir);
|
|
51
|
+
if (entries.length > 0) {
|
|
52
|
+
p.log.error(`Directory "${projectDir}" already exists and is not empty.`);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
if (dryRun) {
|
|
57
|
+
const summary = [
|
|
58
|
+
`Project: ${projectName} → ${projectDir}`,
|
|
59
|
+
'',
|
|
60
|
+
`Mode: storefront-only`,
|
|
61
|
+
`Scenario: ${scenario}`,
|
|
62
|
+
`API URL: ${apiUrl !== null && apiUrl !== void 0 ? apiUrl : '(use default localhost)'}`,
|
|
63
|
+
`Package manager: ${packageManager}`,
|
|
64
|
+
`Install deps: ${skipInstall ? 'no' : 'yes'}`,
|
|
65
|
+
`Git init: ${skipGit ? 'no' : 'yes'}`,
|
|
66
|
+
].join('\n');
|
|
67
|
+
p.note(summary, 'Dry run');
|
|
68
|
+
p.outro('Dry run complete — no files written.');
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const s = p.spinner();
|
|
72
|
+
s.start('Creating project directory...');
|
|
73
|
+
await fs.ensureDir(projectDir);
|
|
74
|
+
s.message('Copying storefront...');
|
|
75
|
+
await (0, storefront_copier_1.copyStorefront)(projectDir, {
|
|
76
|
+
mode: 'storefront-only',
|
|
77
|
+
scenario,
|
|
78
|
+
apiUrl,
|
|
79
|
+
packageName: projectName,
|
|
80
|
+
});
|
|
81
|
+
if (!skipInstall) {
|
|
82
|
+
await (0, scaffold_shared_1.installDependencies)(projectDir, packageManager, s);
|
|
83
|
+
}
|
|
84
|
+
if (!skipGit) {
|
|
85
|
+
await (0, scaffold_shared_1.initRepository)(projectDir, false, undefined, s);
|
|
86
|
+
}
|
|
87
|
+
s.stop(`Project "${projectName}" created successfully!`);
|
|
88
|
+
const devCommand = packageManager === 'npm' ? 'npm run dev' : `${packageManager} run dev`;
|
|
89
|
+
const steps = [
|
|
90
|
+
`cd ${projectName}`,
|
|
91
|
+
apiUrl
|
|
92
|
+
? `# .env.local already points VENDURE_SHOP_API_URL at ${apiUrl}`
|
|
93
|
+
: '# Edit .env.local and set VENDURE_SHOP_API_URL to your Vendure server',
|
|
94
|
+
devCommand,
|
|
95
|
+
'',
|
|
96
|
+
'Storefront: http://localhost:${STOREFRONT_PORT:-3001}',
|
|
97
|
+
].join('\n');
|
|
98
|
+
p.note(steps, 'Next steps');
|
|
99
|
+
p.outro('Happy building!');
|
|
100
|
+
}
|
|
101
|
+
//# sourceMappingURL=scaffold-storefront-only.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold-storefront-only.js","sourceRoot":"","sources":["../src/scaffold-storefront-only.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,wDA+DC;AA3ED,6CAA+B;AAC/B,2CAA6B;AAC7B,kDAAoC;AAGpC,2DAAqD;AACrD,uDAAwE;AAExE;;;GAGG;AACI,KAAK,UAAU,sBAAsB,CAAC,OAA8B;IACvE,MAAM,EAAE,WAAW,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAChG,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,WAAW,CAAC,CAAC;IAE5D,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC7C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,cAAc,UAAU,oCAAoC,CAAC,CAAC;YAC1E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,CAAC;IACL,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACT,MAAM,OAAO,GAAG;YACZ,YAAY,WAAW,MAAM,UAAU,EAAE;YACzC,EAAE;YACF,uBAAuB;YACvB,aAAa,QAAQ,EAAE;YACvB,YAAY,MAAM,aAAN,MAAM,cAAN,MAAM,GAAI,yBAAyB,EAAE;YACjD,oBAAoB,cAAc,EAAE;YACpC,iBAAiB,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE;YAC7C,aAAa,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE;SACxC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC3B,CAAC,CAAC,KAAK,CAAC,sCAAsC,CAAC,CAAC;QAChD,OAAO;IACX,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IACtB,CAAC,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACzC,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;IAE/B,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACnC,MAAM,IAAA,kCAAc,EAAC,UAAU,EAAE;QAC7B,IAAI,EAAE,iBAAiB;QACvB,QAAQ;QACR,MAAM;QACN,WAAW,EAAE,WAAW;KAC3B,CAAC,CAAC;IAEH,IAAI,CAAC,WAAW,EAAE,CAAC;QACf,MAAM,IAAA,qCAAmB,EAAC,UAAU,EAAE,cAAc,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,MAAM,IAAA,gCAAc,EAAC,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,CAAC,CAAC,IAAI,CAAC,YAAY,WAAW,yBAAyB,CAAC,CAAC;IAEzD,MAAM,UAAU,GAAG,cAAc,KAAK,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,cAAc,UAAU,CAAC;IAC1F,MAAM,KAAK,GAAG;QACV,MAAM,WAAW,EAAE;QACnB,MAAM;YACF,CAAC,CAAC,uDAAuD,MAAM,EAAE;YACjE,CAAC,CAAC,uEAAuE;QAC7E,UAAU;QACV,EAAE;QACF,uDAAuD;KAC1D,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;IAC5B,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;AAC/B,CAAC"}
|
package/dist/scaffolder.js
CHANGED
|
@@ -41,10 +41,7 @@ const p = __importStar(require("@clack/prompts"));
|
|
|
41
41
|
const plugin_registry_1 = require("./plugin-registry");
|
|
42
42
|
const template_renderer_1 = require("./template-renderer");
|
|
43
43
|
const storefront_copier_1 = require("./storefront-copier");
|
|
44
|
-
const
|
|
45
|
-
const child_process_1 = require("child_process");
|
|
46
|
-
const util_1 = require("util");
|
|
47
|
-
const execAsync = (0, util_1.promisify)(child_process_1.exec);
|
|
44
|
+
const scaffold_shared_1 = require("./scaffold-shared");
|
|
48
45
|
/** Template-to-output mapping used by the scaffolder. */
|
|
49
46
|
exports.TEMPLATE_FILES = [
|
|
50
47
|
{ template: 'vendure-config.ts.hbs', output: 'server/src/vendure-config.ts' },
|
|
@@ -69,14 +66,13 @@ exports.TEMPLATE_FILES = [
|
|
|
69
66
|
* Scaffold a complete Vendure demo project.
|
|
70
67
|
*/
|
|
71
68
|
async function scaffold(options) {
|
|
72
|
-
|
|
73
|
-
const { projectName, companyName, selectedPlugins, includeStorefront, createGithubRepo, githubOrg, skipInstall, skipGit, dryRun } = options;
|
|
69
|
+
const { projectName, companyName, selectedPlugins, includeStorefront, createGithubRepo, githubOrg, packageManager = 'bun', skipInstall, skipGit, dryRun } = options;
|
|
74
70
|
const projectDir = path.resolve(process.cwd(), projectName);
|
|
75
|
-
// 1. Resolve
|
|
76
|
-
const resolvedPluginKeys = (0, plugin_registry_1.
|
|
77
|
-
const
|
|
78
|
-
if (
|
|
79
|
-
p.log.
|
|
71
|
+
// 1. Resolve active plugins (always-on core + user-selected)
|
|
72
|
+
const resolvedPluginKeys = (0, plugin_registry_1.resolveActivePluginKeys)(selectedPlugins);
|
|
73
|
+
const alwaysOnNames = plugin_registry_1.ALWAYS_ACTIVE_KEYS.map((k) => (0, plugin_registry_1.getPlugin)(k).displayName);
|
|
74
|
+
if (alwaysOnNames.length > 0) {
|
|
75
|
+
p.log.info(`Always-on core plugins: ${alwaysOnNames.join(', ')}`);
|
|
80
76
|
}
|
|
81
77
|
// 2. Create project directory (abort if it already has content)
|
|
82
78
|
if (await fs.pathExists(projectDir)) {
|
|
@@ -88,7 +84,7 @@ async function scaffold(options) {
|
|
|
88
84
|
}
|
|
89
85
|
// Dry-run: print summary and exit without writing anything
|
|
90
86
|
if (dryRun) {
|
|
91
|
-
const resolvedPlugins = resolvedPluginKeys.map((k) =>
|
|
87
|
+
const resolvedPlugins = resolvedPluginKeys.map((k) => (0, plugin_registry_1.getPlugin)(k).displayName);
|
|
92
88
|
const fileList = exports.TEMPLATE_FILES.map((f) => ` ${f.output}`).join('\n');
|
|
93
89
|
const demoDataFiles = [
|
|
94
90
|
' server/src/demo-data/products.csv',
|
|
@@ -107,7 +103,7 @@ async function scaffold(options) {
|
|
|
107
103
|
` ${resolvedPlugins.join(', ')}`,
|
|
108
104
|
'',
|
|
109
105
|
`Storefront: ${includeStorefront ? 'yes' : 'no'}`,
|
|
110
|
-
`
|
|
106
|
+
`Install deps with ${packageManager}: ${skipInstall ? 'no' : 'yes'}`,
|
|
111
107
|
`Git init: ${skipGit ? 'no' : 'yes'}`,
|
|
112
108
|
`GitHub repo: ${createGithubRepo ? 'yes' : 'no'}`,
|
|
113
109
|
].join('\n');
|
|
@@ -119,7 +115,7 @@ async function scaffold(options) {
|
|
|
119
115
|
s.start('Creating project directory...');
|
|
120
116
|
await fs.ensureDir(projectDir);
|
|
121
117
|
// 3. Build template context
|
|
122
|
-
const { context, hbs } = (0, template_renderer_1.buildTemplateContext)(projectName, companyName,
|
|
118
|
+
const { context, hbs } = (0, template_renderer_1.buildTemplateContext)(projectName, companyName, selectedPlugins, includeStorefront);
|
|
123
119
|
// 4. Render and write server files
|
|
124
120
|
s.message('Generating server files...');
|
|
125
121
|
const serverDir = path.join(projectDir, 'server');
|
|
@@ -141,51 +137,35 @@ async function scaffold(options) {
|
|
|
141
137
|
if (includeStorefront) {
|
|
142
138
|
s.message('Copying storefront...');
|
|
143
139
|
try {
|
|
144
|
-
await (0, storefront_copier_1.copyStorefront)(projectDir
|
|
140
|
+
await (0, storefront_copier_1.copyStorefront)(projectDir, {
|
|
141
|
+
mode: 'full-project',
|
|
142
|
+
scenario: 'default',
|
|
143
|
+
packageName: `${projectName}-storefront`,
|
|
144
|
+
});
|
|
145
145
|
}
|
|
146
146
|
catch (err) {
|
|
147
147
|
s.stop('Storefront copy failed.');
|
|
148
|
-
|
|
148
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
149
|
+
p.log.warn(`Storefront copy failed — you can set it up manually later. (${message})`);
|
|
149
150
|
s.start('Continuing...');
|
|
150
151
|
}
|
|
151
152
|
}
|
|
152
153
|
// 8. Install dependencies
|
|
153
154
|
if (!skipInstall) {
|
|
154
|
-
|
|
155
|
-
try {
|
|
156
|
-
await execAsync('npm install', { cwd: projectDir });
|
|
157
|
-
}
|
|
158
|
-
catch (err) {
|
|
159
|
-
s.stop('npm install failed.');
|
|
160
|
-
const stderr = err instanceof Error && 'stderr' in err
|
|
161
|
-
? (_a = err.stderr) === null || _a === void 0 ? void 0 : _a.trim()
|
|
162
|
-
: undefined;
|
|
163
|
-
if (stderr) {
|
|
164
|
-
p.log.error(stderr.split('\n').slice(-5).join('\n'));
|
|
165
|
-
}
|
|
166
|
-
p.log.warn('npm install failed — run `npm install` manually in the project directory.');
|
|
167
|
-
s.start('Continuing...');
|
|
168
|
-
}
|
|
155
|
+
await (0, scaffold_shared_1.installDependencies)(projectDir, packageManager, s);
|
|
169
156
|
}
|
|
170
157
|
// 9. Git init + GitHub repo
|
|
171
158
|
if (!skipGit) {
|
|
172
|
-
|
|
173
|
-
try {
|
|
174
|
-
await (0, git_init_1.initGit)(projectDir, createGithubRepo, githubOrg);
|
|
175
|
-
}
|
|
176
|
-
catch {
|
|
177
|
-
s.stop('Git setup had issues.');
|
|
178
|
-
p.log.warn('Git/GitHub setup had issues. Make sure the gh CLI is installed and authenticated.');
|
|
179
|
-
s.start('Continuing...');
|
|
180
|
-
}
|
|
159
|
+
await (0, scaffold_shared_1.initRepository)(projectDir, createGithubRepo, githubOrg, s);
|
|
181
160
|
}
|
|
182
161
|
s.stop(`Project "${projectName}" created successfully!`);
|
|
183
162
|
// 10. Print next steps
|
|
163
|
+
const runPrefix = packageManager === 'npm' ? 'npm run' : `${packageManager} run`;
|
|
184
164
|
const steps = [
|
|
185
165
|
`cd ${projectName}`,
|
|
186
166
|
'docker compose up -d',
|
|
187
|
-
|
|
188
|
-
|
|
167
|
+
`${runPrefix} populate`,
|
|
168
|
+
`${runPrefix} dev`,
|
|
189
169
|
'',
|
|
190
170
|
`Dashboard: http://localhost:3500/dashboard`,
|
|
191
171
|
includeStorefront ? `Storefront: http://localhost:3001` : '',
|
package/dist/scaffolder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"scaffolder.js","sourceRoot":"","sources":["../src/scaffolder.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"scaffolder.js","sourceRoot":"","sources":["../src/scaffolder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,29 @@
|
|
|
1
|
+
export type StorefrontMode = 'full-project' | 'storefront-only';
|
|
2
|
+
export interface CopyStorefrontOptions {
|
|
3
|
+
/**
|
|
4
|
+
* `full-project` — storefront lives at `<projectDir>/storefront/` alongside `server/`.
|
|
5
|
+
* `storefront-only` — storefront IS the project root.
|
|
6
|
+
*/
|
|
7
|
+
mode: StorefrontMode;
|
|
8
|
+
/**
|
|
9
|
+
* Scenario name baked into `NEXT_PUBLIC_SCENARIO`. Defaults to `default`.
|
|
10
|
+
*/
|
|
11
|
+
scenario?: string;
|
|
12
|
+
/**
|
|
13
|
+
* Vendure Shop API URL written to `.env.local`. Required for `storefront-only`,
|
|
14
|
+
* optional for `full-project` (defaults to `http://localhost:3500/shop-api`
|
|
15
|
+
* for the locally-scaffolded server).
|
|
16
|
+
*/
|
|
17
|
+
apiUrl?: string;
|
|
18
|
+
/**
|
|
19
|
+
* Override package.json `name`. Defaults to the directory name of the
|
|
20
|
+
* storefront target.
|
|
21
|
+
*/
|
|
22
|
+
packageName?: string;
|
|
23
|
+
}
|
|
1
24
|
/**
|
|
2
25
|
* Copy the bundled storefront from dist/assets/storefront/ into the scaffolded project.
|
|
3
|
-
*
|
|
4
|
-
*
|
|
26
|
+
* Generates a project-scoped `.env.local` (random REVALIDATION_SECRET, optional
|
|
27
|
+
* API URL override, scenario selection) and patches `package.json` `name`.
|
|
5
28
|
*/
|
|
6
|
-
export declare function copyStorefront(projectDir: string): Promise<void>;
|
|
29
|
+
export declare function copyStorefront(projectDir: string, options: CopyStorefrontOptions): Promise<void>;
|
|
@@ -34,35 +34,86 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.copyStorefront = copyStorefront;
|
|
37
|
+
const crypto = __importStar(require("crypto"));
|
|
37
38
|
const fs = __importStar(require("fs-extra"));
|
|
38
39
|
const path = __importStar(require("path"));
|
|
40
|
+
const registry_1 = require("./registry");
|
|
39
41
|
/**
|
|
40
42
|
* Copy the bundled storefront from dist/assets/storefront/ into the scaffolded project.
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
+
* Generates a project-scoped `.env.local` (random REVALIDATION_SECRET, optional
|
|
44
|
+
* API URL override, scenario selection) and patches `package.json` `name`.
|
|
43
45
|
*/
|
|
44
|
-
async function copyStorefront(projectDir) {
|
|
46
|
+
async function copyStorefront(projectDir, options) {
|
|
47
|
+
var _a;
|
|
45
48
|
const bundledStorefrontPath = getBundledStorefrontPath();
|
|
46
|
-
const destPath =
|
|
49
|
+
const destPath = options.mode === 'storefront-only'
|
|
50
|
+
? projectDir
|
|
51
|
+
: path.join(projectDir, 'storefront');
|
|
47
52
|
await fs.copy(bundledStorefrontPath, destPath);
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
53
|
+
await writeStorefrontEnv(destPath, options);
|
|
54
|
+
await writeStorefrontNpmrc(destPath);
|
|
55
|
+
await patchPackageName(destPath, (_a = options.packageName) !== null && _a !== void 0 ? _a : path.basename(destPath));
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* `npm pack` hard-excludes any file named `.npmrc` from tarballs (regardless
|
|
59
|
+
* of `files`/`.npmignore`), so we cannot bundle it. Storefront-only scaffolds
|
|
60
|
+
* have no surrounding project root, so this scope mapping must be written at
|
|
61
|
+
* scaffold time — without it `${pm} install` 401s on @vendure-platform/*
|
|
62
|
+
* packages even when the user has a valid token in ~/.npmrc.
|
|
63
|
+
*/
|
|
64
|
+
async function writeStorefrontNpmrc(storefrontDir) {
|
|
65
|
+
await fs.writeFile(path.join(storefrontDir, '.npmrc'), `@vendure-platform:registry=${(0, registry_1.getRegistryUrl)()}\n`);
|
|
66
|
+
}
|
|
67
|
+
async function writeStorefrontEnv(storefrontDir, options) {
|
|
68
|
+
var _a, _b;
|
|
69
|
+
const secret = crypto.randomBytes(32).toString('hex');
|
|
70
|
+
const scenario = (_a = options.scenario) !== null && _a !== void 0 ? _a : 'default';
|
|
71
|
+
const apiUrl = (_b = options.apiUrl) !== null && _b !== void 0 ? _b : '';
|
|
72
|
+
const lines = [
|
|
73
|
+
'# Generated by @vendure-platform/create. Safe to edit.',
|
|
74
|
+
'',
|
|
75
|
+
'# Used to authenticate revalidation webhooks. Treat as a secret.',
|
|
76
|
+
`REVALIDATION_SECRET=${secret}`,
|
|
77
|
+
'',
|
|
78
|
+
`NEXT_PUBLIC_SCENARIO=${scenario}`,
|
|
79
|
+
'',
|
|
80
|
+
];
|
|
81
|
+
if (apiUrl) {
|
|
82
|
+
lines.push('# Vendure Shop API URL.', `VENDURE_SHOP_API_URL=${apiUrl}`, '');
|
|
83
|
+
}
|
|
84
|
+
else {
|
|
85
|
+
lines.push('# Vendure Shop API URL. Defaults to http://localhost:3500/shop-api when unset.', '# VENDURE_SHOP_API_URL=https://shop.example.com/shop-api', '');
|
|
52
86
|
}
|
|
87
|
+
await fs.writeFile(path.join(storefrontDir, '.env.local'), lines.join('\n'));
|
|
88
|
+
}
|
|
89
|
+
async function patchPackageName(storefrontDir, name) {
|
|
90
|
+
const pkgPath = path.join(storefrontDir, 'package.json');
|
|
91
|
+
if (!(await fs.pathExists(pkgPath)))
|
|
92
|
+
return;
|
|
93
|
+
const pkg = await fs.readJson(pkgPath);
|
|
94
|
+
pkg.name = sanitizePackageName(name);
|
|
95
|
+
await fs.writeJson(pkgPath, pkg, { spaces: 4 });
|
|
96
|
+
}
|
|
97
|
+
function sanitizePackageName(name) {
|
|
98
|
+
return name
|
|
99
|
+
.toLowerCase()
|
|
100
|
+
.replace(/[^a-z0-9._-]/g, '-')
|
|
101
|
+
.replace(/^-+|-+$/g, '')
|
|
102
|
+
|| 'storefront';
|
|
53
103
|
}
|
|
54
104
|
function getBundledStorefrontPath() {
|
|
105
|
+
// Installed/published package: __dirname is dist/, bundled storefront at dist/assets/storefront/
|
|
106
|
+
// Local dev (running from src/): __dirname is src/, bundled storefront at dist/assets/storefront/
|
|
55
107
|
const candidates = [
|
|
56
|
-
// When running from dist/ (installed package): dist/assets/storefront/
|
|
57
108
|
path.join(__dirname, 'assets', 'storefront'),
|
|
58
|
-
|
|
59
|
-
path.join(__dirname, '..', 'assets', 'storefront'),
|
|
109
|
+
path.join(__dirname, '..', 'dist', 'assets', 'storefront'),
|
|
60
110
|
];
|
|
61
111
|
for (const candidate of candidates) {
|
|
62
112
|
if (fs.existsSync(candidate)) {
|
|
63
113
|
return candidate;
|
|
64
114
|
}
|
|
65
115
|
}
|
|
66
|
-
throw new Error('Bundled storefront not found.
|
|
116
|
+
throw new Error('Bundled storefront not found. Build @vendure-platform/create first ' +
|
|
117
|
+
'(`bunx nx run @vendure-platform/create:build`).');
|
|
67
118
|
}
|
|
68
119
|
//# sourceMappingURL=storefront-copier.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storefront-copier.js","sourceRoot":"","sources":["../src/storefront-copier.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"storefront-copier.js","sourceRoot":"","sources":["../src/storefront-copier.ts"],"names":[],"mappings":"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"}
|