• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

skmtc / skmtc / 18384956961

09 Oct 2025 06:08PM UTC coverage: 37.986% (-0.2%) from 38.143%
18384956961

push

github

dmitrigrabov
Skip broken test

406 of 486 branches covered (83.54%)

Branch coverage included in aggregate %.

4185 of 11600 relevant lines covered (36.08%)

11.6 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

9.09
/deno/cli/components/AddGeneratorView.tsx
1
import React from 'react'
4✔
2
import { type ViewStateAddGenerator, useSkmtc } from '@/components/SkmtcContext.tsx'
4✔
3
import { Project } from '@/lib/project.ts'
4✔
4
import type { RemoteProject } from '@/lib/remote-project.ts'
5
import { useMemo, useState, useEffect } from 'react'
4✔
6
import { SelectTask } from './SelectTask.tsx'
4✔
7
import invariant from 'tiny-invariant'
4✔
8
import type { Task } from './TaskContext.tsx'
9
import { TaskListView } from './TaskListView.tsx'
4✔
10
import { TaskProvider } from './TaskContext.tsx'
4✔
11
import { StringTask } from './StringTask.tsx'
4✔
12

13
type AddGeneratorViewProps = {
14
  project: Project | RemoteProject
15
  view: ViewStateAddGenerator
16
}
17

18
export const AddGeneratorView = ({ project, view }: AddGeneratorViewProps) => {
×
19
  const { dispatch, dispatchMessage, state } = useSkmtc()
×
20

21
  const [adding, setAdding] = useState(false)
×
22
  const username = state.session?.user.user_metadata.user_name
×
23

24
  const includeTypeQuestion = useMemo(() => {
×
25
    return typeof view.generatorType !== 'string'
×
26
  }, [view.generatorType])
×
27

28
  const includeNameQuestion = useMemo(() => {
×
29
    return typeof view.generatorName !== 'string' && typeof view.generatorType === 'string'
×
30
  }, [view.generatorName, view.generatorType])
×
31

32
  // Execute add generator when all inputs are collected
33
  useEffect(() => {
×
34
    if (view.generatorName && view.generatorType && project instanceof Project && !adding) {
×
35
      setAdding(true)
×
36

37
      project
×
38
        .addGenerator({ moduleName: view.generatorName, type: view.generatorType, username })
×
39
        .then(() => {
×
40
          dispatchMessage({ success: `Generator "${view.generatorName}" created successfully` })
×
41
        })
×
42
        .catch(error => {
×
43
          console.error(error)
×
44

45
          dispatchMessage({ error: `Failed to add generator "${view.generatorName}"` })
×
46
        })
×
47
        .finally(() => {
×
48
          setAdding(false)
×
49
          dispatch({ type: 'set-view', payload: { page: 'project', projectName: project.name } })
×
50
        })
×
51
    }
×
52
  }, [view.generatorName, view.generatorType, adding])
×
53

54
  const tasks: Task[] = [
×
55
    {
×
56
      key: 'generator-type-task',
×
57
      include: includeTypeQuestion,
×
58
      render: () => <GeneratorTypeTask />
×
59
    },
×
60
    {
×
61
      key: 'generator-name-task',
×
62
      include: includeNameQuestion,
×
63
      render: () => <GeneratorNameTask />
×
64
    }
×
65
  ]
×
66

67
  return (
×
68
    <TaskProvider
×
69
      tasks={tasks}
×
70
      leave={() => {
×
71
        if (state.interactive) {
×
72
          dispatch({ type: 'set-view', payload: { page: 'project', projectName: project.name } })
×
73
        } else {
×
74
          dispatch({ type: 'set-view', payload: { page: 'exit' } })
×
75
        }
×
76
      }}
×
77
    >
78
      <TaskListView />
×
79
    </TaskProvider>
80
  )
81
}
×
82

83
const GeneratorTypeTask = () => {
×
84
  const { state, dispatch } = useSkmtc()
×
85

86
  return (
×
87
    <SelectTask
×
88
      prompt="Generator type"
×
89
      options={[
×
90
        { label: 'operation', value: 'operation' },
×
91
        { label: 'model', value: 'model' }
×
92
      ]}
×
93
      setValue={value => {
×
94
        const { view } = state
×
95

96
        invariant(view.page === 'add-generator', 'Generator type is required')
×
97

98
        dispatch({
×
99
          type: 'set-view',
×
100
          payload: {
×
101
            ...view,
×
102
            generatorType: value as 'operation' | 'model'
×
103
          }
×
104
        })
×
105
      }}
×
106
    />
107
  )
108
}
×
109

110
const GeneratorNameTask = () => {
×
111
  const { state, dispatch } = useSkmtc()
×
112

113
  return (
×
114
    <StringTask
×
115
      prompt="Generator name"
×
116
      setValue={value => {
×
117
        const { view } = state
×
118

119
        invariant(view.page === 'add-generator', 'Generator name is required')
×
120

121
        dispatch({
×
122
          type: 'set-view',
×
123
          payload: {
×
124
            ...view,
×
125
            generatorName: value
×
126
          }
×
127
        })
×
128
      }}
×
129
    />
130
  )
131
}
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc