create-partylayer-app 0.6.2 → 0.7.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/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  Create a Canton dApp with PartyLayer wallet connectivity, configuration and a working development setup. React starters use the ready-made `ConnectButton` and show **Powered by PartyLayer** by default.
4
4
 
5
+ Use a supported Node LTS release. CLI 0.7.0 requires Node **20.12.0+**, matching its existing prompt-library dependency; your selected framework may require a newer runtime.
6
+
5
7
  ## Create an app
6
8
 
7
9
  ```bash
@@ -67,7 +69,7 @@ Provide directory, template and package manager to skip prompts. For example:
67
69
  npm create partylayer-app@latest my-dapp -- --template next-ssr --pm npm --no-git
68
70
  ```
69
71
 
70
- Node.js 18 is the CLI minimum. Follow the generated framework's Node requirements as well; use a supported Node LTS release for new projects.
72
+ CLI 0.7.0 requires Node.js 20.12.0 or newer. Follow the generated framework's Node requirements as well; use a supported Node LTS release for new projects.
71
73
 
72
74
  ## Recover an installation failure
73
75
 
@@ -95,3 +97,20 @@ its dependencies are ready or that a live wallet connection has succeeded.
95
97
  ## License
96
98
 
97
99
  MIT
100
+
101
+ ## Diagnose an existing application
102
+
103
+ **Available in CLI 0.7.0 and newer.** CLI 0.6.2 and older do not support `--doctor`.
104
+
105
+ ```bash
106
+ npx create-partylayer-app@latest --doctor .
107
+ npx create-partylayer-app@latest --doctor ./apps/web --json
108
+ ```
109
+
110
+ Select the application's directory, not just the monorepo root. Doctor reads package metadata and checks declared/installed PartyLayer entry packages, SemVer ranges, required peers, duplicate React/query contexts, Node engine requirements and competing local lockfiles. Linked/workspace dependencies are supported; non-SemVer specifications produce a warning when they cannot be compared offline. A workspace root may own the lockfile.
111
+
112
+ The command does not write project files, run application code or install scripts, read `.env`/`.npmrc`, access wallets, or contact the registry. `npx` itself may download the CLI from npm before Doctor starts. Warnings about old guide baselines do not mean an installed wallet is broken, and the offline report does not claim packages match npm's current `latest` tag.
113
+
114
+ Exit codes: **0** = no detected setup errors (warnings may exist), **1** = setup errors, **2** = invalid diagnostic arguments. `--json` emits a versioned report with `schemaVersion`, `toolVersion`, `checks` and `summary`. Do not combine Doctor with scaffold flags. The positional directory name `doctor` remains a valid scaffold target; diagnostics use the explicit `--doctor` flag.
115
+
116
+ Doctor does not prove provider mounting, application configuration, CIP-0103 transport behavior, login, signing, or successful ledger execution. Follow the [migration guide](../../docs/migration.md) and complete runtime acceptance for the application's actual wallet/network.
@@ -0,0 +1,18 @@
1
+ type Check = {
2
+ id: string;
3
+ severity: 'pass' | 'warning' | 'error';
4
+ message: string;
5
+ remediation?: string;
6
+ };
7
+ export declare function runDoctor(projectDir: string): {
8
+ schemaVersion: number;
9
+ toolVersion: string;
10
+ checks: Check[];
11
+ summary: {
12
+ status: string;
13
+ errors: number;
14
+ warnings: number;
15
+ };
16
+ };
17
+ export {};
18
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAaA,KAAK,KAAK,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AA0C3G,wBAAgB,SAAS,CAAC,UAAU,EAAE,MAAM;;;;;;;;;EAiF3C"}
package/dist/doctor.js ADDED
@@ -0,0 +1,148 @@
1
+ import { existsSync, readFileSync, realpathSync } from 'node:fs';
2
+ import { createRequire } from 'node:module';
3
+ import { dirname, join } from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import semver from 'semver';
6
+ const INTEGRATIONS = ['@partylayer/react', '@partylayer/sdk', '@partylayer/vue', '@partylayer/react-native', '@partylayer/provider', '@partylayer/session'];
7
+ const SAFE_NAME = /^(?:@[a-z0-9._-]+\/)?[a-z0-9][a-z0-9._-]*$/i;
8
+ function readManifest(path) {
9
+ const parsed = JSON.parse(readFileSync(path, 'utf8'));
10
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
11
+ throw new Error('Invalid manifest');
12
+ const manifest = parsed;
13
+ for (const field of ['dependencies', 'devDependencies', 'peerDependencies']) {
14
+ const value = manifest[field];
15
+ if (value !== undefined && (!value || typeof value !== 'object' || Array.isArray(value) || Object.values(value).some(item => typeof item !== 'string')))
16
+ throw new Error('Invalid dependency map');
17
+ }
18
+ return manifest;
19
+ }
20
+ /** Resolve metadata only. Never import/require the selected app or its dependencies. */
21
+ function installed(name, from) {
22
+ if (!SAFE_NAME.test(name))
23
+ return undefined;
24
+ const resolver = createRequire(from);
25
+ try {
26
+ let dir = dirname(resolver.resolve(name));
27
+ while (true) {
28
+ const path = join(dir, 'package.json');
29
+ if (existsSync(path)) {
30
+ const manifest = readManifest(path);
31
+ if (manifest.name === name)
32
+ return { manifest, path: realpathSync(path) };
33
+ }
34
+ const parent = dirname(dir);
35
+ if (parent === dir)
36
+ break;
37
+ dir = parent;
38
+ }
39
+ }
40
+ catch { /* Package exports may hide metadata or the entry may not be built. */ }
41
+ for (const base of resolver.resolve.paths(name) ?? []) {
42
+ const path = join(base, name, 'package.json');
43
+ try {
44
+ const manifest = readManifest(path);
45
+ if (manifest.name === name)
46
+ return { manifest, path: realpathSync(path) };
47
+ }
48
+ catch { /* Continue through Node's normal lookup locations. */ }
49
+ }
50
+ return undefined;
51
+ }
52
+ export function runDoctor(projectDir) {
53
+ const tool = readManifest(fileURLToPath(new URL('../package.json', import.meta.url)));
54
+ const checks = [];
55
+ const add = (id, severity, message, remediation) => {
56
+ checks.push({ id, severity, message, ...(remediation ? { remediation } : {}) });
57
+ };
58
+ const finish = () => {
59
+ const errors = checks.filter(check => check.severity === 'error').length;
60
+ const warnings = checks.filter(check => check.severity === 'warning').length;
61
+ return { schemaVersion: 1, toolVersion: tool.version, checks, summary: { status: errors ? 'error' : warnings ? 'warning' : 'pass', errors, warnings } };
62
+ };
63
+ const engine = (name, manifest) => {
64
+ const range = manifest.engines?.node;
65
+ if (typeof range !== 'string' || !semver.validRange(range))
66
+ return;
67
+ const ok = semver.satisfies(process.versions.node, range);
68
+ add(`node:${name}`, ok ? 'pass' : 'error', `${name}: Node ${process.versions.node} ${ok ? 'meets' : 'does not meet'} its engine requirement.`, ok ? undefined : 'Use a supported Node LTS version accepted by this package, then reinstall dependencies.');
69
+ };
70
+ engine('create-partylayer-app', tool);
71
+ const manifestPath = join(projectDir, 'package.json');
72
+ let project;
73
+ try {
74
+ project = readManifest(manifestPath);
75
+ }
76
+ catch {
77
+ add('project', 'error', 'No readable, valid package.json in the selected directory.', 'Run --doctor from the application root, or pass its directory. Repair invalid JSON before retrying.');
78
+ return finish();
79
+ }
80
+ add('project', 'pass', 'Application package.json is readable.');
81
+ engine('application', project);
82
+ const declared = { ...project.peerDependencies, ...project.devDependencies, ...project.dependencies };
83
+ const names = INTEGRATIONS.filter(name => name in declared);
84
+ if (!names.length)
85
+ add('integration', 'error', 'No supported PartyLayer entry package is declared.', 'For a React app: npm install @partylayer/react @tanstack/react-query. For other stacks, follow https://partylayer.xyz/docs/installation.');
86
+ const compare = (id, name, dependency, range) => {
87
+ const version = dependency.manifest.version;
88
+ if (!version || !semver.valid(version)) {
89
+ add(id, 'warning', `${name}: installed version metadata is not valid SemVer.`, 'Check local/workspace package metadata and build it before consuming it.');
90
+ }
91
+ else if (!semver.validRange(range)) {
92
+ add(id, 'warning', `${name}: local, tagged or non-SemVer dependency specification cannot be compared offline.`, 'Verify the resolved package and lockfile with your package manager.');
93
+ }
94
+ else {
95
+ const ok = semver.satisfies(version, range);
96
+ add(id, ok ? 'pass' : 'error', `${name} ${version} ${ok ? 'matches' : 'does not match'} its declared requirement.`, ok ? undefined : 'Reinstall using the existing lockfile; resolve the version mismatch before changing versions.');
97
+ }
98
+ };
99
+ for (const name of names) {
100
+ const dependency = installed(name, manifestPath);
101
+ if (!dependency) {
102
+ add(`installed:${name}`, 'error', `${name} is declared but its installed metadata cannot be resolved.`, 'Run your package manager install in the application workspace, then retry.');
103
+ continue;
104
+ }
105
+ compare(`installed:${name}`, name, dependency, declared[name]);
106
+ engine(name, dependency.manifest);
107
+ for (const [peer, range] of Object.entries(dependency.manifest.peerDependencies ?? {})) {
108
+ if (!SAFE_NAME.test(peer))
109
+ continue;
110
+ const resolved = installed(peer, dependency.path);
111
+ if (!resolved) {
112
+ if (dependency.manifest.peerDependenciesMeta?.[peer]?.optional)
113
+ continue;
114
+ add(`peer:${name}:${peer}`, 'error', `${name}: required peer ${peer} is missing.`, `Install a compatible ${peer} version in the application workspace; check the package's peerDependencies.`);
115
+ }
116
+ else {
117
+ compare(`peer:${name}:${peer}`, peer, resolved, range);
118
+ if (peer === 'react' || peer === 'react-dom' || peer === '@tanstack/react-query') {
119
+ const appPeer = installed(peer, manifestPath);
120
+ if (appPeer && declared[peer])
121
+ compare(`application-peer:${peer}`, peer, appPeer, declared[peer]);
122
+ if (appPeer && appPeer.path !== resolved.path)
123
+ add(`duplicate:${name}:${peer}`, 'error', `${name} and the application resolve different copies of ${peer}.`, 'Align workspace dependencies and deduplicate this context package with your package manager.');
124
+ }
125
+ }
126
+ }
127
+ const minimum = name === '@partylayer/react' ? '3.1.2' : name === '@partylayer/sdk' ? '0.20.1' : undefined;
128
+ if (minimum && dependency.manifest.version && semver.valid(dependency.manifest.version) && semver.lt(dependency.manifest.version, minimum)) {
129
+ add(`migration:${name}`, 'warning', `${name} predates the current integration guide baseline (${minimum}).`, 'Review https://partylayer.xyz/docs/migration before upgrading. This offline check does not query npm latest.');
130
+ }
131
+ }
132
+ for (const framework of ['next', 'vite', 'nuxt']) {
133
+ if (framework in declared) {
134
+ const dependency = installed(framework, manifestPath);
135
+ if (dependency)
136
+ engine(framework, dependency.manifest);
137
+ }
138
+ }
139
+ const locks = ['package-lock.json', 'npm-shrinkwrap.json', 'pnpm-lock.yaml', 'yarn.lock', 'bun.lock', 'bun.lockb'].filter(file => existsSync(join(projectDir, file)));
140
+ const families = new Set(locks.map(file => file.startsWith('npm-') || file === 'package-lock.json' ? 'npm' : file.startsWith('bun.') ? 'bun' : file.split('-')[0]?.split('.')[0]));
141
+ if (families.size > 1)
142
+ add('lockfiles', 'warning', 'Lockfiles from multiple package managers exist in this application directory.', 'Choose the application package manager and reconcile stale lockfiles with your team. Doctor does not delete files.');
143
+ else
144
+ add('lockfiles', 'pass', locks.length ? 'No competing application lockfile families found.' : 'No application lockfile found; a workspace root may own it.');
145
+ add('scope', 'pass', 'Read-only metadata checks completed; no project code, install scripts, credentials or network requests were used.');
146
+ return finish();
147
+ }
148
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -28,17 +28,20 @@ const HELP = `${pc.bold('create-partylayer-app')} — scaffold a PartyLayer dApp
28
28
 
29
29
  ${pc.bold('Usage')}
30
30
  npm create partylayer-app@latest [dir] [options]
31
+ npx create-partylayer-app@latest --doctor [dir] [--json]
31
32
 
32
33
  ${pc.bold('Options')}
33
34
  -t, --template <id> ${TEMPLATES.map((t) => t.id).join(', ')}
34
35
  --pm <manager> npm | pnpm | yarn
35
36
  --no-install skip dependency install
36
37
  --no-git skip git init
38
+ --doctor diagnose an existing app without changing it
39
+ --json machine-readable doctor report (requires --doctor)
37
40
  -h, --help show this help
38
41
  `;
