Skip to content
This repository was archived by the owner on Dec 10, 2024. It is now read-only.

Commit c46492c

Browse files
feat(nuxt): capacitor module (#205)
* initial commit * capacitor changes * fix: some capcitor changes * chore: capacitor config structure changed * feat: ios android fast conf to add project * execSync * fix: add android * feat: Capacitor and ESLint configurations * feat: add capacitor open commands to package.json * feat: add support for iOS and Android in eslint.config.js and Capacitor module * feat: plugins * feat: android * feat: capacitor runtime configuration --------- Co-authored-by: productdevbook <hi@productdevbook.com>
1 parent 3ba3b80 commit c46492c

File tree

93 files changed

+2413
-168
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

93 files changed

+2413
-168
lines changed

eslint.config.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ export default antfu(
2626
'**/templates.json',
2727
'packages-core/pergel/nuxt.js',
2828
'**/pergel/**',
29+
'**/ios/**',
30+
'**/android/**',
2931
],
3032
},
3133
{

packages-core/cli/playground/pergel/README.json

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,35 @@
1717
"devDependencies": {}
1818
}
1919
},
20+
"capacitor": {
21+
"comment-block": "If pergel cli is installed, you can run `pergel install` automatically to install",
22+
"scripts": {
23+
"capacitor:init": "npx cap init",
24+
"capacitor:sync": "npx cap sync",
25+
"capacitor:android": "npx cap android",
26+
"capacitor:ios": "npx cap ios",
27+
"generate": "nuxt generate"
28+
},
29+
"cli": {
30+
"capacitor:init": "pergel module -c=true -s=capacitor:init -p=test -m=capacitor",
31+
"capacitor:sync": "pergel module -c=true -s=capacitor:sync -p=test -m=capacitor",
32+
"capacitor:android": "pergel module -c=true -s=capacitor:android -p=test -m=capacitor",
33+
"capacitor:ios": "pergel module -c=true -s=capacitor:ios -p=test -m=capacitor",
34+
"generate": "pergel module -s=generate -p=changeName -m=capacitor"
35+
},
36+
"env": {},
37+
"packageJson": {
38+
"dependencies": {
39+
"@capacitor/cli": "^5.7.1"
40+
},
41+
"devDependencies": {},
42+
"patches": {
43+
"pnpm": {
44+
"patchedDependencies": {}
45+
}
46+
}
47+
}
48+
},
2049
"lucia": {
2150
"comment-block-hpaj9e": "If pergel cli is installed, you can run `pergel install` automatically to install",
2251
"packageJson": {
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { CapacitorConfig } from '@capacitor/cli';
2+
3+
const config: CapacitorConfig = {
4+
appId: 'com.example.app',
5+
appName: 'test',
6+
webDir: 'dist',
7+
server: {
8+
androidScheme: 'https'
9+
}
10+
};
11+
12+
export default config;

packages/nuxt/package.json

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,10 +78,17 @@
7878
"devDependencies": {
7979
"@antfu/eslint-config": "^2.7.0",
8080
"@aws-sdk/client-ses": "^3.525.0",
81+
"@capacitor/action-sheet": "^6.0.0-rc.0",
82+
"@capacitor/android": "^6.0.0-rc.0",
83+
"@capacitor/cli": "^6.0.0-rc.0",
84+
"@capacitor/core": "^6.0.0-rc.0",
85+
"@capacitor/ios": "^6.0.0-rc.0",
8186
"@faker-js/faker": "^8.4.1",
8287
"@graphql-yoga/urql-exchange": "^3.1.1",
8388
"@iconify-json/carbon": "^1.1.30",
8489
"@iconify-json/ph": "^1.1.11",
90+
"@ionic/cli": "^7.2.0",
91+
"@ionic/core": "^7.7.3",
8592
"@json2csv/node": "^7.0.6",
8693
"@lucia-auth/adapter-drizzle": "1.0.2",
8794
"@lucia-auth/adapter-postgresql": "3.1.0",
@@ -90,10 +97,12 @@
9097
"@nuxt/module-builder": "^0.5.5",
9198
"@nuxt/schema": "^3.10.3",
9299
"@nuxt/test-utils": "^3.11.0",
100+
"@nuxtjs/ionic": "^0.13.1",
93101
"@pergel/cli": "^0.8.1",
94102
"@pergel/module-box": "workspace:^",
95103
"@pergel/module-graphql": "workspace:^",
96104
"@pergel/module-s3": "workspace:^",
105+
"@revenuecat/purchases-capacitor": "^7.5.3",
97106
"@types/node": "^20.11.24",
98107
"@types/node-cron": "^3.0.11",
99108
"@urql/core": "^4.2.3",

packages/nuxt/src/runtime/core/types/nuxtModule.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import type { IonicInterface, ResolvedIonicInterface } from '../../modules/ionic
1111
import type { EslintConfig, ResolvedEslintConfig } from '../../modules/eslint/types'
1212
import type { RenovateConfig, ResolvedRenovateConfig } from '../../modules/renovate/types'
1313
import type { ResolvedUrqlConfig, UrqlModuleOptions } from '../../modules/urql/types'
14+
import type { CapacitorOptions, ResolvedCapacitorOptions } from '../../modules/capacitor/types'
1415
import type { ResolvedPergelModuleOptions, UserModuleOptions } from './module'
1516

1617
// @MODULE
@@ -25,6 +26,7 @@ export interface PergelNuxtModules {
2526
lucia?: true | (LuciaModuleOptions & UserModuleOptions)
2627
box?: true | (BoxOptions & UserModuleOptions)
2728
ionic?: true | IonicInterface
29+
capacitor?: true | CapacitorOptions
2830
urql?: true | UrqlModuleOptions
2931
vitest?: true
3032
eslint?: true | EslintConfig
@@ -46,6 +48,7 @@ export interface ResolvedPergelNuxtModuleConfig<T> {
4648
vitest?: true | T
4749
eslint?: true | ResolvedEslintConfig
4850
renovate?: true | ResolvedRenovateConfig
51+
capacitor?: true | ResolvedCapacitorOptions
4952
}
5053

5154
export type PergelModuleNames = keyof PergelNuxtModules
Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
import { existsSync, writeFileSync } from 'node:fs'
2+
import { resolve } from 'node:path'
3+
import { execSync } from 'node:child_process'
4+
import { logger as _logger } from '@nuxt/kit'
5+
import { definePergelModule } from '../../core/definePergel'
6+
import { generateModuleRuntimeConfig, generateModuleRuntimeConfigEnv } from '../../core/utils/moduleRuntimeConfig'
7+
import { generateProjectReadme } from '../../core/utils/generateYaml'
8+
import type { CapacitorModuleRuntimeConfig, CapacitorOptions } from '../capacitor/types'
9+
import type { ResolvedCapacitorOptions } from './types'
10+
11+
export default definePergelModule<CapacitorOptions, ResolvedCapacitorOptions>({
12+
meta: {
13+
name: 'capacitor',
14+
version: '0.0.1',
15+
dependencies(options, nuxt) {
16+
const deps = nuxt._pergel.pergelPackageJson
17+
const defaultDeps = {
18+
'@capacitor/core': deps['@capacitor/core'],
19+
'@capacitor/ios': deps['@capacitor/ios'],
20+
'@capacitor/android': deps['@capacitor/android'],
21+
} as Record<string, string>
22+
23+
if (options.plugins.official) {
24+
if (options.plugins.official.actionSheet)
25+
defaultDeps['@capacitor/action-sheet'] = deps['@capacitor/action-sheet']
26+
}
27+
28+
if (options.plugins.community) {
29+
if (options.plugins.community.revenuecat)
30+
defaultDeps['@revenuecat/purchases-capacitor'] = deps['@revenuecat/purchases-capacitor']
31+
}
32+
33+
return {
34+
...defaultDeps,
35+
}
36+
},
37+
devDependencies(_options, nuxt) {
38+
const deps = nuxt._pergel.pergelPackageJson
39+
return {
40+
'@capacitor/cli': deps['@capacitor/cli'],
41+
}
42+
},
43+
},
44+
defaults: {
45+
capacitorConfig: {
46+
appName: 'My App',
47+
appId: 'com.example.app',
48+
webDir: 'dist',
49+
plugins: {
50+
SplashScreen: {
51+
launchShowDuration: 0,
52+
},
53+
},
54+
},
55+
ios: false,
56+
android: false,
57+
plugins: {
58+
official: {
59+
actionSheet: false,
60+
},
61+
community: {
62+
revenuecat: false,
63+
},
64+
},
65+
},
66+
async setup({ nuxt, options }) {
67+
generateModuleRuntimeConfigEnv(nuxt, options, {
68+
runTargetAndroidEmulator: undefined,
69+
runTargetIOSSimulator: undefined,
70+
runScheme: undefined,
71+
})
72+
73+
const envData = generateModuleRuntimeConfig<CapacitorModuleRuntimeConfig>(nuxt, options, {
74+
runTargetIOSSimulator: undefined,
75+
runTargetAndroidEmulator: undefined,
76+
runScheme: undefined,
77+
}, true)
78+
79+
const capacitorConfig = `import { type CapacitorConfig } from '@capacitor/cli';
80+
81+
const config: CapacitorConfig = ${JSON.stringify(options.capacitorConfig, null, 2).replace(/"([^"]+)":/g, '$1:')}
82+
83+
export default config;`
84+
generateModuleRuntimeConfig(nuxt, options, {
85+
})
86+
87+
nuxt.options.vite.optimizeDeps = nuxt.options.vite.optimizeDeps || {}
88+
nuxt.options.vite.optimizeDeps.include = nuxt.options.vite.optimizeDeps.include || []
89+
90+
if (!existsSync(resolve(nuxt.options.rootDir, 'capacitor.config.ts'))) {
91+
writeFileSync(resolve(nuxt.options.rootDir, 'capacitor.config.ts'), capacitorConfig, {
92+
encoding: 'utf8',
93+
})
94+
}
95+
96+
const { projectName, moduleName } = options
97+
98+
if (options.ios && !existsSync(resolve(nuxt.options.rootDir, 'ios'))) {
99+
execSync(
100+
`pnpm pergel module -s=capacitor:add:ios -p=${projectName} -m=${moduleName}`,
101+
{
102+
stdio: 'inherit',
103+
cwd: nuxt.options.rootDir,
104+
},
105+
)
106+
_logger.info(`iOS platform added to ${projectName}`)
107+
}
108+
109+
if (options.android && !existsSync(resolve(nuxt.options.rootDir, 'android'))) {
110+
execSync(
111+
`pnpm pergel module -s=capacitor:add:android -p=${projectName} -m=${moduleName}`,
112+
{
113+
stdio: 'inherit',
114+
cwd: nuxt.options.rootDir,
115+
},
116+
)
117+
_logger.info(`Android platform added to ${projectName}`)
118+
}
119+
120+
generateProjectReadme({
121+
data: ({ addCommentBlock }) => ({
122+
...addCommentBlock('Script Commands'),
123+
scripts: {
124+
'capacitor:init': 'cap init',
125+
'capacitor:sync': 'cap sync',
126+
'capacitor:update': 'cap update',
127+
'capacitor:ls': 'cap ls',
128+
'capacitor:copy': 'cap copy',
129+
'capacitor:add:android': 'cap add android',
130+
'capacitor:add:ios': 'cap add ios',
131+
'generate': 'nuxt generate',
132+
'capacitor:open:android': 'cap open android',
133+
'capacitor:open:ios': 'cap open ios',
134+
'capacitor:ios:list': 'cap run ios --list',
135+
'capacitor:android:list': 'cap run android --list',
136+
'run:ios:device': `cap run ios --target=${envData.runtimeConfig?.runTargetIOSSimulator}`,
137+
'run:android:device': `cap run android --target=${envData.runtimeConfig?.runTargetAndroidEmulator}`,
138+
},
139+
cli: {
140+
'init': `pergel module -s=capacitor:init -p=${projectName} -m=${moduleName}`,
141+
'sync': `pergel module -s=capacitor:sync -p=${projectName} -m=${moduleName}`,
142+
'build:sync': `pergel module -s=generate -p=${projectName} -m=${moduleName} && pergel module -s=capacitor:sync -p=${projectName} -m=${moduleName}`,
143+
'add:android': `pergel module -s=capacitor:android -p=${projectName} -m=${moduleName}`,
144+
'add:ios': `pergel module -s=capacitor:ios -p=${projectName} -m=${moduleName}`,
145+
'generate': `pergel module -s=generate -p=${projectName} -m=${moduleName}`,
146+
'open:android': `pergel module -s=capacitor:open:android -p=${projectName} -m=${moduleName}`,
147+
'open:ios': `pergel module -s=capacitor:open:ios -p=${projectName} -m=${moduleName}`,
148+
'list:ios': `pergel module -s=capacitor:ios:list -p=${projectName} -m=${moduleName}`,
149+
'list:android': `pergel module -s=capacitor:android:list -p=${projectName} -m=${moduleName}`,
150+
'run:ios:device': `pergel module -s=run:ios:device -p=${projectName} -m=${moduleName}`,
151+
'run:android:device': `pergel module -s=run:android:device -p=${projectName} -m=${moduleName}`,
152+
'update': `pergel module -s=capacitor:update -p=${projectName} -m=${moduleName}`,
153+
'copy': `pergel module -s=capacitor:copy -p=${projectName} -m=${moduleName}`,
154+
'ls': `pergel module -s=capacitor:ls -p=${projectName} -m=${moduleName}`,
155+
},
156+
}),
157+
nuxt,
158+
moduleName,
159+
projectName,
160+
})
161+
},
162+
})
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// import type { AnimationBuilder, Mode, PlatformConfig, SpinnerTypes, TabButtonLayout } from '@ionic/core'
2+
import type { CapacitorConfig } from '@capacitor/cli'
3+
4+
export interface ResolvedCapacitorOptions {
5+
capacitorConfig: CapacitorOptions
6+
ios: boolean
7+
android: boolean
8+
plugins: {
9+
official: {
10+
actionSheet: boolean
11+
}
12+
community: {
13+
revenuecat: boolean
14+
}
15+
}
16+
}
17+
18+
export interface CapacitorOptions {
19+
/**
20+
* This key capacitor.config.ts is used to configure Capacitor.
21+
*/
22+
capacitorConfig?: CapacitorConfig
23+
/**
24+
* This key capacitor.config.ts is used to configure Capacitor.
25+
* @default false
26+
*/
27+
ios?: boolean
28+
/**
29+
* This key capacitor.config.ts is used to configure Capacitor.
30+
* @default false
31+
*/
32+
android?: boolean
33+
34+
plugins?: {
35+
official?: {
36+
actionSheet?: boolean
37+
}
38+
community?: {
39+
revenuecat?: boolean
40+
}
41+
}
42+
}
43+
44+
export interface CapacitorModuleRuntimeConfig {
45+
/** set the target device to run the app on */
46+
runTargetIOSSimulator?: string
47+
48+
/** set the target emulator to run the app on */
49+
runTargetAndroidEmulator?: string
50+
51+
/** set the scheme of the iOS project */
52+
runScheme?: string
53+
}

packages/nuxt/src/runtime/modules/eslint/core.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ export function pergelEslintConfig(input?: {
3636
'**/dist/**',
3737
'**/.nuxt',
3838
'**/.output',
39+
'**/.output/**',
3940
'**/.dist',
4041
'**/.github',
4142
'**/coverage',
@@ -49,6 +50,9 @@ export function pergelEslintConfig(input?: {
4950
'**/pergel/**',
5051
'**/migrations/**',
5152
'migrations',
53+
// Capacitor specific ignores
54+
'**/ios/**',
55+
'**/android/**',
5256
],
5357
...input?.pergel ?? {},
5458
},

packages/nuxt/src/runtime/modules/ionic/index.ts

Lines changed: 7 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ import { join, resolve } from 'node:path'
33
import { installModule } from '@nuxt/kit'
44
import type { ModuleOptions } from '@nuxtjs/ionic'
55
import { definePergelModule } from '../../core/definePergel'
6-
import { generateModuleRuntimeConfig } from '../../core/utils/moduleRuntimeConfig'
76
import { generateProjectReadme } from '../../core/utils/generateYaml'
87
import type { IonicInterface, ResolvedIonicInterface } from './types'
98

@@ -15,11 +14,13 @@ export default definePergelModule<IonicInterface, ResolvedIonicInterface>({
1514
meta: {
1615
name: 'ionic',
1716
version: '0.0.1',
18-
dependencies: {
19-
'@nuxtjs/ionic': '^0.13.0',
20-
'@ionic/cli': '^7.2.0',
21-
'@ionic/core': '^7.6.3',
22-
'@capacitor/cli': '^5.6.0',
17+
dependencies(_options, nuxt) {
18+
const deps = nuxt._pergel.pergelPackageJson
19+
return {
20+
'@nuxtjs/ionic': deps['@nuxtjs/ionic'],
21+
'@ionic/cli': deps['@ionic/cli'],
22+
'@ionic/core': deps['@ionic/core'],
23+
}
2324
},
2425
},
2526
defaults: {
@@ -34,19 +35,6 @@ export default definePergelModule<IonicInterface, ResolvedIonicInterface>({
3435
},
3536
async setup({ nuxt, options }) {
3637
console.log('ionic test', options.appName)
37-
const capacitorConfig = `
38-
import { CapacitorConfig } from '@capacitor/cli';
39-
40-
const config: CapacitorConfig = ${JSON.stringify(options.capacitorConfig)}
41-
42-
export default config;`
43-
// const nuxtConfig = `
44-
// export default defineNuxtConfig({
45-
// ${JSON.stringify(options.nuxtConfig)}
46-
// })`
47-
// env için
48-
generateModuleRuntimeConfig(nuxt, options, {
49-
})
5038

5139
// TODO: add docs
5240
if (options.defaultCss)

0 commit comments

Comments
 (0)