create-partylayer-app 0.1.0 → 0.1.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/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +111 -0
- package/dist/index.js.map +1 -0
- package/dist/prompts.d.ts +20 -0
- package/dist/prompts.d.ts.map +1 -0
- package/dist/prompts.js +65 -0
- package/dist/prompts.js.map +1 -0
- package/dist/scaffold.d.ts +2 -0
- package/dist/scaffold.d.ts.map +1 -0
- package/dist/scaffold.js +42 -0
- package/dist/scaffold.js.map +1 -0
- package/dist/templates.d.ts +15 -0
- package/dist/templates.d.ts.map +1 -0
- package/dist/templates.js +11 -0
- package/dist/templates.js.map +1 -0
- package/package.json +2 -2
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* create-partylayer-app — scaffold a PartyLayer dApp.
|
|
4
|
+
*
|
|
5
|
+
* npm create partylayer-app@latest
|
|
6
|
+
* pnpm create partylayer-app
|
|
7
|
+
* yarn create partylayer-app
|
|
8
|
+
*
|
|
9
|
+
* Flags (skip the matching prompt; pass all for a non-interactive run):
|
|
10
|
+
* <dir> target directory (positional)
|
|
11
|
+
* --template, -t template id (e.g. react-vite)
|
|
12
|
+
* --pm npm | pnpm | yarn
|
|
13
|
+
* --no-install skip dependency install
|
|
14
|
+
* --no-git skip git init
|
|
15
|
+
* --help, -h show this help
|
|
16
|
+
*/
|
|
17
|
+
import { spawnSync } from 'node:child_process';
|
|
18
|
+
import { existsSync, readdirSync } from 'node:fs';
|
|
19
|
+
import { dirname, join, resolve } from 'node:path';
|
|
20
|
+
import { fileURLToPath } from 'node:url';
|
|
21
|
+
import * as p from '@clack/prompts';
|
|
22
|
+
import mri from 'mri';
|
|
23
|
+
import pc from 'picocolors';
|
|
24
|
+
import { runPrompts } from './prompts.js';
|
|
25
|
+
import { scaffold } from './scaffold.js';
|
|
26
|
+
import { isTemplateId, TEMPLATES } from './templates.js';
|
|
27
|
+
const HELP = `${pc.bold('create-partylayer-app')} — scaffold a PartyLayer dApp
|
|
28
|
+
|
|
29
|
+
${pc.bold('Usage')}
|
|
30
|
+
npm create partylayer-app@latest [dir] [options]
|
|
31
|
+
|
|
32
|
+
${pc.bold('Options')}
|
|
33
|
+
-t, --template <id> ${TEMPLATES.map((t) => t.id).join(', ')}
|
|
34
|
+
--pm <manager> npm | pnpm | yarn
|
|
35
|
+
--no-install skip dependency install
|
|
36
|
+
--no-git skip git init
|
|
37
|
+
-h, --help show this help
|
|
38
|
+
`;
|
|
39
|
+
async function main() {
|
|
40
|
+
const argv = mri(process.argv.slice(2), {
|
|
41
|
+
boolean: ['install', 'git', 'help'],
|
|
42
|
+
default: { install: true, git: true, help: false },
|
|
43
|
+
alias: { t: 'template', h: 'help' },
|
|
44
|
+
});
|
|
45
|
+
if (argv.help) {
|
|
46
|
+
console.log(HELP);
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
p.intro(pc.bgYellow(pc.black(' create-partylayer-app ')));
|
|
50
|
+
const flagTemplate = typeof argv.template === 'string' ? argv.template : undefined;
|
|
51
|
+
if (flagTemplate && !isTemplateId(flagTemplate)) {
|
|
52
|
+
p.cancel(`Unknown template "${flagTemplate}". Available: ${TEMPLATES.map((t) => t.id).join(', ')}`);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
const flagPm = typeof argv.pm === 'string' ? argv.pm : undefined;
|
|
56
|
+
if (flagPm && !['npm', 'pnpm', 'yarn'].includes(flagPm)) {
|
|
57
|
+
p.cancel(`Unknown package manager "${flagPm}". Use npm, pnpm, or yarn.`);
|
|
58
|
+
process.exit(1);
|
|
59
|
+
}
|
|
60
|
+
const opts = await runPrompts({
|
|
61
|
+
projectDir: typeof argv._[0] === 'string' ? argv._[0] : undefined,
|
|
62
|
+
template: flagTemplate,
|
|
63
|
+
pm: flagPm,
|
|
64
|
+
install: argv.install,
|
|
65
|
+
git: argv.git,
|
|
66
|
+
});
|
|
67
|
+
const targetDir = resolve(process.cwd(), opts.projectDir);
|
|
68
|
+
if (existsSync(targetDir) && readdirSync(targetDir).length > 0) {
|
|
69
|
+
p.cancel(`Target directory "${opts.projectDir}" already exists and is not empty.`);
|
|
70
|
+
process.exit(1);
|
|
71
|
+
}
|
|
72
|
+
const templatesRoot = resolve(dirname(fileURLToPath(import.meta.url)), '..', 'templates');
|
|
73
|
+
const templateDir = join(templatesRoot, opts.template);
|
|
74
|
+
const s = p.spinner();
|
|
75
|
+
s.start(`Scaffolding ${pc.cyan(opts.projectName)} (${opts.template})`);
|
|
76
|
+
await scaffold(templateDir, targetDir, { PROJECT_NAME: opts.projectName });
|
|
77
|
+
s.stop(`Created ${pc.cyan(opts.projectDir)}`);
|
|
78
|
+
if (opts.git) {
|
|
79
|
+
const git = spawnSync('git', ['init', '-q'], { cwd: targetDir, stdio: 'ignore' });
|
|
80
|
+
if (git.status === 0) {
|
|
81
|
+
spawnSync('git', ['add', '-A'], { cwd: targetDir, stdio: 'ignore' });
|
|
82
|
+
spawnSync('git', ['commit', '-q', '-m', 'Initial commit from create-partylayer-app'], {
|
|
83
|
+
cwd: targetDir,
|
|
84
|
+
stdio: 'ignore',
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (opts.install) {
|
|
89
|
+
const inst = p.spinner();
|
|
90
|
+
inst.start(`Installing dependencies with ${opts.pm}`);
|
|
91
|
+
const res = spawnSync(opts.pm, ['install'], { cwd: targetDir, stdio: 'ignore' });
|
|
92
|
+
if (res.status === 0) {
|
|
93
|
+
inst.stop('Dependencies installed');
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
inst.stop(pc.yellow(`Install skipped/failed — run "${opts.pm} install" yourself.`));
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const steps = [
|
|
100
|
+
`cd ${opts.projectDir}`,
|
|
101
|
+
...(opts.install ? [] : [`${opts.pm} install`]),
|
|
102
|
+
`${opts.pm} run dev`,
|
|
103
|
+
];
|
|
104
|
+
p.note(steps.join('\n'), 'Next steps');
|
|
105
|
+
p.outro(`${pc.green('Done.')} Open the app and click Connect Wallet.`);
|
|
106
|
+
}
|
|
107
|
+
main().catch((err) => {
|
|
108
|
+
p.cancel(String(err instanceof Error ? err.message : err));
|
|
109
|
+
process.exit(1);
|
|
110
|
+
});
|
|
111
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
export type PackageManager = 'npm' | 'pnpm' | 'yarn';
|
|
2
|
+
export interface ScaffoldOptions {
|
|
3
|
+
/** Target directory (relative to cwd), e.g. "my-app". */
|
|
4
|
+
projectDir: string;
|
|
5
|
+
/** Project name baked into package.json + app config (derived from dir). */
|
|
6
|
+
projectName: string;
|
|
7
|
+
template: string;
|
|
8
|
+
pm: PackageManager;
|
|
9
|
+
install: boolean;
|
|
10
|
+
git: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface InitialOptions {
|
|
13
|
+
projectDir?: string;
|
|
14
|
+
template?: string;
|
|
15
|
+
pm?: PackageManager;
|
|
16
|
+
install: boolean;
|
|
17
|
+
git: boolean;
|
|
18
|
+
}
|
|
19
|
+
export declare function runPrompts(initial: InitialOptions): Promise<ScaffoldOptions>;
|
|
20
|
+
//# sourceMappingURL=prompts.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.d.ts","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,cAAc,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAErD,MAAM,WAAW,eAAe;IAC9B,yDAAyD;IACzD,UAAU,EAAE,MAAM,CAAC;IACnB,4EAA4E;IAC5E,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,EAAE,EAAE,cAAc,CAAC;IACnB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,OAAO,CAAC;CACd;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,EAAE,CAAC,EAAE,cAAc,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,GAAG,EAAE,OAAO,CAAC;CACd;AAmBD,wBAAsB,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,eAAe,CAAC,CA0ClF"}
|
package/dist/prompts.js
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interactive prompt flow (project name → template → package manager → options).
|
|
3
|
+
* Every field is prompted ONLY if it wasn't supplied via a CLI flag, so passing
|
|
4
|
+
* all flags makes the CLI fully non-interactive (safe in CI / non-TTY).
|
|
5
|
+
*/
|
|
6
|
+
import * as p from '@clack/prompts';
|
|
7
|
+
import { TEMPLATES } from './templates.js';
|
|
8
|
+
const PM_VALUES = ['npm', 'pnpm', 'yarn'];
|
|
9
|
+
/** A valid, install-safe directory/package name. */
|
|
10
|
+
function sanitizeName(input) {
|
|
11
|
+
return input
|
|
12
|
+
.trim()
|
|
13
|
+
.toLowerCase()
|
|
14
|
+
.replace(/[^a-z0-9._-]+/g, '-')
|
|
15
|
+
.replace(/^[-_.]+|[-_.]+$/g, '')
|
|
16
|
+
|| 'partylayer-app';
|
|
17
|
+
}
|
|
18
|
+
function bail() {
|
|
19
|
+
p.cancel('Scaffolding cancelled.');
|
|
20
|
+
process.exit(0);
|
|
21
|
+
}
|
|
22
|
+
export async function runPrompts(initial) {
|
|
23
|
+
let projectDir = initial.projectDir;
|
|
24
|
+
if (!projectDir) {
|
|
25
|
+
const res = await p.text({
|
|
26
|
+
message: 'Project directory?',
|
|
27
|
+
placeholder: 'my-partylayer-app',
|
|
28
|
+
defaultValue: 'my-partylayer-app',
|
|
29
|
+
});
|
|
30
|
+
if (p.isCancel(res))
|
|
31
|
+
bail();
|
|
32
|
+
projectDir = res || 'my-partylayer-app';
|
|
33
|
+
}
|
|
34
|
+
let template = initial.template;
|
|
35
|
+
if (!template) {
|
|
36
|
+
const res = await p.select({
|
|
37
|
+
message: 'Which template?',
|
|
38
|
+
options: TEMPLATES.map((t) => ({ value: t.id, label: t.label, hint: t.hint })),
|
|
39
|
+
initialValue: TEMPLATES[0].id,
|
|
40
|
+
});
|
|
41
|
+
if (p.isCancel(res))
|
|
42
|
+
bail();
|
|
43
|
+
template = res;
|
|
44
|
+
}
|
|
45
|
+
let pm = initial.pm;
|
|
46
|
+
if (!pm) {
|
|
47
|
+
const res = await p.select({
|
|
48
|
+
message: 'Package manager?',
|
|
49
|
+
options: PM_VALUES.map((v) => ({ value: v, label: v })),
|
|
50
|
+
initialValue: 'npm',
|
|
51
|
+
});
|
|
52
|
+
if (p.isCancel(res))
|
|
53
|
+
bail();
|
|
54
|
+
pm = res;
|
|
55
|
+
}
|
|
56
|
+
return {
|
|
57
|
+
projectDir,
|
|
58
|
+
projectName: sanitizeName(projectDir.split('/').pop() || projectDir),
|
|
59
|
+
template,
|
|
60
|
+
pm,
|
|
61
|
+
install: initial.install,
|
|
62
|
+
git: initial.git,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=prompts.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prompts.js","sourceRoot":"","sources":["../src/prompts.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,CAAC,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAuB3C,MAAM,SAAS,GAAqB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAE5D,oDAAoD;AACpD,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK;SACT,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,gBAAgB,EAAE,GAAG,CAAC;SAC9B,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;WAC7B,gBAAgB,CAAC;AACxB,CAAC;AAED,SAAS,IAAI;IACX,CAAC,CAAC,MAAM,CAAC,wBAAwB,CAAC,CAAC;IACnC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAuB;IACtD,IAAI,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACpC,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC;YACvB,OAAO,EAAE,oBAAoB;YAC7B,WAAW,EAAE,mBAAmB;YAChC,YAAY,EAAE,mBAAmB;SAClC,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,IAAI,EAAE,CAAC;QAC5B,UAAU,GAAI,GAAc,IAAI,mBAAmB,CAAC;IACtD,CAAC;IAED,IAAI,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAChC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC;YACzB,OAAO,EAAE,iBAAiB;YAC1B,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9E,YAAY,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,EAAE;SAC9B,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,IAAI,EAAE,CAAC;QAC5B,QAAQ,GAAG,GAAa,CAAC;IAC3B,CAAC;IAED,IAAI,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;IACpB,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC;YACzB,OAAO,EAAE,kBAAkB;YAC3B,OAAO,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC;YACvD,YAAY,EAAE,KAAuB;SACtC,CAAC,CAAC;QACH,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,IAAI,EAAE,CAAC;QAC5B,EAAE,GAAG,GAAqB,CAAC;IAC7B,CAAC;IAED,OAAO;QACL,UAAU;QACV,WAAW,EAAE,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,UAAU,CAAC;QACpE,QAAQ;QACR,EAAE;QACF,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,GAAG,EAAE,OAAO,CAAC,GAAG;KACjB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.d.ts","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AA2BA,wBAAsB,QAAQ,CAC5B,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC3B,OAAO,CAAC,IAAI,CAAC,CAEf"}
|
package/dist/scaffold.js
ADDED
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copy a template directory into the target, applying:
|
|
3
|
+
* - file renames: `_package.json` → `package.json`, and any other `_x` → `.x`
|
|
4
|
+
* (so a published `.gitignore` isn't rewritten to `.npmignore` by npm, and
|
|
5
|
+
* `templates/<id>/_package.json` is NOT picked up by the monorepo's
|
|
6
|
+
* `packages/*` workspace glob);
|
|
7
|
+
* - placeholder substitution: `{{VAR}}` → vars[VAR].
|
|
8
|
+
*/
|
|
9
|
+
import { mkdir, readdir, readFile, writeFile } from 'node:fs/promises';
|
|
10
|
+
import { join } from 'node:path';
|
|
11
|
+
const RENAME = {
|
|
12
|
+
'_package.json': 'package.json',
|
|
13
|
+
};
|
|
14
|
+
function targetName(name) {
|
|
15
|
+
if (RENAME[name])
|
|
16
|
+
return RENAME[name];
|
|
17
|
+
if (name.startsWith('_'))
|
|
18
|
+
return '.' + name.slice(1);
|
|
19
|
+
return name;
|
|
20
|
+
}
|
|
21
|
+
function substitute(content, vars) {
|
|
22
|
+
return content.replace(/\{\{(\w+)\}\}/g, (_match, key) => Object.prototype.hasOwnProperty.call(vars, key) ? vars[key] : `{{${key}}}`);
|
|
23
|
+
}
|
|
24
|
+
export async function scaffold(templateDir, targetDir, vars) {
|
|
25
|
+
await copyDir(templateDir, targetDir, vars);
|
|
26
|
+
}
|
|
27
|
+
async function copyDir(src, dest, vars) {
|
|
28
|
+
await mkdir(dest, { recursive: true });
|
|
29
|
+
const entries = await readdir(src, { withFileTypes: true });
|
|
30
|
+
for (const entry of entries) {
|
|
31
|
+
const from = join(src, entry.name);
|
|
32
|
+
const to = join(dest, targetName(entry.name));
|
|
33
|
+
if (entry.isDirectory()) {
|
|
34
|
+
await copyDir(from, to, vars);
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
const content = await readFile(from, 'utf8');
|
|
38
|
+
await writeFile(to, substitute(content, vars));
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=scaffold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,MAAM,GAA2B;IACrC,eAAe,EAAE,cAAc;CAChC,CAAC;AAEF,SAAS,UAAU,CAAC,IAAY;IAC9B,IAAI,MAAM,CAAC,IAAI,CAAC;QAAE,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;IACtC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CAAC,OAAe,EAAE,IAA4B;IAC/D,OAAO,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,MAAM,EAAE,GAAW,EAAE,EAAE,CAC/D,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAC3E,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAC5B,WAAmB,EACnB,SAAiB,EACjB,IAA4B;IAE5B,MAAM,OAAO,CAAC,WAAW,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;AAC9C,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,GAAW,EACX,IAAY,EACZ,IAA4B;IAE5B,MAAM,KAAK,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;QAC9C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,MAAM,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;QAChC,CAAC;aAAM,CAAC;YACN,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YAC7C,MAAM,SAAS,CAAC,EAAE,EAAE,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Template registry. Each entry maps to a directory under `templates/<id>/`.
|
|
3
|
+
* New templates (next-ssr, vue-nuxt-pinia, vanilla) are added here as they land.
|
|
4
|
+
*/
|
|
5
|
+
export interface TemplateMeta {
|
|
6
|
+
/** Directory name under templates/ and the --template flag value. */
|
|
7
|
+
id: string;
|
|
8
|
+
/** Human label shown in the picker. */
|
|
9
|
+
label: string;
|
|
10
|
+
/** One-line hint shown next to the label. */
|
|
11
|
+
hint: string;
|
|
12
|
+
}
|
|
13
|
+
export declare const TEMPLATES: TemplateMeta[];
|
|
14
|
+
export declare function isTemplateId(value: string): boolean;
|
|
15
|
+
//# sourceMappingURL=templates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,qEAAqE;IACrE,EAAE,EAAE,MAAM,CAAC;IACX,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,6CAA6C;IAC7C,IAAI,EAAE,MAAM,CAAC;CACd;AAED,eAAO,MAAM,SAAS,EAAE,YAAY,EAMnC,CAAC;AAEF,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEnD"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export const TEMPLATES = [
|
|
2
|
+
{
|
|
3
|
+
id: 'react-vite',
|
|
4
|
+
label: 'React + Vite',
|
|
5
|
+
hint: 'React 18, Vite, zero-config PartyLayerKit',
|
|
6
|
+
},
|
|
7
|
+
];
|
|
8
|
+
export function isTemplateId(value) {
|
|
9
|
+
return TEMPLATES.some((t) => t.id === value);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=templates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,MAAM,SAAS,GAAmB;IACvC;QACE,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,cAAc;QACrB,IAAI,EAAE,2CAA2C;KAClD;CACF,CAAC;AAEF,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC;AAC/C,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-partylayer-app",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Scaffold a PartyLayer dApp (Canton wallet integration) in seconds.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -45,6 +45,6 @@
|
|
|
45
45
|
],
|
|
46
46
|
"scripts": {
|
|
47
47
|
"build": "tsc",
|
|
48
|
-
"clean": "rm -rf dist"
|
|
48
|
+
"clean": "rm -rf dist *.tsbuildinfo"
|
|
49
49
|
}
|
|
50
50
|
}
|