@capgo/cli 4.13.9 โ†’ 4.13.10

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