create-idia-app 0.2.1 → 0.2.2
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 +47 -53
- package/dist/index.js +6 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/template/package.json +1 -0
- package/template/src/providers/AppProviders.tsx +33 -3
package/README.md
CHANGED
|
@@ -2,32 +2,31 @@
|
|
|
2
2
|
|
|
3
3
|
Scaffold an Expo + React Navigation consumer app with `@idia-ui/core` and `@idia-ui/theme`.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Published on npm as **`create-idia-app`** (Track C Phase 5).
|
|
6
6
|
|
|
7
|
-
##
|
|
8
|
-
|
|
9
|
-
From repo root:
|
|
7
|
+
## Quick start (npm)
|
|
10
8
|
|
|
11
9
|
```bash
|
|
12
|
-
|
|
10
|
+
npx create-idia-app@latest my-app
|
|
11
|
+
cd my-app
|
|
12
|
+
pnpm dev
|
|
13
|
+
pnpm exec idia-ui doctor
|
|
14
|
+
pnpm exec idia-ui add storybook
|
|
15
|
+
pnpm run build-storybook
|
|
13
16
|
```
|
|
14
17
|
|
|
15
|
-
|
|
18
|
+
## Build (monorepo)
|
|
19
|
+
|
|
20
|
+
From repo root:
|
|
16
21
|
|
|
17
22
|
```bash
|
|
18
23
|
node scripts/sync-consumer-template.mjs
|
|
19
24
|
pnpm --filter create-idia-app build
|
|
20
25
|
```
|
|
21
26
|
|
|
22
|
-
|
|
27
|
+
`prebuild` copies `templates/consumer-app/` into `packages/create-idia-app/template/`.
|
|
23
28
|
|
|
24
|
-
|
|
25
|
-
node packages/create-idia-app/dist/index.js my-app
|
|
26
|
-
# or
|
|
27
|
-
pnpm --filter create-idia-app exec create-idia-app my-app
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
### Flags
|
|
29
|
+
## Flags
|
|
31
30
|
|
|
32
31
|
| Flag | Behavior |
|
|
33
32
|
|------|----------|
|
|
@@ -35,70 +34,65 @@ pnpm --filter create-idia-app exec create-idia-app my-app
|
|
|
35
34
|
| `--skip-install` | Skip install + doctor |
|
|
36
35
|
| `--force` | Overwrite existing directory |
|
|
37
36
|
| `--no-git` | Skip `git init` |
|
|
38
|
-
| `--with-storybook` |
|
|
39
|
-
| `--with-brain` |
|
|
40
|
-
|
|
41
|
-
## E2E outside monorepo (pre–Phase 5)
|
|
37
|
+
| `--with-storybook` | Run `idia-ui add storybook` after install |
|
|
38
|
+
| `--with-brain` | Run `idia-ui add brain` after install (Tier 1G experimental) |
|
|
42
39
|
|
|
43
|
-
|
|
40
|
+
## Pure npm e2e (post–Phase 5)
|
|
44
41
|
|
|
45
|
-
|
|
42
|
+
No tarball overrides — uses public registry only.
|
|
46
43
|
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
pnpm
|
|
52
|
-
pnpm
|
|
53
|
-
pnpm
|
|
54
|
-
pnpm
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
pnpm --filter create-idia-app build
|
|
44
|
+
```powershell
|
|
45
|
+
cd $env:TEMP
|
|
46
|
+
npx create-idia-app@latest my-e2e-app --pm pnpm
|
|
47
|
+
cd my-e2e-app
|
|
48
|
+
pnpm install
|
|
49
|
+
pnpm exec idia-ui doctor
|
|
50
|
+
pnpm exec idia-ui add storybook
|
|
51
|
+
pnpm run build-storybook
|
|
52
|
+
# Verify button docs fragment in static output:
|
|
53
|
+
Select-String -Path storybook-static\**\*.js -Pattern "triggers an action" -List
|
|
58
54
|
```
|
|
59
55
|
|
|
60
|
-
|
|
56
|
+
Expected: doctor exit 0; `add storybook` exit 0; `build-storybook` exit 0; grep finds Button story prose.
|
|
61
57
|
|
|
62
|
-
|
|
63
|
-
OUT_DIR=C:\Users\Ojanti\Desktop\Projects_\idia-ui-pack-tarballs
|
|
64
|
-
mkdir %OUT_DIR%
|
|
65
|
-
cd packages/tokens && pnpm pack --pack-destination %OUT_DIR%
|
|
66
|
-
# repeat for theme, core, hooks, motion, utils, validators, cli
|
|
67
|
-
```
|
|
58
|
+
## Late-install fixture (RFC §26.3 row 4)
|
|
68
59
|
|
|
69
|
-
|
|
60
|
+
Proves Storybook add-on on an **aged** scaffold (not `--with-storybook` at create time).
|
|
70
61
|
|
|
71
62
|
```powershell
|
|
72
63
|
cd $env:TEMP
|
|
73
|
-
|
|
74
|
-
cd my-
|
|
64
|
+
npx create-idia-app@latest my-late-storybook --pm pnpm
|
|
65
|
+
cd my-late-storybook
|
|
66
|
+
pnpm install
|
|
67
|
+
pnpm exec idia-ui doctor
|
|
68
|
+
# Do NOT add storybook yet — simulate aged project (optional: wait or pin older @idia-ui/core patch)
|
|
69
|
+
pnpm exec idia-ui add storybook
|
|
70
|
+
pnpm run build-storybook
|
|
71
|
+
Select-String -Path storybook-static\**\*.js -Pattern "triggers an action" -List
|
|
75
72
|
```
|
|
76
73
|
|
|
77
|
-
|
|
74
|
+
Use a **runtime-only** scaffold (`create-idia-app@0.2.1+` without pre-polluted `.storybook/`). If the template already contains Storybook artifacts, `add storybook` idempotently skips — use a fresh scaffold or remove `.storybook/` and storybook devDeps first.
|
|
78
75
|
|
|
79
|
-
|
|
76
|
+
## Maintainer e2e (pre-publish tarballs)
|
|
80
77
|
|
|
81
|
-
|
|
78
|
+
When testing unpublished CLI changes inside the monorepo:
|
|
82
79
|
|
|
83
80
|
```bash
|
|
84
|
-
pnpm
|
|
85
|
-
pnpm
|
|
86
|
-
|
|
87
|
-
# or non-interactive smoke:
|
|
88
|
-
npx expo export --platform web
|
|
81
|
+
pnpm --filter @idia-ui/cli build
|
|
82
|
+
pnpm --filter create-idia-app build
|
|
83
|
+
node packages/create-idia-app/dist/index.js my-cli-test --skip-install
|
|
89
84
|
```
|
|
90
85
|
|
|
91
|
-
|
|
86
|
+
`create-idia-app` auto-detects `packages/cli/dist/cli.js` for doctor during monorepo smoke (no npm install of `@idia-ui/cli` required).
|
|
92
87
|
|
|
93
88
|
## Generated app contract
|
|
94
89
|
|
|
95
90
|
- `package.json` name + `@idia-ui/*` pinned to `^0.2.0`
|
|
91
|
+
- `@idia-ui/cli` in `devDependencies` at `^0.2.2`
|
|
96
92
|
- `app.json` name / slug / scheme renamed from `my-idia-app`
|
|
97
|
-
- `src/navigation/linking.ts` URL prefixes updated
|
|
98
93
|
- `.idia/manifest.json` stub with `idiaCli` + `core` versions
|
|
99
|
-
- `@idia-ui/cli` added to `devDependencies`
|
|
100
94
|
- Post-install: `idia-ui doctor` (non-strict) unless `--skip-install`
|
|
101
95
|
|
|
102
96
|
## Version coupling
|
|
103
97
|
|
|
104
|
-
`create-idia-app@0.2.x` generates apps targeting `@idia-ui/core@0.2.x` and `@idia-ui/cli
|
|
98
|
+
`create-idia-app@0.2.x` generates apps targeting `@idia-ui/core@0.2.x` and `@idia-ui/cli@^0.2.2`.
|
package/dist/index.js
CHANGED
|
@@ -12,8 +12,8 @@ var import_node_path = require("path");
|
|
|
12
12
|
|
|
13
13
|
// src/constants.ts
|
|
14
14
|
var IDIA_UI_VERSION = "0.2.0";
|
|
15
|
-
var CREATE_APP_VERSION = "0.2.
|
|
16
|
-
var CLI_VERSION = "0.2.
|
|
15
|
+
var CREATE_APP_VERSION = "0.2.2";
|
|
16
|
+
var CLI_VERSION = "0.2.3";
|
|
17
17
|
var TEMPLATE_SLUG = "my-idia-app";
|
|
18
18
|
|
|
19
19
|
// src/replace.ts
|
|
@@ -176,15 +176,17 @@ function resolveTemplateDir() {
|
|
|
176
176
|
);
|
|
177
177
|
}
|
|
178
178
|
function runCommand(command, args, cwd) {
|
|
179
|
+
const isWin = process.platform === "win32";
|
|
179
180
|
const result = (0, import_node_child_process.spawnSync)(command, args, {
|
|
180
181
|
cwd,
|
|
181
182
|
stdio: "inherit",
|
|
182
|
-
shell:
|
|
183
|
+
shell: isWin,
|
|
184
|
+
windowsHide: isWin
|
|
183
185
|
});
|
|
184
186
|
if (result.error) {
|
|
185
187
|
return { status: result.status, error: result.error };
|
|
186
188
|
}
|
|
187
|
-
return { status: result.status };
|
|
189
|
+
return { status: result.status ?? 0 };
|
|
188
190
|
}
|
|
189
191
|
function scaffold(options) {
|
|
190
192
|
const projectName = validateProjectName(options.projectName);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/scaffold.ts","../src/replace.ts","../src/constants.ts","../src/pm.ts","../src/doctor.ts","../src/paths.ts","../src/index.ts"],"sourcesContent":["import { cpSync, existsSync, mkdirSync, rmSync } from 'node:fs'\r\nimport { join } from 'node:path'\r\nimport { spawnSync } from 'node:child_process'\r\n\r\nimport { replacePlaceholders, validateProjectName, writeManifest } from './replace.js'\r\nimport {\r\n detectPackageManager,\r\n devCommand,\r\n installCommand,\r\n type PackageManager,\r\n} from './pm.js'\r\nimport { resolveDoctorInvocation, resolveIdiaUiInvocation } from './doctor.js'\r\nimport { templateDir } from './paths.js'\r\n\r\nexport type ScaffoldOptions = {\r\n projectName: string\r\n targetDir: string\r\n pm?: PackageManager\r\n skipInstall?: boolean\r\n force?: boolean\r\n noGit?: boolean\r\n withStorybook?: boolean\r\n withBrain?: boolean\r\n}\r\n\r\nexport type ScaffoldResult = {\r\n projectDir: string\r\n projectName: string\r\n pm: PackageManager\r\n installed: boolean\r\n doctorRan: boolean\r\n doctorExitCode: number | null\r\n doctorVia: 'monorepo' | 'installed' | 'skipped'\r\n}\r\n\r\nfunction resolveTemplateDir(): string {\r\n const bundled = templateDir()\r\n if (existsSync(bundled)) return bundled\r\n throw new Error(\r\n 'Template directory missing. Run `pnpm run build` in packages/create-idia-app first.',\r\n )\r\n}\r\n\r\nfunction runCommand(\r\n command: string,\r\n args: string[],\r\n cwd: string,\r\n): { status: number | null; error?: Error } {\r\n const result = spawnSync(command, args, {\r\n cwd,\r\n stdio: 'inherit',\r\n shell: process.platform === 'win32',\r\n })\r\n if (result.error) {\r\n return { status: result.status, error: result.error }\r\n }\r\n return { status: result.status }\r\n}\r\n\r\nexport function scaffold(options: ScaffoldOptions): ScaffoldResult {\r\n const projectName = validateProjectName(options.projectName)\r\n const projectDir = options.targetDir\r\n ? join(options.targetDir, projectName)\r\n : join(process.cwd(), projectName)\r\n const pm = detectPackageManager(options.pm)\r\n\r\n if (existsSync(projectDir)) {\r\n if (!options.force) {\r\n throw new Error(\r\n `Directory \"${projectDir}\" already exists. Pass --force to overwrite or choose another name.`,\r\n )\r\n }\r\n rmSync(projectDir, { recursive: true, force: true })\r\n }\r\n\r\n mkdirSync(projectDir, { recursive: true })\r\n cpSync(resolveTemplateDir(), projectDir, { recursive: true })\r\n\r\n replacePlaceholders(projectDir, projectName)\r\n writeManifest(projectDir)\r\n\r\n if (!options.noGit) {\r\n const git = runCommand('git', ['init'], projectDir)\r\n if (git.error) {\r\n console.warn('⚠ git init skipped:', git.error.message)\r\n }\r\n }\r\n\r\n let installed = false\r\n let doctorRan = false\r\n let doctorExitCode: number | null = null\r\n let doctorVia: ScaffoldResult['doctorVia'] = 'skipped'\r\n\r\n if (!options.skipInstall) {\r\n console.log(`\\nInstalling dependencies with ${pm}…`)\r\n const install = installCommand(pm)\r\n const installResult = runCommand(install.command, install.args, projectDir)\r\n if (installResult.error) {\r\n throw installResult.error\r\n }\r\n if (installResult.status !== 0) {\r\n throw new Error(`${pm} install failed with exit code ${installResult.status ?? 1}`)\r\n }\r\n installed = true\r\n\r\n console.log('\\nRunning idia-ui doctor (non-strict)…')\r\n const doctor = resolveDoctorInvocation(pm)\r\n doctorVia = doctor.via\r\n const doctorResult = runCommand(doctor.command, doctor.args, projectDir)\r\n doctorRan = true\r\n doctorExitCode = doctorResult.status\r\n if (doctorResult.error) {\r\n console.warn('⚠ idia-ui doctor could not run:', doctorResult.error.message)\r\n doctorRan = false\r\n doctorExitCode = null\r\n } else if (doctorExitCode !== 0) {\r\n console.warn(\r\n `⚠ idia-ui doctor exited with code ${doctorExitCode}. Review warnings above; re-run after fixing peers.`,\r\n )\r\n }\r\n\r\n runPostScaffoldAddons(projectDir, pm, options)\r\n } else {\r\n console.log('\\n--skip-install: skipping dependency install and idia-ui doctor.')\r\n if (options.withStorybook || options.withBrain) {\r\n console.warn(\r\n '⚠ --with-storybook / --with-brain require install. After `pnpm install`, run idia-ui add storybook and/or idia-ui add brain.',\r\n )\r\n }\r\n }\r\n\r\n printNextSteps(projectName, projectDir, pm, options)\r\n\r\n return {\r\n projectDir,\r\n projectName,\r\n pm,\r\n installed,\r\n doctorRan,\r\n doctorExitCode,\r\n doctorVia,\r\n }\r\n}\r\n\r\nfunction runPostScaffoldAddons(\r\n projectDir: string,\r\n pm: PackageManager,\r\n options: Pick<ScaffoldOptions, 'withStorybook' | 'withBrain'>,\r\n): void {\r\n if (options.withStorybook) {\r\n console.log('\\nRunning idia-ui add storybook…')\r\n const add = resolveIdiaUiInvocation(pm, ['add', 'storybook'])\r\n const result = runCommand(add.command, add.args, projectDir)\r\n if (result.error) {\r\n console.warn('⚠ idia-ui add storybook could not run:', result.error.message)\r\n } else if (result.status !== 0) {\r\n console.warn(\r\n `⚠ idia-ui add storybook exited with code ${result.status ?? 1}. Re-run manually after fixing peers.`,\r\n )\r\n }\r\n }\r\n\r\n if (options.withBrain) {\r\n console.log('\\nRunning idia-ui add brain…')\r\n const add = resolveIdiaUiInvocation(pm, ['add', 'brain'])\r\n const result = runCommand(add.command, add.args, projectDir)\r\n if (result.error) {\r\n console.warn('⚠ idia-ui add brain could not run:', result.error.message)\r\n } else if (result.status !== 0) {\r\n console.warn(\r\n `⚠ idia-ui add brain exited with code ${result.status ?? 1}. Re-run manually after fixing peers.`,\r\n )\r\n }\r\n }\r\n}\r\n\r\nfunction printNextSteps(\r\n projectName: string,\r\n projectDir: string,\r\n pm: PackageManager,\r\n options: Pick<ScaffoldOptions, 'withStorybook' | 'withBrain'>,\r\n): void {\r\n const dev = devCommand(pm)\r\n console.log('\\n✓ Project scaffolded successfully\\n')\r\n console.log('Next steps:')\r\n console.log(` cd ${projectDir}`)\r\n if (!existsSync(join(projectDir, 'node_modules'))) {\r\n const install = installCommand(pm)\r\n console.log(` ${install.command} ${install.args.join(' ')}`)\r\n }\r\n console.log(` ${dev}`)\r\n console.log(` ${pm === 'npm' ? 'npx idia-ui doctor' : `${pm} exec idia-ui doctor`}`)\r\n if (!options.withStorybook) {\r\n console.log(` ${pm === 'npm' ? 'npx idia-ui add storybook' : `${pm} exec idia-ui add storybook`}`)\r\n }\r\n if (!options.withBrain) {\r\n console.log(` ${pm === 'npm' ? 'npx idia-ui add brain' : `${pm} exec idia-ui add brain`}`)\r\n }\r\n}\r\n","import { mkdirSync, readFileSync, writeFileSync } from 'node:fs'\r\nimport { join } from 'node:path'\r\n\r\nimport { CLI_VERSION, IDIA_UI_VERSION, TEMPLATE_SLUG } from './constants.js'\r\n\r\ntype PackageJson = {\r\n name?: string\r\n dependencies?: Record<string, string>\r\n devDependencies?: Record<string, string>\r\n}\r\n\r\nexport function toKebabCase(name: string): string {\r\n return name\r\n .trim()\r\n .replace(/[\\s_]+/g, '-')\r\n .replace(/([a-z])([A-Z])/g, '$1-$2')\r\n .toLowerCase()\r\n .replace(/[^a-z0-9-]/g, '-')\r\n .replace(/-+/g, '-')\r\n .replace(/^-|-$/g, '')\r\n}\r\n\r\nexport function validateProjectName(name: string): string {\r\n const slug = toKebabCase(name)\r\n if (!slug) {\r\n throw new Error('Project name is required.')\r\n }\r\n if (!/^[a-z][a-z0-9-]*$/.test(slug)) {\r\n throw new Error(\r\n `Invalid project name \"${name}\". Use lowercase letters, numbers, and hyphens (must start with a letter).`,\r\n )\r\n }\r\n return slug\r\n}\r\n\r\nexport function replacePlaceholders(projectDir: string, projectName: string): void {\r\n const packageJsonPath = join(projectDir, 'package.json')\r\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8')) as PackageJson\r\n\r\n packageJson.name = projectName\r\n\r\n for (const field of ['dependencies', 'devDependencies'] as const) {\r\n const deps = packageJson[field]\r\n if (!deps) continue\r\n for (const pkg of Object.keys(deps)) {\r\n if (pkg.startsWith('@idia-ui/')) {\r\n deps[pkg] = `^${IDIA_UI_VERSION}`\r\n }\r\n }\r\n }\r\n\r\n packageJson.devDependencies ??= {}\r\n packageJson.devDependencies['@idia-ui/cli'] = `^${CLI_VERSION}`\r\n\r\n writeFileSync(packageJsonPath, `${JSON.stringify(packageJson, null, 2)}\\n`, 'utf8')\r\n\r\n const appJsonPath = join(projectDir, 'app.json')\r\n const appJson = JSON.parse(readFileSync(appJsonPath, 'utf8')) as {\r\n expo: { name: string; slug: string; scheme: string }\r\n }\r\n appJson.expo.name = projectName\r\n appJson.expo.slug = projectName\r\n appJson.expo.scheme = projectName\r\n writeFileSync(appJsonPath, `${JSON.stringify(appJson, null, 2)}\\n`, 'utf8')\r\n\r\n const linkingPath = join(projectDir, 'src', 'navigation', 'linking.ts')\r\n let linking = readFileSync(linkingPath, 'utf8')\r\n linking = linking.replaceAll(TEMPLATE_SLUG, projectName)\r\n writeFileSync(linkingPath, linking, 'utf8')\r\n}\r\n\r\nexport function writeManifest(projectDir: string): void {\r\n const manifestDir = join(projectDir, '.idia')\r\n mkdirSync(manifestDir, { recursive: true })\r\n const manifestPath = join(manifestDir, 'manifest.json')\r\n const manifest = {\r\n idiaCli: CLI_VERSION,\r\n core: IDIA_UI_VERSION,\r\n }\r\n writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8')\r\n}\r\n","/** Monorepo-local @idia-ui/* minor — pins generated app deps (RFC §10.4). */\r\nexport const IDIA_UI_VERSION = '0.2.0'\r\n\r\n/** create-idia-app package version — keep in sync with package.json. */\r\nexport const CREATE_APP_VERSION = '0.2.1'\r\n\r\n/** @idia-ui/cli version written to manifest + devDependency. */\r\nexport const CLI_VERSION = '0.2.1'\r\n\r\nexport const TEMPLATE_SLUG = 'my-idia-app'\r\n","export type PackageManager = 'pnpm' | 'npm' | 'yarn'\r\n\r\nconst PM_VALUES = new Set<PackageManager>(['pnpm', 'npm', 'yarn'])\r\n\r\nexport function parsePackageManagerFlag(value: string | undefined): PackageManager | undefined {\r\n if (!value) return undefined\r\n const normalized = value.toLowerCase() as PackageManager\r\n if (!PM_VALUES.has(normalized)) {\r\n throw new Error(`Invalid --pm value \"${value}\". Use pnpm, npm, or yarn.`)\r\n }\r\n return normalized\r\n}\r\n\r\nexport function detectPackageManager(override?: PackageManager): PackageManager {\r\n if (override) return override\r\n\r\n const agent = process.env.npm_config_user_agent ?? ''\r\n if (agent.includes('pnpm')) return 'pnpm'\r\n if (agent.includes('yarn')) return 'yarn'\r\n\r\n const execPath = process.env.npm_execpath ?? ''\r\n if (execPath.includes('pnpm')) return 'pnpm'\r\n if (execPath.includes('yarn')) return 'yarn'\r\n\r\n return 'npm'\r\n}\r\n\r\nexport function installCommand(pm: PackageManager): { command: string; args: string[] } {\r\n switch (pm) {\r\n case 'pnpm':\r\n return { command: 'pnpm', args: ['install'] }\r\n case 'yarn':\r\n return { command: 'yarn', args: ['install'] }\r\n default:\r\n return { command: 'npm', args: ['install'] }\r\n }\r\n}\r\n\r\nexport function devCommand(pm: PackageManager): string {\r\n switch (pm) {\r\n case 'pnpm':\r\n return 'pnpm dev'\r\n case 'yarn':\r\n return 'yarn dev'\r\n default:\r\n return 'npm run dev'\r\n }\r\n}\r\n\r\nexport function doctorCommand(pm: PackageManager): { command: string; args: string[] } {\r\n return idiaUiCommand(pm, ['doctor'])\r\n}\r\n\r\nexport type IdiaUiCommand = { command: string; args: string[] }\r\n\r\nexport function idiaUiCommand(\r\n pm: PackageManager,\r\n subcommand: string[],\r\n): IdiaUiCommand {\r\n switch (pm) {\r\n case 'pnpm':\r\n return { command: 'pnpm', args: ['exec', 'idia-ui', ...subcommand] }\r\n case 'yarn':\r\n return { command: 'yarn', args: ['idia-ui', ...subcommand] }\r\n default:\r\n return { command: 'npx', args: ['idia-ui', ...subcommand] }\r\n }\r\n}\r\n","import { existsSync } from 'node:fs'\r\n\r\nimport { monorepoDoctorCliPath } from './paths.js'\r\nimport { idiaUiCommand, type PackageManager } from './pm.js'\r\n\r\n/** Monorepo sibling @idia-ui/cli when developing create-idia-app locally. */\r\nexport function resolveMonorepoDoctorCli(): string | null {\r\n const candidate = monorepoDoctorCliPath()\r\n return existsSync(candidate) ? candidate : null\r\n}\r\n\r\nexport function resolveIdiaUiInvocation(\r\n pm: PackageManager,\r\n subcommand: string[],\r\n): { command: string; args: string[]; via: 'monorepo' | 'installed' } {\r\n const monorepoCli = resolveMonorepoDoctorCli()\r\n if (monorepoCli) {\r\n return {\r\n command: process.execPath,\r\n args: [monorepoCli, ...subcommand],\r\n via: 'monorepo',\r\n }\r\n }\r\n\r\n const viaPm = idiaUiCommand(pm, subcommand)\r\n return { ...viaPm, via: 'installed' }\r\n}\r\n\r\nexport function resolveDoctorInvocation(\r\n pm: PackageManager,\r\n): { command: string; args: string[]; via: 'monorepo' | 'installed' } {\r\n return resolveIdiaUiInvocation(pm, ['doctor'])\r\n}\r\n","import { dirname, join } from 'node:path'\r\n\r\n/** CLI entry file (dist/index.js) — reliable in CJS bin bundles. */\r\nfunction cliEntryPath(): string {\r\n const entry = process.argv[1]\r\n if (!entry) {\r\n throw new Error('Unable to resolve CLI entry path.')\r\n }\r\n return entry\r\n}\r\n\r\nexport function packageRootDir(): string {\r\n return join(dirname(cliEntryPath()), '..')\r\n}\r\n\r\nexport function templateDir(): string {\r\n return join(packageRootDir(), 'template')\r\n}\r\n\r\nexport function monorepoDoctorCliPath(): string {\r\n return join(packageRootDir(), '..', 'cli', 'dist', 'cli.js')\r\n}\r\n","import { scaffold } from './scaffold.js'\r\nimport { parsePackageManagerFlag } from './pm.js'\r\nimport { CREATE_APP_VERSION } from './constants.js'\r\n\r\nfunction printHelp(): void {\r\n console.log(`create-idia-app v${CREATE_APP_VERSION}\r\n\r\nUsage:\r\n create-idia-app [project-name] [options]\r\n\r\nOptions:\r\n --pm <pnpm|npm|yarn> Override package manager detection\r\n --skip-install Skip install and idia-ui doctor\r\n --force Overwrite target directory if it exists\r\n --no-git Skip git init\r\n --with-storybook Not available (Phase 3) — prints warning\r\n --with-brain Not available (Phase 4) — prints warning\r\n -h, --help Show help\r\n -V, --version Show version\r\n`)\r\n}\r\n\r\nfunction parseArgs(argv: string[]): {\r\n projectName?: string\r\n pm?: ReturnType<typeof parsePackageManagerFlag>\r\n skipInstall: boolean\r\n force: boolean\r\n noGit: boolean\r\n withStorybook: boolean\r\n withBrain: boolean\r\n help: boolean\r\n version: boolean\r\n} {\r\n const result = {\r\n projectName: undefined as string | undefined,\r\n pm: undefined as ReturnType<typeof parsePackageManagerFlag>,\r\n skipInstall: false,\r\n force: false,\r\n noGit: false,\r\n withStorybook: false,\r\n withBrain: false,\r\n help: false,\r\n version: false,\r\n }\r\n\r\n for (let i = 0; i < argv.length; i += 1) {\r\n const arg = argv[i]\r\n switch (arg) {\r\n case '--pm':\r\n result.pm = parsePackageManagerFlag(argv[++i])\r\n break\r\n case '--skip-install':\r\n result.skipInstall = true\r\n break\r\n case '--force':\r\n result.force = true\r\n break\r\n case '--no-git':\r\n result.noGit = true\r\n break\r\n case '--with-storybook':\r\n result.withStorybook = true\r\n break\r\n case '--with-brain':\r\n result.withBrain = true\r\n break\r\n case '-h':\r\n case '--help':\r\n result.help = true\r\n break\r\n case '-V':\r\n case '--version':\r\n result.version = true\r\n break\r\n default:\r\n if (arg.startsWith('-')) {\r\n throw new Error(`Unknown option: ${arg}`)\r\n }\r\n if (!result.projectName) {\r\n result.projectName = arg\r\n } else {\r\n throw new Error(`Unexpected argument: ${arg}`)\r\n }\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\nfunction main(): void {\r\n try {\r\n const args = parseArgs(process.argv.slice(2))\r\n\r\n if (args.help) {\r\n printHelp()\r\n return\r\n }\r\n\r\n if (args.version) {\r\n console.log(CREATE_APP_VERSION)\r\n return\r\n }\r\n\r\n if (!args.projectName) {\r\n printHelp()\r\n throw new Error('Project name is required. Example: create-idia-app my-app')\r\n }\r\n\r\n scaffold({\r\n projectName: args.projectName,\r\n targetDir: process.cwd(),\r\n pm: args.pm,\r\n skipInstall: args.skipInstall,\r\n force: args.force,\r\n noGit: args.noGit,\r\n withStorybook: args.withStorybook,\r\n withBrain: args.withBrain,\r\n })\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error)\r\n console.error(`\\nError: ${message}`)\r\n process.exit(1)\r\n }\r\n}\r\n\r\nmain()\r\n"],"mappings":"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","names":["import_node_fs","import_node_path","import_node_fs","import_node_path"]}
|
|
1
|
+
{"version":3,"sources":["../src/scaffold.ts","../src/replace.ts","../src/constants.ts","../src/pm.ts","../src/doctor.ts","../src/paths.ts","../src/index.ts"],"sourcesContent":["import { cpSync, existsSync, mkdirSync, rmSync } from 'node:fs'\r\nimport { join } from 'node:path'\r\nimport { spawnSync } from 'node:child_process'\r\n\r\nimport { replacePlaceholders, validateProjectName, writeManifest } from './replace.js'\r\nimport {\r\n detectPackageManager,\r\n devCommand,\r\n installCommand,\r\n type PackageManager,\r\n} from './pm.js'\r\nimport { resolveDoctorInvocation, resolveIdiaUiInvocation } from './doctor.js'\r\nimport { templateDir } from './paths.js'\r\n\r\nexport type ScaffoldOptions = {\r\n projectName: string\r\n targetDir: string\r\n pm?: PackageManager\r\n skipInstall?: boolean\r\n force?: boolean\r\n noGit?: boolean\r\n withStorybook?: boolean\r\n withBrain?: boolean\r\n}\r\n\r\nexport type ScaffoldResult = {\r\n projectDir: string\r\n projectName: string\r\n pm: PackageManager\r\n installed: boolean\r\n doctorRan: boolean\r\n doctorExitCode: number | null\r\n doctorVia: 'monorepo' | 'installed' | 'skipped'\r\n}\r\n\r\nfunction resolveTemplateDir(): string {\r\n const bundled = templateDir()\r\n if (existsSync(bundled)) return bundled\r\n throw new Error(\r\n 'Template directory missing. Run `pnpm run build` in packages/create-idia-app first.',\r\n )\r\n}\r\n\r\nfunction runCommand(\r\n command: string,\r\n args: string[],\r\n cwd: string,\r\n): { status: number | null; error?: Error } {\r\n const isWin = process.platform === 'win32'\r\n const result = spawnSync(command, args, {\r\n cwd,\r\n stdio: 'inherit',\r\n shell: isWin,\r\n windowsHide: isWin,\r\n })\r\n if (result.error) {\r\n return { status: result.status, error: result.error }\r\n }\r\n return { status: result.status ?? 0 }\r\n}\r\n\r\nexport function scaffold(options: ScaffoldOptions): ScaffoldResult {\r\n const projectName = validateProjectName(options.projectName)\r\n const projectDir = options.targetDir\r\n ? join(options.targetDir, projectName)\r\n : join(process.cwd(), projectName)\r\n const pm = detectPackageManager(options.pm)\r\n\r\n if (existsSync(projectDir)) {\r\n if (!options.force) {\r\n throw new Error(\r\n `Directory \"${projectDir}\" already exists. Pass --force to overwrite or choose another name.`,\r\n )\r\n }\r\n rmSync(projectDir, { recursive: true, force: true })\r\n }\r\n\r\n mkdirSync(projectDir, { recursive: true })\r\n cpSync(resolveTemplateDir(), projectDir, { recursive: true })\r\n\r\n replacePlaceholders(projectDir, projectName)\r\n writeManifest(projectDir)\r\n\r\n if (!options.noGit) {\r\n const git = runCommand('git', ['init'], projectDir)\r\n if (git.error) {\r\n console.warn('⚠ git init skipped:', git.error.message)\r\n }\r\n }\r\n\r\n let installed = false\r\n let doctorRan = false\r\n let doctorExitCode: number | null = null\r\n let doctorVia: ScaffoldResult['doctorVia'] = 'skipped'\r\n\r\n if (!options.skipInstall) {\r\n console.log(`\\nInstalling dependencies with ${pm}…`)\r\n const install = installCommand(pm)\r\n const installResult = runCommand(install.command, install.args, projectDir)\r\n if (installResult.error) {\r\n throw installResult.error\r\n }\r\n if (installResult.status !== 0) {\r\n throw new Error(`${pm} install failed with exit code ${installResult.status ?? 1}`)\r\n }\r\n installed = true\r\n\r\n console.log('\\nRunning idia-ui doctor (non-strict)…')\r\n const doctor = resolveDoctorInvocation(pm)\r\n doctorVia = doctor.via\r\n const doctorResult = runCommand(doctor.command, doctor.args, projectDir)\r\n doctorRan = true\r\n doctorExitCode = doctorResult.status\r\n if (doctorResult.error) {\r\n console.warn('⚠ idia-ui doctor could not run:', doctorResult.error.message)\r\n doctorRan = false\r\n doctorExitCode = null\r\n } else if (doctorExitCode !== 0) {\r\n console.warn(\r\n `⚠ idia-ui doctor exited with code ${doctorExitCode}. Review warnings above; re-run after fixing peers.`,\r\n )\r\n }\r\n\r\n runPostScaffoldAddons(projectDir, pm, options)\r\n } else {\r\n console.log('\\n--skip-install: skipping dependency install and idia-ui doctor.')\r\n if (options.withStorybook || options.withBrain) {\r\n console.warn(\r\n '⚠ --with-storybook / --with-brain require install. After `pnpm install`, run idia-ui add storybook and/or idia-ui add brain.',\r\n )\r\n }\r\n }\r\n\r\n printNextSteps(projectName, projectDir, pm, options)\r\n\r\n return {\r\n projectDir,\r\n projectName,\r\n pm,\r\n installed,\r\n doctorRan,\r\n doctorExitCode,\r\n doctorVia,\r\n }\r\n}\r\n\r\nfunction runPostScaffoldAddons(\r\n projectDir: string,\r\n pm: PackageManager,\r\n options: Pick<ScaffoldOptions, 'withStorybook' | 'withBrain'>,\r\n): void {\r\n if (options.withStorybook) {\r\n console.log('\\nRunning idia-ui add storybook…')\r\n const add = resolveIdiaUiInvocation(pm, ['add', 'storybook'])\r\n const result = runCommand(add.command, add.args, projectDir)\r\n if (result.error) {\r\n console.warn('⚠ idia-ui add storybook could not run:', result.error.message)\r\n } else if (result.status !== 0) {\r\n console.warn(\r\n `⚠ idia-ui add storybook exited with code ${result.status ?? 1}. Re-run manually after fixing peers.`,\r\n )\r\n }\r\n }\r\n\r\n if (options.withBrain) {\r\n console.log('\\nRunning idia-ui add brain…')\r\n const add = resolveIdiaUiInvocation(pm, ['add', 'brain'])\r\n const result = runCommand(add.command, add.args, projectDir)\r\n if (result.error) {\r\n console.warn('⚠ idia-ui add brain could not run:', result.error.message)\r\n } else if (result.status !== 0) {\r\n console.warn(\r\n `⚠ idia-ui add brain exited with code ${result.status ?? 1}. Re-run manually after fixing peers.`,\r\n )\r\n }\r\n }\r\n}\r\n\r\nfunction printNextSteps(\r\n projectName: string,\r\n projectDir: string,\r\n pm: PackageManager,\r\n options: Pick<ScaffoldOptions, 'withStorybook' | 'withBrain'>,\r\n): void {\r\n const dev = devCommand(pm)\r\n console.log('\\n✓ Project scaffolded successfully\\n')\r\n console.log('Next steps:')\r\n console.log(` cd ${projectDir}`)\r\n if (!existsSync(join(projectDir, 'node_modules'))) {\r\n const install = installCommand(pm)\r\n console.log(` ${install.command} ${install.args.join(' ')}`)\r\n }\r\n console.log(` ${dev}`)\r\n console.log(` ${pm === 'npm' ? 'npx idia-ui doctor' : `${pm} exec idia-ui doctor`}`)\r\n if (!options.withStorybook) {\r\n console.log(` ${pm === 'npm' ? 'npx idia-ui add storybook' : `${pm} exec idia-ui add storybook`}`)\r\n }\r\n if (!options.withBrain) {\r\n console.log(` ${pm === 'npm' ? 'npx idia-ui add brain' : `${pm} exec idia-ui add brain`}`)\r\n }\r\n}\r\n","import { mkdirSync, readFileSync, writeFileSync } from 'node:fs'\r\nimport { join } from 'node:path'\r\n\r\nimport { CLI_VERSION, IDIA_UI_VERSION, TEMPLATE_SLUG } from './constants.js'\r\n\r\ntype PackageJson = {\r\n name?: string\r\n dependencies?: Record<string, string>\r\n devDependencies?: Record<string, string>\r\n}\r\n\r\nexport function toKebabCase(name: string): string {\r\n return name\r\n .trim()\r\n .replace(/[\\s_]+/g, '-')\r\n .replace(/([a-z])([A-Z])/g, '$1-$2')\r\n .toLowerCase()\r\n .replace(/[^a-z0-9-]/g, '-')\r\n .replace(/-+/g, '-')\r\n .replace(/^-|-$/g, '')\r\n}\r\n\r\nexport function validateProjectName(name: string): string {\r\n const slug = toKebabCase(name)\r\n if (!slug) {\r\n throw new Error('Project name is required.')\r\n }\r\n if (!/^[a-z][a-z0-9-]*$/.test(slug)) {\r\n throw new Error(\r\n `Invalid project name \"${name}\". Use lowercase letters, numbers, and hyphens (must start with a letter).`,\r\n )\r\n }\r\n return slug\r\n}\r\n\r\nexport function replacePlaceholders(projectDir: string, projectName: string): void {\r\n const packageJsonPath = join(projectDir, 'package.json')\r\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8')) as PackageJson\r\n\r\n packageJson.name = projectName\r\n\r\n for (const field of ['dependencies', 'devDependencies'] as const) {\r\n const deps = packageJson[field]\r\n if (!deps) continue\r\n for (const pkg of Object.keys(deps)) {\r\n if (pkg.startsWith('@idia-ui/')) {\r\n deps[pkg] = `^${IDIA_UI_VERSION}`\r\n }\r\n }\r\n }\r\n\r\n packageJson.devDependencies ??= {}\r\n packageJson.devDependencies['@idia-ui/cli'] = `^${CLI_VERSION}`\r\n\r\n writeFileSync(packageJsonPath, `${JSON.stringify(packageJson, null, 2)}\\n`, 'utf8')\r\n\r\n const appJsonPath = join(projectDir, 'app.json')\r\n const appJson = JSON.parse(readFileSync(appJsonPath, 'utf8')) as {\r\n expo: { name: string; slug: string; scheme: string }\r\n }\r\n appJson.expo.name = projectName\r\n appJson.expo.slug = projectName\r\n appJson.expo.scheme = projectName\r\n writeFileSync(appJsonPath, `${JSON.stringify(appJson, null, 2)}\\n`, 'utf8')\r\n\r\n const linkingPath = join(projectDir, 'src', 'navigation', 'linking.ts')\r\n let linking = readFileSync(linkingPath, 'utf8')\r\n linking = linking.replaceAll(TEMPLATE_SLUG, projectName)\r\n writeFileSync(linkingPath, linking, 'utf8')\r\n}\r\n\r\nexport function writeManifest(projectDir: string): void {\r\n const manifestDir = join(projectDir, '.idia')\r\n mkdirSync(manifestDir, { recursive: true })\r\n const manifestPath = join(manifestDir, 'manifest.json')\r\n const manifest = {\r\n idiaCli: CLI_VERSION,\r\n core: IDIA_UI_VERSION,\r\n }\r\n writeFileSync(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8')\r\n}\r\n","/** Monorepo-local @idia-ui/* minor — pins generated app deps (RFC §10.4). */\r\nexport const IDIA_UI_VERSION = '0.2.0'\r\n\r\n/** create-idia-app package version — keep in sync with package.json. */\r\nexport const CREATE_APP_VERSION = '0.2.2'\r\n\r\n/** @idia-ui/cli version written to manifest + devDependency. */\r\nexport const CLI_VERSION = '0.2.3'\r\n\r\nexport const TEMPLATE_SLUG = 'my-idia-app'\r\n","export type PackageManager = 'pnpm' | 'npm' | 'yarn'\r\n\r\nconst PM_VALUES = new Set<PackageManager>(['pnpm', 'npm', 'yarn'])\r\n\r\nexport function parsePackageManagerFlag(value: string | undefined): PackageManager | undefined {\r\n if (!value) return undefined\r\n const normalized = value.toLowerCase() as PackageManager\r\n if (!PM_VALUES.has(normalized)) {\r\n throw new Error(`Invalid --pm value \"${value}\". Use pnpm, npm, or yarn.`)\r\n }\r\n return normalized\r\n}\r\n\r\nexport function detectPackageManager(override?: PackageManager): PackageManager {\r\n if (override) return override\r\n\r\n const agent = process.env.npm_config_user_agent ?? ''\r\n if (agent.includes('pnpm')) return 'pnpm'\r\n if (agent.includes('yarn')) return 'yarn'\r\n\r\n const execPath = process.env.npm_execpath ?? ''\r\n if (execPath.includes('pnpm')) return 'pnpm'\r\n if (execPath.includes('yarn')) return 'yarn'\r\n\r\n return 'npm'\r\n}\r\n\r\nexport function installCommand(pm: PackageManager): { command: string; args: string[] } {\r\n switch (pm) {\r\n case 'pnpm':\r\n return { command: 'pnpm', args: ['install'] }\r\n case 'yarn':\r\n return { command: 'yarn', args: ['install'] }\r\n default:\r\n return { command: 'npm', args: ['install'] }\r\n }\r\n}\r\n\r\nexport function devCommand(pm: PackageManager): string {\r\n switch (pm) {\r\n case 'pnpm':\r\n return 'pnpm dev'\r\n case 'yarn':\r\n return 'yarn dev'\r\n default:\r\n return 'npm run dev'\r\n }\r\n}\r\n\r\nexport function doctorCommand(pm: PackageManager): { command: string; args: string[] } {\r\n return idiaUiCommand(pm, ['doctor'])\r\n}\r\n\r\nexport type IdiaUiCommand = { command: string; args: string[] }\r\n\r\nexport function idiaUiCommand(\r\n pm: PackageManager,\r\n subcommand: string[],\r\n): IdiaUiCommand {\r\n switch (pm) {\r\n case 'pnpm':\r\n return { command: 'pnpm', args: ['exec', 'idia-ui', ...subcommand] }\r\n case 'yarn':\r\n return { command: 'yarn', args: ['idia-ui', ...subcommand] }\r\n default:\r\n return { command: 'npx', args: ['idia-ui', ...subcommand] }\r\n }\r\n}\r\n","import { existsSync } from 'node:fs'\r\n\r\nimport { monorepoDoctorCliPath } from './paths.js'\r\nimport { idiaUiCommand, type PackageManager } from './pm.js'\r\n\r\n/** Monorepo sibling @idia-ui/cli when developing create-idia-app locally. */\r\nexport function resolveMonorepoDoctorCli(): string | null {\r\n const candidate = monorepoDoctorCliPath()\r\n return existsSync(candidate) ? candidate : null\r\n}\r\n\r\nexport function resolveIdiaUiInvocation(\r\n pm: PackageManager,\r\n subcommand: string[],\r\n): { command: string; args: string[]; via: 'monorepo' | 'installed' } {\r\n const monorepoCli = resolveMonorepoDoctorCli()\r\n if (monorepoCli) {\r\n return {\r\n command: process.execPath,\r\n args: [monorepoCli, ...subcommand],\r\n via: 'monorepo',\r\n }\r\n }\r\n\r\n const viaPm = idiaUiCommand(pm, subcommand)\r\n return { ...viaPm, via: 'installed' }\r\n}\r\n\r\nexport function resolveDoctorInvocation(\r\n pm: PackageManager,\r\n): { command: string; args: string[]; via: 'monorepo' | 'installed' } {\r\n return resolveIdiaUiInvocation(pm, ['doctor'])\r\n}\r\n","import { dirname, join } from 'node:path'\r\n\r\n/** CLI entry file (dist/index.js) — reliable in CJS bin bundles. */\r\nfunction cliEntryPath(): string {\r\n const entry = process.argv[1]\r\n if (!entry) {\r\n throw new Error('Unable to resolve CLI entry path.')\r\n }\r\n return entry\r\n}\r\n\r\nexport function packageRootDir(): string {\r\n return join(dirname(cliEntryPath()), '..')\r\n}\r\n\r\nexport function templateDir(): string {\r\n return join(packageRootDir(), 'template')\r\n}\r\n\r\nexport function monorepoDoctorCliPath(): string {\r\n return join(packageRootDir(), '..', 'cli', 'dist', 'cli.js')\r\n}\r\n","import { scaffold } from './scaffold.js'\r\nimport { parsePackageManagerFlag } from './pm.js'\r\nimport { CREATE_APP_VERSION } from './constants.js'\r\n\r\nfunction printHelp(): void {\r\n console.log(`create-idia-app v${CREATE_APP_VERSION}\r\n\r\nUsage:\r\n create-idia-app [project-name] [options]\r\n\r\nOptions:\r\n --pm <pnpm|npm|yarn> Override package manager detection\r\n --skip-install Skip install and idia-ui doctor\r\n --force Overwrite target directory if it exists\r\n --no-git Skip git init\r\n --with-storybook Not available (Phase 3) — prints warning\r\n --with-brain Not available (Phase 4) — prints warning\r\n -h, --help Show help\r\n -V, --version Show version\r\n`)\r\n}\r\n\r\nfunction parseArgs(argv: string[]): {\r\n projectName?: string\r\n pm?: ReturnType<typeof parsePackageManagerFlag>\r\n skipInstall: boolean\r\n force: boolean\r\n noGit: boolean\r\n withStorybook: boolean\r\n withBrain: boolean\r\n help: boolean\r\n version: boolean\r\n} {\r\n const result = {\r\n projectName: undefined as string | undefined,\r\n pm: undefined as ReturnType<typeof parsePackageManagerFlag>,\r\n skipInstall: false,\r\n force: false,\r\n noGit: false,\r\n withStorybook: false,\r\n withBrain: false,\r\n help: false,\r\n version: false,\r\n }\r\n\r\n for (let i = 0; i < argv.length; i += 1) {\r\n const arg = argv[i]\r\n switch (arg) {\r\n case '--pm':\r\n result.pm = parsePackageManagerFlag(argv[++i])\r\n break\r\n case '--skip-install':\r\n result.skipInstall = true\r\n break\r\n case '--force':\r\n result.force = true\r\n break\r\n case '--no-git':\r\n result.noGit = true\r\n break\r\n case '--with-storybook':\r\n result.withStorybook = true\r\n break\r\n case '--with-brain':\r\n result.withBrain = true\r\n break\r\n case '-h':\r\n case '--help':\r\n result.help = true\r\n break\r\n case '-V':\r\n case '--version':\r\n result.version = true\r\n break\r\n default:\r\n if (arg.startsWith('-')) {\r\n throw new Error(`Unknown option: ${arg}`)\r\n }\r\n if (!result.projectName) {\r\n result.projectName = arg\r\n } else {\r\n throw new Error(`Unexpected argument: ${arg}`)\r\n }\r\n }\r\n }\r\n\r\n return result\r\n}\r\n\r\nfunction main(): void {\r\n try {\r\n const args = parseArgs(process.argv.slice(2))\r\n\r\n if (args.help) {\r\n printHelp()\r\n return\r\n }\r\n\r\n if (args.version) {\r\n console.log(CREATE_APP_VERSION)\r\n return\r\n }\r\n\r\n if (!args.projectName) {\r\n printHelp()\r\n throw new Error('Project name is required. Example: create-idia-app my-app')\r\n }\r\n\r\n scaffold({\r\n projectName: args.projectName,\r\n targetDir: process.cwd(),\r\n pm: args.pm,\r\n skipInstall: args.skipInstall,\r\n force: args.force,\r\n noGit: args.noGit,\r\n withStorybook: args.withStorybook,\r\n withBrain: args.withBrain,\r\n })\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : String(error)\r\n console.error(`\\nError: ${message}`)\r\n process.exit(1)\r\n }\r\n}\r\n\r\nmain()\r\n"],"mappings":"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","names":["import_node_fs","import_node_path","import_node_fs","import_node_path"]}
|
package/package.json
CHANGED
package/template/package.json
CHANGED
|
@@ -1,19 +1,47 @@
|
|
|
1
|
+
import { NavigationProvider, type RouteTarget } from '@idia-ui/core'
|
|
1
2
|
import { ThemeProvider, useColorMode, waitForWebFonts } from '@idia-ui/theme'
|
|
2
|
-
import {
|
|
3
|
-
|
|
3
|
+
import {
|
|
4
|
+
createNavigationContainerRef,
|
|
5
|
+
NavigationContainer,
|
|
6
|
+
} from '@react-navigation/native'
|
|
7
|
+
import React, { useCallback, useEffect, useState } from 'react'
|
|
4
8
|
import { StyleSheet } from 'react-native'
|
|
5
9
|
import { GestureHandlerRootView } from 'react-native-gesture-handler'
|
|
6
10
|
import { SafeAreaProvider } from 'react-native-safe-area-context'
|
|
7
11
|
import { TamaguiProvider, Theme } from 'tamagui'
|
|
8
12
|
|
|
9
13
|
import { linking } from '@/navigation/linking'
|
|
14
|
+
import type { RootStackParamList } from '@/navigation/types'
|
|
10
15
|
import tamaguiConfig from '../../tamagui.config'
|
|
11
16
|
|
|
17
|
+
const navigationRef = createNavigationContainerRef<RootStackParamList>()
|
|
18
|
+
|
|
12
19
|
function TamaguiThemeSync({ children }: { children: React.ReactNode }) {
|
|
13
20
|
const { colorMode } = useColorMode()
|
|
14
21
|
return <Theme name={colorMode}>{children}</Theme>
|
|
15
22
|
}
|
|
16
23
|
|
|
24
|
+
function navigateFromTarget(target: string | RouteTarget): void {
|
|
25
|
+
if (!navigationRef.isReady()) return
|
|
26
|
+
const nav = navigationRef.navigate as unknown as (
|
|
27
|
+
name: string,
|
|
28
|
+
params?: Record<string, unknown>,
|
|
29
|
+
) => void
|
|
30
|
+
if (typeof target === 'string') {
|
|
31
|
+
nav(target)
|
|
32
|
+
return
|
|
33
|
+
}
|
|
34
|
+
nav(target.pathname, target.params)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function IdiaNavigationBridge({ children }: { children: React.ReactNode }) {
|
|
38
|
+
const navigate = useCallback((target: string | RouteTarget) => {
|
|
39
|
+
navigateFromTarget(target)
|
|
40
|
+
}, [])
|
|
41
|
+
|
|
42
|
+
return <NavigationProvider navigate={navigate}>{children}</NavigationProvider>
|
|
43
|
+
}
|
|
44
|
+
|
|
17
45
|
export function AppProviders({ children }: { children: React.ReactNode }) {
|
|
18
46
|
const [fontsReady, setFontsReady] = useState(false)
|
|
19
47
|
|
|
@@ -31,7 +59,9 @@ export function AppProviders({ children }: { children: React.ReactNode }) {
|
|
|
31
59
|
<ThemeProvider defaultColorMode="system">
|
|
32
60
|
<TamaguiThemeSync>
|
|
33
61
|
<SafeAreaProvider>
|
|
34
|
-
<NavigationContainer linking={linking}>
|
|
62
|
+
<NavigationContainer ref={navigationRef} linking={linking}>
|
|
63
|
+
<IdiaNavigationBridge>{children}</IdiaNavigationBridge>
|
|
64
|
+
</NavigationContainer>
|
|
35
65
|
</SafeAreaProvider>
|
|
36
66
|
</TamaguiThemeSync>
|
|
37
67
|
</ThemeProvider>
|