@capgo/cli 5.0.0-alpha.7 โ†’ 5.0.0

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.
Files changed (59) hide show
  1. package/README.md +197 -41
  2. package/dist/index.js +329 -95820
  3. package/dist/package.json +83 -0
  4. package/package.json +48 -62
  5. package/.eslintignore +0 -4
  6. package/.github/FUNDING.yml +0 -1
  7. package/.github/workflows/build.yml +0 -46
  8. package/.github/workflows/bump_version.yml +0 -56
  9. package/.github/workflows/test.yml +0 -30
  10. package/.prettierignore +0 -6
  11. package/.vscode/launch.json +0 -23
  12. package/.vscode/settings.json +0 -5
  13. package/.vscode/tasks.json +0 -42
  14. package/CHANGELOG.md +0 -2861
  15. package/build.mjs +0 -23
  16. package/bun.lockb +0 -0
  17. package/capacitor.config.ts +0 -33
  18. package/crypto_explained.png +0 -0
  19. package/eslint.config.js +0 -3
  20. package/renovate.json +0 -23
  21. package/src/api/app.ts +0 -75
  22. package/src/api/channels.ts +0 -140
  23. package/src/api/crypto.ts +0 -121
  24. package/src/api/devices_override.ts +0 -41
  25. package/src/api/update.ts +0 -12
  26. package/src/api/versions.ts +0 -101
  27. package/src/app/add.ts +0 -191
  28. package/src/app/debug.ts +0 -220
  29. package/src/app/delete.ts +0 -106
  30. package/src/app/info.ts +0 -87
  31. package/src/app/list.ts +0 -67
  32. package/src/app/set.ts +0 -94
  33. package/src/bundle/check.ts +0 -42
  34. package/src/bundle/cleanup.ts +0 -127
  35. package/src/bundle/compatibility.ts +0 -70
  36. package/src/bundle/decrypt.ts +0 -65
  37. package/src/bundle/delete.ts +0 -53
  38. package/src/bundle/encrypt.ts +0 -69
  39. package/src/bundle/list.ts +0 -43
  40. package/src/bundle/unlink.ts +0 -86
  41. package/src/bundle/upload.ts +0 -516
  42. package/src/bundle/zip.ts +0 -139
  43. package/src/channel/add.ts +0 -73
  44. package/src/channel/currentBundle.ts +0 -72
  45. package/src/channel/delete.ts +0 -51
  46. package/src/channel/list.ts +0 -49
  47. package/src/channel/set.ts +0 -174
  48. package/src/index.ts +0 -290
  49. package/src/init.ts +0 -301
  50. package/src/key.ts +0 -158
  51. package/src/login.ts +0 -66
  52. package/src/types/capacitor__cli.d.ts +0 -6
  53. package/src/types/supabase.types.ts +0 -2471
  54. package/src/utils.ts +0 -738
  55. package/test/chunk_convert.ts +0 -28
  56. package/test/data.ts +0 -18769
  57. package/test/test_headers_rls.ts +0 -24
  58. package/test/test_semver.ts +0 -13
  59. package/tsconfig.json +0 -39