39
42
  async function main() {
40
43
  const argv = mri(process.argv.slice(2), {
41
- boolean: ['install', 'git', 'help'],
44
+ boolean: ['install', 'git', 'help', 'doctor', 'json'],
42
45
  default: { install: true, git: true, help: false },
43
46
  alias: { t: 'template', h: 'help' },
44
47
  });
@@ -46,6 +49,31 @@ async function main() {
46
49
  console.log(HELP);
47
50
  return;
48
51
  }
52
+ if (argv.doctor || argv.json) {
53
+ const allowed = new Set(['_', 'doctor', 'json', 'install', 'git', 'help', 'h']);
54
+ const raw = process.argv.slice(2);
55
+ if (!argv.doctor || argv._.length > 1 || Object.keys(argv).some(key => !allowed.has(key)) ||
56
+ raw.some(arg => ['--install', '--no-install', '--git', '--no-git'].includes(arg))) {
57
+ console.error('Usage: npx create-partylayer-app@latest --doctor [dir] [--json]. Do not combine diagnostic and scaffold options.');
58
+ process.exitCode = 2;
59
+ return;
60
+ }
61
+ const { runDoctor } = await import('./doctor.js');
62
+ const report = runDoctor(resolve(process.cwd(), String(argv._[0] ?? '.')));
63
+ if (argv.json)
64
+ console.log(JSON.stringify(report, null, 2));
65
+ else {
66
+ console.log(`PartyLayer doctor ${report.toolVersion} — offline installation checks`);
67
+ for (const check of report.checks) {
68
+ console.log(`[${check.severity.toUpperCase()}] ${check.message}`);
69
+ if (check.remediation)
70
+ console.log(` ${check.remediation}`);
71
+ }
72
+ console.log(`${report.summary.errors} error(s), ${report.summary.warnings} warning(s). Wallet login, configuration, signing and ledger execution require separate runtime tests.`);
73
+ }
74
+ process.exitCode = report.summary.errors ? 1 : 0;
75
+ return;
76
+ }
49
77
  p.intro(pc.bgYellow(pc.black(' create-partylayer-app ')));
50
78
  const flagTemplate = typeof argv.template === 'string' ? argv.template : undefined;
51
79
  if (flagTemplate && !isTemplateId(flagTemplate)) {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-partylayer-app",
3
- "version": "0.6.2",
3
+ "version": "0.7.1",
4
4
  "description": "Create a Canton Network dApp with PartyLayer: React, Next.js, Vue and TypeScript starters with wallet integration and ready-made React Connect Wallet UI.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -14,14 +14,16 @@
14
14
  "dependencies": {
15
15
  "@clack/prompts": "1.5.1",
16
16
  "mri": "1.2.0",
17
- "picocolors": "1.1.1"
17
+ "picocolors": "1.1.1",
18
+ "semver": "7.8.0"
18
19
  },
19
20
  "devDependencies": {
20
21
  "@types/node": "^20.11.0",
22
+ "@types/semver": "7.7.1",
21
23
  "typescript": "^5.3.3"
22
24
  },
23
25
  "engines": {
24
- "node": ">=18"
26
+ "node": ">=20.12.0"
25
27
  },
26
28
  "repository": {
27
29
  "type": "git",
@@ -53,7 +55,7 @@
53
55
  ],
54
56
  "scripts": {
55
57
  "build": "tsc",
56
- "test": "pnpm run build && node --test test/installation.test.mjs",
58
+ "test": "pnpm run build && node --test test/*.test.mjs",
57
59
  "clean": "rm -rf dist *.tsbuildinfo"
58
60
  }
59
61
  }
@@ -10,18 +10,18 @@
10
10
  "lint": "next lint"
11
11
  },
