-
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProjects.fs
More file actions
227 lines (217 loc) · 7.06 KB
/
Projects.fs
File metadata and controls
227 lines (217 loc) · 7.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
module Projects
open System
open System.IO
open Fake.IO
open Fake.Core
open Spec
[<Literal>]
let private primitiveBase = "Partas.Solid.Primitives"
[<Struct>]
type PackageName = PackageName of string
module PackageName =
let create = PackageName
let get = function PackageName value -> value
let map func = function PackageName value -> func value |> create
let createWithBase = create >> map (sprintf "%s.%s" primitiveBase)
[<Struct>]
type NpmPackage =
| Versioned of name: string * vers: Semver.SemVersion
| Basic of name: string
| NotProvided
module Semver =
let create (major: int) (minor: int) (patch: int) = Semver.SemVersion(major,minor,patch)
module NpmPackage =
let createSemVersioned (major,minor,patch) name=
( name,
(major,minor,patch)
|||> Semver.create )
|> NpmPackage.Versioned
let createVersioned vers name =
(name,vers)
|> NpmPackage.Versioned
let create = NpmPackage.Basic
let none = NpmPackage.NotProvided
type Project = {
Path: string
Name: PackageName
NpmPackage: NpmPackage voption
}
type private ProjectBuilder() =
member inline _.Yield(_: unit) = ()
member inline _.Yield(value: Project) = value
member inline _.Delay(y) = y()
[<CustomOperation "path">]
member inline _.ProjectPath(_: unit, value: string) =
{
Path = value
Name =
value
|> Path.GetFileNameWithoutExtension
|> PackageName.create
NpmPackage = ValueNone
}
[<CustomOperation "projectWithoutBase">]
member inline _.ProjectOp(this: Project, value: string) =
{ this with
Name = value |> PackageName.create }
[<CustomOperation "project">]
member inline _.ProjectWithBaseOp(this: Project, value: string) =
{ this with
Name = value |> PackageName.createWithBase }
[<CustomOperation "npm">]
member inline _.NpmPackageName(this: Project, value: string) =
match this with
| { NpmPackage = ValueSome(NpmPackage.Versioned(name,semVer)) } ->
{ this with
NpmPackage =
value
|> sprintf "@solid-primitives/%s"
|> NpmPackage.createVersioned semVer
|> ValueSome }
| { NpmPackage = _ } ->
{ this with
NpmPackage =
value
|> sprintf "@solid-primitives/%s"
|> NpmPackage.create
|> ValueSome }
[<CustomOperation "npmWithSemver">]
member inline _.NpmWithSemVer(this: Project, name, major: int, ?minor: int, ?patch: int) =
let minor = defaultArg minor 0
let patch = defaultArg patch 0
{ this with NpmPackage = NpmPackage.createSemVersioned (major, minor, patch) name |> ValueSome }
member inline _.Run(state: Project) =
state
let private project = ProjectBuilder()
module Projects =
let common = project {
path Files.Root.``Partas.Solid.Primitives.Common``.``.``
}
let activeElement = project {
path Files.Root.``Partas.Solid.Primitives.ActiveElement``.``.``
npmWithSemver "active-element" 0 1 0
}
let audio = project {
path Files.Root.``Partas.Solid.Primitives.Audio``.``.``
npmWithSemver "audio" 1 4 1
}
let autoFocus = project {
path Files.Root.``Partas.Solid.Primitives.AutoFocus``.``.``
npmWithSemver "autofocus" 0 1 0
}
let bounds = project {
path Files.Root.``Partas.Solid.Primitives.Bounds``.``.``
npmWithSemver "bounds" 0 1 0
}
let broadcastChannel = project {
path Files.Root.``Partas.Solid.Primitives.BroadcastChannel``.``.``
npmWithSemver "broadcast-channel" 0 1 0
}
let clipboard = project {
path Files.Root.``Partas.Solid.Primitives.Clipboard``.``.``
npmWithSemver "clipboard" 0 1 0
}
let devices = project {
path Files.Root.``Partas.Solid.Primitives.Devices``.``.``
npmWithSemver "devices" 1 3 1
}
let eventBus = project {
path Files.Root.``Partas.Solid.Primitives.EventBus``.``.``
npmWithSemver "event-bus" 0 1 0
}
let eventListener = project {
path Files.Root.``Partas.Solid.Primitives.EventListener``.``.``
npmWithSemver "event-listener" 2 4 1
}
let idle = project {
path Files.Root.``Partas.Solid.Primitives.Idle``.``.``
npmWithSemver "idle" 0 2 0
}
let keyboard = project {
path Files.Root.``Partas.Solid.Primitives.Keyboard``.``.``
npmWithSemver "keyboard" 0 1 0
}
let media = project {
path Files.Root.``Partas.Solid.Primitives.Media``.``.``
npmWithSemver "media" 0 1 0
}
let mouse = project {
path Files.Root.``Partas.Solid.Primitives.Mouse``.``.``
npmWithSemver "mouse" 2 1 2
}
let raf = project {
path Files.Root.``Partas.Solid.Primitives.Raf``.``.``
npmWithSemver "raf" 2 3 1
}
let scheduled = project {
path Files.Root.``Partas.Solid.Primitives.Scheduled``.``.``
npmWithSemver "scheduled" 1 5 0
}
let scroll = project {
path Files.Root.``Partas.Solid.Primitives.Scroll``.``.``
npmWithSemver "scroll" 2 1 0
}
let spring = project {
path Files.Root.``Partas.Solid.Primitives.Spring``.``.``
npmWithSemver "spring" 0 1 1
}
let timer = project {
path Files.Root.``Partas.Solid.Primitives.Timer``.``.``
npmWithSemver "timer" 1 4 0
}
let trigger = project {
path Files.Root.``Partas.Solid.Primitives.Trigger``.``.``
npmWithSemver "trigger" 0 1 0
}
let tween = project {
path Files.Root.``Partas.Solid.Primitives.Tween``.``.``
npmWithSemver "tween" 1 4 0
}
let projectPrimitives = project {
path Files.Root.``Partas.Solid.Primitives``.``.``
projectWithoutBase "Partas.Solid.Primitives"
}
let inputMask = project {
path Files.Root.``Partas.Solid.Primitives.InputMask``.``.``
}
let jsxTokenizer = project {
path Files.Root.``Partas.Solid.Primitives.JsxTokenizer``.``.``
}
let permission = project {
path Files.Root.``Partas.Solid.Primitives.Permission``.``.``
}
let rootless = project {
path Files.Root.``Partas.Solid.Primitives.Rootless``.``.``
}
let storage = project {
path Files.Root.``Partas.Solid.Primitives.Storage``.``.``
}
let projects = [
Projects.inputMask
Projects.jsxTokenizer
Projects.permission
Projects.rootless
Projects.storage
Projects.activeElement
Projects.audio
Projects.autoFocus
Projects.bounds
Projects.broadcastChannel
Projects.clipboard
Projects.common
Projects.devices
Projects.eventBus
Projects.eventListener
Projects.idle
Projects.keyboard
Projects.media
Projects.mouse
Projects.projectPrimitives
Projects.raf
Projects.scheduled
Projects.scroll
Projects.spring
Projects.timer
Projects.trigger
Projects.tween
]