@@ -1,73 +0,0 @@
1
- import process from 'node:process'
2
- import { program } from 'commander'
3
- import * as p from '@clack/prompts'
4
- import { checkAppExistsAndHasPermissionOrgErr } from '../api/app'
5
- import { createChannel, findUnknownVersion } from '../api/channels'
6
- import type { OptionsBase } from '../utils'
7
- import { EMPTY_UUID, OrganizationPerm, createSupabaseClient, findSavedKey, getConfig, useLogSnag, verifyUser } from '../utils'
8
-
9
- interface Options extends OptionsBase {
10
- default?: boolean
11
- }
12
-
13
- export async function addChannel(channelId: string, appId: string, options: Options, shouldExit = true) {
14
- p.intro(`Create channel`)
15
- options.apikey = options.apikey || findSavedKey()
16
- const config = await getConfig()
17
- appId = appId || config?.app?.appId
18
- const snag = useLogSnag()
19
-
20
- if (!options.apikey) {
21
- p.log.error('Missing API key, you need to provide a API key to upload your bundle')
22
- program.error('')
23
- }
24
- if (!appId) {
25
- p.log.error('Missing argument, you need to provide a appId, or be in a capacitor project')
26
- program.error('')
27
- }
28
- const supabase = await createSupabaseClient(options.apikey)
29
-
30
- const userId = await verifyUser(supabase, options.apikey, ['write', 'all'])
31
- // Check we have app access to this appId
32
- await checkAppExistsAndHasPermissionOrgErr(supabase, options.apikey, appId, OrganizationPerm.admin)
33
-
34
- p.log.info(`Creating channel ${appId}#${channelId} to Capgo`)
35
- try {
36
- const data = await findUnknownVersion(supabase, appId)
37
- if (!data) {
38
- p.log.error(`Cannot find default version for channel creation, please contact Capgo support ๐Ÿคจ`)
39
- program.error('')
40
- }
41
- await createChannel(supabase, {
42
- name: channelId,
43
- app_id: appId,
44
- version: data.id,
45
- owner_org: EMPTY_UUID,
46
- })
47
- p.log.success(`Channel created โœ…`)
48
- await snag.track({
49
- channel: 'channel',
50
- event: 'Create channel',
51
- icon: 'โœ…',
52
- user_id: userId,
53
- tags: {
54
- 'app-id': appId,
55
- 'channel': channelId,
56
- },
57
- notify: false,
58
- }).catch()
59
- }
60
- catch (error) {
61
- p.log.error(`Cannot create Channel ๐Ÿ™€`)
62
- return false
63
- }
64
- if (shouldExit) {
65
- p.outro(`Done โœ…`)
66
- process.exit()
67
- }
68
- return true
69
- }
70
-
71
- export async function addChannelCommand(apikey: string, appId: string, options: Options) {
72
- addChannel(apikey, appId, options, true)
73
- }
@@ -1,72 +0,0 @@
1
- import process from 'node:process'
2
- import { program } from 'commander'
3
- import * as p from '@clack/prompts'
4
- import { checkAppExistsAndHasPermissionOrgErr } from '../api/app'
5
- import type { OptionsBase } from '../utils'
6
- import { OrganizationPerm, createSupabaseClient, findSavedKey, getConfig, verifyUser } from '../utils'
7
-
8
- interface Options extends OptionsBase {
9
- channel?: string
10
- quiet?: boolean
11
- }
12
-
13
- interface Channel {
14
- version: {
15
- name: string
16
- }
17
- }
18
-
19
- export async function currentBundle(channel: string, appId: string, options: Options) {
20
- const { quiet } = options
21
-
22
- if (!quiet)
23
- p.intro(`List current bundle`)
24
-
25
- options.apikey = options.apikey || findSavedKey(quiet)
26
- const config = await getConfig()
27
- appId = appId || config?.app?.appId
28
-
29
- if (!options.apikey) {
30
- p.log.error('Missing API key, you need to provide a API key to upload your bundle')
31
- program.error('')
32
- }
33
- if (!appId) {
34
- p.log.error('Missing argument, you need to provide a appId, or be in a capacitor project')
35
- program.error('')
36
- }
37
- const supabase = await createSupabaseClient(options.apikey)
38
-
39
- const _userId = await verifyUser(supabase, options.apikey, ['write', 'all', 'read'])
40
- // Check we have app access to this appId
41
- await checkAppExistsAndHasPermissionOrgErr(supabase, options.apikey, appId, OrganizationPerm.read)
42
-
43
- if (!channel) {
44
- p.log.error(`Please provide a channel to get the bundle from.`)
45
- program.error('')
46
- }
47
-
48
- const { data: supabaseChannel, error } = await supabase
49
- .from('channels')
50
- .select('version ( name )')
51
- .eq('name', channel)
52
- .eq('app_id', appId)
53
- .limit(1)
54
-
55
- if (error || supabaseChannel.length === 0) {
56
- p.log.error(`Error retrieving channel ${channel} for app ${appId}. Perhaps the channel does not exists?`)
57
- program.error('')
58
- }
59
-
60
- const { version } = supabaseChannel[0] as any as Channel
61
- if (!version) {
62
- p.log.error(`Error retrieving channel ${channel} for app ${appId}. Perhaps the channel does not exists?`)
63
- program.error('')
64
- }
65
-
66
- if (!quiet)
67
- p.log.info(`Current bundle for channel ${channel} is ${version.name}`)
68
- else
69
- p.log.info(version.name)
70
-
71
- process.exit()
72
- }
@@ -1,51 +0,0 @@
1
- import process from 'node:process'
2
- import { program } from 'commander'
3
- import * as p from '@clack/prompts'
4
- import { checkAppExistsAndHasPermissionOrgErr } from '../api/app'
5
- import { delChannel } from '../api/channels'
6
- import type { OptionsBase } from '../utils'
7
- import { OrganizationPerm, createSupabaseClient, findSavedKey, getConfig, useLogSnag, verifyUser } from '../utils'
8
-
9
- export async function deleteChannel(channelId: string, appId: string, options: OptionsBase) {
10
- p.intro(`Delete channel`)
11
- options.apikey = options.apikey || findSavedKey()
12
- const config = await getConfig()
13
- appId = appId || config?.app?.appId
14
- const snag = useLogSnag()
15
-
16
- if (!options.apikey) {
17
- p.log.error('Missing API key, you need to provide a API key to upload your bundle')
18
- program.error('')
19
- }
20
- if (!appId) {
21
- p.log.error('Missing argument, you need to provide a appId, or be in a capacitor project')
22
- program.error('')
23
- }
24
- const supabase = await createSupabaseClient(options.apikey)
25
-
26
- const userId = await verifyUser(supabase, options.apikey, ['write', 'all'])
27
- // Check we have app access to this appId
28
- await checkAppExistsAndHasPermissionOrgErr(supabase, options.apikey, appId, OrganizationPerm.admin)
29
-
30
- p.log.info(`Deleting channel ${appId}#${channelId} from Capgo`)
31
- try {
32
- await delChannel(supabase, channelId, appId, userId)
33
- p.log.success(`Channel deleted`)
34
- await snag.track({
35
- channel: 'channel',
36
- event: 'Delete channel',
37
- icon: 'โœ…',
38
- tags: {
39
- 'user-id': userId,
40
- 'app-id': appId,
41
- 'channel': channelId,
42
- },
43
- notify: false,
44
- }).catch()
45
- }
46
- catch (error) {
47
- p.log.error(`Cannot delete Channel ๐Ÿ™€`)
48
- }
49
- p.outro(`Done โœ…`)
50
- process.exit()
51
- }
@@ -1,49 +0,0 @@
1
- import process from 'node:process'
2
- import { program } from 'commander'
3
- import * as p from '@clack/prompts'
4
- import { checkAppExistsAndHasPermissionOrgErr } from '../api/app'
5
- import { displayChannels, getActiveChannels } from '../api/channels'
6
- import type { OptionsBase } from '../utils'
7
- import { OrganizationPerm, createSupabaseClient, findSavedKey, getConfig, useLogSnag, verifyUser } from '../utils'
8
-
9
- export async function listChannels(appId: string, options: OptionsBase) {
10
- p.intro(`List channels`)
11
- options.apikey = options.apikey || findSavedKey()
12
- const config = await getConfig()
13
- appId = appId || config?.app?.appId
14
- const snag = useLogSnag()
15
-
16
- if (!options.apikey)
17
- p.log.error('Missing API key, you need to provide a API key to upload your bundle')
18
-
19
- if (!appId) {
20
- p.log.error('Missing argument, you need to provide a appId, or be in a capacitor project')
21
- program.error('')
22
- }
23
- const supabase = await createSupabaseClient(options.apikey)
24
-
25
- const userId = await verifyUser(supabase, options.apikey, ['write', 'all', 'read', 'upload'])
26
- // Check we have app access to this appId
27
- await checkAppExistsAndHasPermissionOrgErr(supabase, options.apikey, appId, OrganizationPerm.read)
28
-
29
- p.log.info(`Querying available channels in Capgo`)
30
-
31
- // Get all active app versions we might possibly be able to cleanup
32
- const allVersions = await getActiveChannels(supabase, appId)
33
-
34
- p.log.info(`Active channels in Capgo: ${allVersions?.length}`)
35
-
36
- displayChannels(allVersions)
37
- await snag.track({
38
- channel: 'channel',
39
- event: 'List channel',
40
- icon: 'โœ…',
41
- user_id: userId,
42
- tags: {
43
- 'app-id': appId,
44
- },
45
- notify: false,
46
- }).catch()
47
- p.outro(`Done โœ…`)
48
- process.exit()
49
- }
@@ -1,174 +0,0 @@
1
- import process from 'node:process'
2
- import { program } from 'commander'
3
- import * as p from '@clack/prompts'
4
- import type { Database } from '../types/supabase.types'
5
- import { checkAppExistsAndHasPermissionOrgErr } from '../api/app'
6
- import type {
7
- OptionsBase,
8
- } from '../utils'
9
- import {
10
- OrganizationPerm,
11
- checkPlanValid,
12
- createSupabaseClient,
13
- findSavedKey,
14
- formatError,
15
- getConfig,
16
- getOrganizationId,
17
- updateOrCreateChannel,
18
- useLogSnag,
19
- verifyUser,
20
- } from '../utils'
21
-
22
- interface Options extends OptionsBase {
23
- bundle: string
24
- state?: string
25
- downgrade?: boolean
26
- latest?: boolean
27
- upgrade?: boolean
28
- ios?: boolean
29
- android?: boolean
30
- selfAssign?: boolean
31
- disableAutoUpdate: string
32
- channel?: string
33
- }
34
-
35
- const disableAutoUpdatesPossibleOptions = ['major', 'minor', 'metadata', 'patch', 'none']
36
-
37
- export async function setChannel(channel: string, appId: string, options: Options) {
38
- p.intro(`Set channel`)
39
- options.apikey = options.apikey || findSavedKey()
40
- const config = await getConfig()
41
- appId = appId || config?.app?.appId
42
- const snag = useLogSnag()
43
-
44
- if (!options.apikey) {
45
- p.log.error('Missing API key, you need to provide a API key to upload your bundle')
46
- program.error('')
47
- }
48
- if (!appId) {
49
- p.log.error('Missing argument, you need to provide a appId, or be in a capacitor project')
50
- program.error('')
51
- }
52
- const supabase = await createSupabaseClient(options.apikey)
53
-
54
- const userId = await verifyUser(supabase, options.apikey, ['write', 'all'])
55
- // Check we have app access to this appId
56
- await checkAppExistsAndHasPermissionOrgErr(supabase, options.apikey, appId, OrganizationPerm.admin)
57
- const orgId = await getOrganizationId(supabase, appId)
58
-
59
- const { bundle, latest, downgrade, upgrade, ios, android, selfAssign, state, disableAutoUpdate } = options
60
- if (!channel) {
61
- p.log.error('Missing argument, you need to provide a channel')
62
- program.error('')
63
- }
64
- if (latest && bundle) {
65
- p.log.error('Cannot set latest and bundle at the same time')
66
- program.error('')
67
- }
68
- if (bundle == null
69
- && state == null
70
- && latest == null
71
- && downgrade == null
72
- && upgrade == null
73
- && ios == null
74
- && android == null
75
- && selfAssign == null
76
- && disableAutoUpdate == null) {
77
- p.log.error('Missing argument, you need to provide a option to set')
78
- program.error('')
79
- }
80
- try {
81
- await checkPlanValid(supabase, orgId, options.apikey, appId)
82
- const channelPayload: Database['public']['Tables']['channels']['Insert'] = {
83
- created_by: userId,
84
- app_id: appId,
85
- name: channel,
86
- version: undefined as any,
87
- }
88
- const bundleVersion = latest ? config?.app?.package?.version : bundle
89
- if (bundleVersion != null) {
90
- const { data, error: vError } = await supabase
91
- .from('app_versions')
92
- .select()
93
- .eq('app_id', appId)
94
- .eq('name', bundleVersion)
95
- .eq('user_id', userId)
96
- .eq('deleted', false)
97
- .single()
98
- if (vError || !data) {
99
- p.log.error(`Cannot find version ${bundleVersion}`)
100
- program.error('')
101
- }
102
- p.log.info(`Set ${appId} channel: ${channel} to @${bundleVersion}`)
103
- channelPayload.version = data.id
104
- }
105
- if (state != null) {
106
- if (state === 'public' || state === 'private')
107
- p.log.info(`Set ${appId} channel: ${channel} to public or private is deprecated, use default or normal instead`)
108
-
109
- p.log.info(`Set ${appId} channel: ${channel} to ${state === 'public' || state === 'default' ? 'default' : 'normal'}`)
110
- channelPayload.public = state === 'public' || state === 'default'
111
- }
112
- if (downgrade != null) {
113
- p.log.info(`Set ${appId} channel: ${channel} to ${downgrade ? 'allow' : 'disallow'} downgrade`)
114
- channelPayload.disableAutoUpdateUnderNative = !downgrade
115
- }
116
- if (ios != null) {
117
- p.log.info(`Set ${appId} channel: ${channel} to ${ios ? 'allow' : 'disallow'} ios update`)
118
- channelPayload.ios = !!ios
119
- }
120
- if (android != null) {
121
- p.log.info(`Set ${appId} channel: ${channel} to ${android ? 'allow' : 'disallow'} android update`)
122
- channelPayload.android = !!android
123
- }
124
- if (selfAssign != null) {
125
- p.log.info(`Set ${appId} channel: ${channel} to ${selfAssign ? 'allow' : 'disallow'} self assign to this channel`)
126
- channelPayload.allow_device_self_set = !!selfAssign
127
- }
128
- if (disableAutoUpdate != null) {
129
- let finalDisableAutoUpdate = disableAutoUpdate.toLocaleLowerCase()
130
-
131
- // The user passed an unimplemented strategy
132
- if (!disableAutoUpdatesPossibleOptions.includes(finalDisableAutoUpdate)) {
133
- p.log.error(`Channel strategy ${finalDisableAutoUpdate} is not known. The possible values are: ${disableAutoUpdatesPossibleOptions.join(', ')}.`)
134
- program.error('')
135
- }
136
-
137
- // This metadata is called differently in the database
138
- if (finalDisableAutoUpdate === 'metadata')
139
- finalDisableAutoUpdate = 'version_number'
140
-
141
- // This cast is safe, look above
142
- channelPayload.disableAutoUpdate = finalDisableAutoUpdate as any
143
- p.log.info(`Set ${appId} channel: ${channel} to ${finalDisableAutoUpdate} disable update strategy to this channel`)
144
- }
145
- try {
146
- const { error: dbError } = await updateOrCreateChannel(supabase, channelPayload)
147
- if (dbError) {
148
- p.log.error(`Cannot set channel the upload key is not allowed to do that, use the "all" for this.`)
149
- program.error('')
150
- }
151
- }
152
- catch (e) {
153
- p.log.error(`Cannot set channel the upload key is not allowed to do that, use the "all" for this.`)
154
- program.error('')
155
- }
156
- await snag.track({
157
- channel: 'channel',
158
- event: 'Set channel',
159
- icon: 'โœ…',
160
- user_id: userId,
161
- tags: {
162
- 'user-id': userId,
163
- 'app-id': appId,
164
- },
165
- notify: false,
166
- }).catch()
167
- }
168
- catch (err) {
169
- p.log.error(`Unknow error ${formatError(err)}`)
170
- program.error('')
171
- }
172
- p.outro(`Done โœ…`)
173
- process.exit()
174
- }