12
12
  "dependencies": {
13
- "@partylayer/react": "^3.1.0",
14
- "@partylayer/sdk": "^0.20.0",
15
- "@partylayer/session": "^1.1.9",
13
+ "@partylayer/react": "^3.2.0",
14
+ "@partylayer/sdk": "^0.21.0",
15
+ "@partylayer/session": "^1.1.10",
16
16
  "@tanstack/react-query": "^5.0.0",
17
- "next": "^14.2.5",
18
- "react": "^18.3.1",
19
- "react-dom": "^18.3.1"
17
+ "next": "^15.5.28",
18
+ "react": "^19.3.1",
19
+ "react-dom": "^19.3.1"
20
20
  },
21
21
  "devDependencies": {
22
22
  "@types/node": "^20.11.0",
23
- "@types/react": "^18.3.3",
24
- "@types/react-dom": "^18.3.0",
23
+ "@types/react": "^19.3.0",
24
+ "@types/react-dom": "^19.3.0",
25
25
  "typescript": "^5.6.2"
26
26
  }
27
27
  }
@@ -4,21 +4,21 @@ import { ConnectButton } from '@/components/ConnectButton';
4
4
  // Reading cookies() opts this route into dynamic (per-request) rendering, which
5
5
  // is exactly what SSR session needs: the server reads the session cookie on
6
6
  // every request and renders the connected state into the initial HTML.
7
- export default function Home() {
8
- const session = getServerSession();
7
+ export default async function Home() {
8
+ const session = await getServerSession();
9
9
  const party = session?.account?.partyId ?? null;
10
10
 
11
11
  return (
12
12
  <main className="app">
13
13
  <h1>{{PROJECT_NAME}}</h1>
14
- <p className="subtitle">A PartyLayer dApp on Canton: connect any verified wallet.</p>
14
+ <p className="subtitle">A PartyLayer dApp on Canton: connect a supported wallet.</p>
15
15
 
16
16
  {/* SERVER-RENDERED connected state (Option A: server owns the display). This
17
17
  appears in the initial HTML from the cookie, before any client JS, so
18
18
  there is no disconnected→connected flash. */}
19
19
  {party ? (
20
20
  <p className="session">
21
- Connected as <code data-testid="server-party">{truncateParty(party)}</code>
21
+ Last connected as <code data-testid="server-party">{truncateParty(party)}</code>
22
22
  </p>
23
23
  ) : (
24
24
  <p className="session" data-testid="server-cta">
@@ -9,8 +9,8 @@ import {
9
9
  // next/headers is imported HERE (the app), never inside @partylayer/session —
10
10
  // the library stays framework-agnostic. This adapter wraps Next's read-only
11
11
  // request cookies into the CookieAdapter shape createCookieStorage expects.
12
- function nextCookieAdapter(): CookieAdapter {
13
- const jar = cookies();
12
+ async function nextCookieAdapter(): Promise<CookieAdapter> {
13
+ const jar = await cookies();
14
14
  return {
15
15
  get: (name) => jar.get(name)?.value ?? null,
16
16
  // Server Components can only READ cookies; writes happen client-side
@@ -25,8 +25,8 @@ function nextCookieAdapter(): CookieAdapter {
25
25
  * snapshot (party, network, …) or null. This is what lets a Server Component
26
26
  * render the connected state in the initial HTML — before any client JS.
27
27
  */
28
- export function getServerSession(): PersistedSessionSnapshot | null {
29
- const storage = createCookieStorage({ adapter: nextCookieAdapter() });
28
+ export async function getServerSession(): Promise<PersistedSessionSnapshot | null> {
29
+ const storage = createCookieStorage({ adapter: await nextCookieAdapter() });
30
30
  // Cookie reads are synchronous; the SessionStorage interface types getItem as
31
31
  // string | null | Promise, so narrow to a string (null/absent → no session).
32
32
  const raw = storage.getItem('pl_session');
@@ -9,8 +9,8 @@
9
9
  "preview": "vite preview"
10
10
  },
11
11
  "dependencies": {
12
- "@partylayer/react": "^3.1.0",
13
- "@partylayer/sdk": "^0.20.0",
12
+ "@partylayer/react": "^3.2.0",
13
+ "@partylayer/sdk": "^0.21.0",
14
14
  "@tanstack/react-query": "^5.0.0",
15
15
  "react": "^18.3.1",
16
16
  "react-dom": "^18.3.1"
@@ -9,8 +9,8 @@
9
9
  "preview": "vite preview"
10
10
  },
11
11
  "dependencies": {
12
- "@partylayer/react": "^3.1.0",
13
- "@partylayer/sdk": "^0.20.0",
12
+ "@partylayer/react": "^3.2.0",
13
+ "@partylayer/sdk": "^0.21.0",
14
14
  "@tanstack/react-query": "^5.0.0",
15
15
  "react": "^18.3.1",
16
16
  "react-dom": "^18.3.1"
@@ -9,8 +9,8 @@
9
9
  "preview": "vite preview"
10
10
  },
11
11
  "dependencies": {
12
- "@partylayer/react": "^3.1.0",
13
- "@partylayer/sdk": "^0.20.0",
12
+ "@partylayer/react": "^3.2.0",
13
+ "@partylayer/sdk": "^0.21.0",
14
14
  "@tanstack/react-query": "^5.0.0",
15
15
  "react": "^18.3.1",
16
16
  "react-dom": "^18.3.1"
@@ -9,7 +9,7 @@
9
9
  "preview": "vite preview"
10
10
  },
11
11
  "dependencies": {
12
- "@partylayer/sdk": "^0.20.0"
12
+ "@partylayer/sdk": "^0.21.0"
13
13
  },
14
14
  "devDependencies": {
15
15
  "typescript": "^5.6.2",
@@ -10,9 +10,9 @@
10
10
  "postinstall": "nuxt prepare"
11
11
  },
12
12
  "dependencies": {
13
- "@partylayer/sdk": "^0.20.0",
14
- "@partylayer/session": "^1.1.9",
15
- "@partylayer/vue": "^2.0.1",
13
+ "@partylayer/sdk": "^0.21.0",
14
+ "@partylayer/session": "^1.1.10",
15
+ "@partylayer/vue": "^2.0.2",
16
16
  "@pinia/nuxt": "^0.5.5",
17
17
  "@tanstack/vue-query": "^5.0.0",
18
18
  "pinia": "^2.2.0",