@remix-run/assets 0.1.0 → 0.2.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 (57) hide show
  1. package/README.md +53 -47
  2. package/dist/lib/asset-server.d.ts +45 -43
  3. package/dist/lib/asset-server.d.ts.map +1 -1
  4. package/dist/lib/asset-server.js +142 -46
  5. package/dist/lib/compilation-error.d.ts +2 -2
  6. package/dist/lib/compilation-error.d.ts.map +1 -1
  7. package/dist/lib/compilation-error.js +1 -1
  8. package/dist/lib/file-matcher.d.ts.map +1 -1
  9. package/dist/lib/file-matcher.js +3 -2
  10. package/dist/lib/module-store.d.ts +41 -0
  11. package/dist/lib/module-store.d.ts.map +1 -0
  12. package/dist/lib/{scripts/store.js → module-store.js} +43 -41
  13. package/dist/lib/scripts/compiler.d.ts +15 -15
  14. package/dist/lib/scripts/compiler.d.ts.map +1 -1
  15. package/dist/lib/scripts/compiler.js +50 -46
  16. package/dist/lib/scripts/emit.js +2 -2
  17. package/dist/lib/scripts/resolve.d.ts +7 -17
  18. package/dist/lib/scripts/resolve.d.ts.map +1 -1
  19. package/dist/lib/scripts/resolve.js +15 -9
  20. package/dist/lib/scripts/transform.d.ts +11 -9
  21. package/dist/lib/scripts/transform.d.ts.map +1 -1
  22. package/dist/lib/scripts/transform.js +32 -21
  23. package/dist/lib/source-maps.d.ts +1 -1
  24. package/dist/lib/source-maps.d.ts.map +1 -1
  25. package/dist/lib/source-maps.js +7 -1
  26. package/dist/lib/styles/compiler.d.ts +52 -0
  27. package/dist/lib/styles/compiler.d.ts.map +1 -0
  28. package/dist/lib/styles/compiler.js +272 -0
  29. package/dist/lib/styles/emit.d.ts +25 -0
  30. package/dist/lib/styles/emit.d.ts.map +1 -0
  31. package/dist/lib/styles/emit.js +78 -0
  32. package/dist/lib/styles/resolve.d.ts +48 -0
  33. package/dist/lib/styles/resolve.d.ts.map +1 -0
  34. package/dist/lib/styles/resolve.js +188 -0
  35. package/dist/lib/styles/transform.d.ts +47 -0
  36. package/dist/lib/styles/transform.d.ts.map +1 -0
  37. package/dist/lib/styles/transform.js +131 -0
  38. package/dist/lib/target.d.ts +21 -0
  39. package/dist/lib/target.d.ts.map +1 -0
  40. package/dist/lib/target.js +127 -0
  41. package/package.json +7 -2
  42. package/src/lib/asset-server.ts +218 -96
  43. package/src/lib/compilation-error.ts +7 -7
  44. package/src/lib/file-matcher.ts +3 -2
  45. package/src/lib/{scripts/store.ts → module-store.ts} +100 -87
  46. package/src/lib/scripts/compiler.ts +88 -70
  47. package/src/lib/scripts/emit.ts +2 -2
  48. package/src/lib/scripts/resolve.ts +34 -23
  49. package/src/lib/scripts/transform.ts +49 -34
  50. package/src/lib/source-maps.ts +8 -1
  51. package/src/lib/styles/compiler.ts +400 -0
  52. package/src/lib/styles/emit.ts +137 -0
  53. package/src/lib/styles/resolve.ts +316 -0
  54. package/src/lib/styles/transform.ts +226 -0
  55. package/src/lib/target.ts +196 -0
  56. package/dist/lib/scripts/store.d.ts +0 -40
  57. package/dist/lib/scripts/store.d.ts.map +0 -1
@@ -1,7 +1,9 @@
1
- import type { EmittedModule } from './emit.ts'
2
- import { getFilePathDirectory } from '../paths.ts'
3
- import type { ResolutionFailureState, ResolvedModule, TrackedResolution } from './resolve.ts'
4
- import type { TransformFailureState, TransformedModule } from './transform.ts'
1
+ import { getFilePathDirectory } from './paths.ts'
2
+
3
+ export type ModuleTracking = {
4
+ trackedFiles: readonly string[]
5
+ trackedDirectories?: readonly string[]
6
+ }
5
7
 
6
8
  export type ModuleWatchEvent = 'change' | 'add' | 'unlink'
7
9
 
@@ -12,51 +14,57 @@ export type FileSnapshot = {
12
14
 
13
15
  export type ModuleSnapshot = ReadonlyMap<string, FileSnapshot>
14
16
 
15
- type ModuleRecordState = {
17
+ type ModuleRecordState<transformed, resolved, emitted> = {
16
18
  identityPath: string
17
19
  invalidationVersion: number
18
- transformed?: TransformedModule
19
- resolved?: ResolvedModule
20
- emitted?: EmittedModule
20
+ transformed?: transformed
21
+ resolved?: resolved
22
+ emitted?: emitted
21
23
  emittedSnapshot?: ModuleSnapshot
22
- staleEmitted?: EmittedModule
24
+ staleEmitted?: emitted
23
25
  staleEmittedSnapshot?: ModuleSnapshot
24
26
  trackedFiles: ReadonlySet<string>
25
- trackedResolutions: readonly TrackedResolution[]
27
+ trackedDirectories: ReadonlySet<string>
26
28
  }
27
29
 
28
- export type ModuleRecord = Readonly<ModuleRecordState>
30
+ export type ModuleRecord<transformed, resolved, emitted> = Readonly<
31
+ ModuleRecordState<transformed, resolved, emitted>
32
+ >
29
33
 
30
- type MutableModuleRecord = {
34
+ type MutableModuleRecord<transformed, resolved, emitted> = {
31
35
  identityPath: string
32
36
  invalidationVersion: number
33
- transformed?: TransformedModule
34
- resolved?: ResolvedModule
35
- emitted?: EmittedModule
37
+ transformed?: transformed
38
+ resolved?: resolved
39
+ emitted?: emitted
36
40
  emittedSnapshot?: ModuleSnapshot
37
- staleEmitted?: EmittedModule
41
+ staleEmitted?: emitted
38
42
  staleEmittedSnapshot?: ModuleSnapshot
39
43
  trackedFiles: Set<string>
40
- trackedResolutions: TrackedResolution[]
44
+ trackedDirectories: Set<string>
41
45
  }
42
46
 
43
- type ModuleStore = {
44
- get(identityPath: string): ModuleRecord
45
- setTransformFailure(identityPath: string, failure: TransformFailureState): void
46
- setTransformed(identityPath: string, transformed: TransformedModule): void
47
- setResolved(identityPath: string, resolved: ResolvedModule): void
48
- setResolveFailure(identityPath: string, failure: ResolutionFailureState): void
49
- setEmitted(identityPath: string, emitted: EmittedModule, snapshot: ModuleSnapshot | null): void
47
+ export type ModuleStore<transformed, resolved, emitted> = {
48
+ get(identityPath: string): ModuleRecord<transformed, resolved, emitted>
49
+ clearTransformed(identityPath: string, tracking: readonly ModuleTracking[]): void
50
+ setTransformed(
51
+ identityPath: string,
52
+ transformed: transformed,
53
+ tracking: readonly ModuleTracking[],
54
+ ): void
55
+ setResolved(identityPath: string, resolved: resolved, tracking: readonly ModuleTracking[]): void
56
+ clearResolved(identityPath: string, tracking: readonly ModuleTracking[]): void
57
+ setEmitted(identityPath: string, emitted: emitted, snapshot: ModuleSnapshot | null): void
50
58
  invalidateForFileEvent(filePath: string, event: ModuleWatchEvent): void
51
59
  invalidateAll(): void
52
60
  }
53
61
 
54
- export function createModuleStore(
62
+ export function createModuleStore<transformed, resolved, emitted>(
55
63
  options: {
56
64
  onWatchDirectoriesChange?: (delta: { add: string[]; remove: string[] }) => void
57
65
  } = {},
58
- ): ModuleStore {
59
- let recordsByIdentityPath = new Map<string, MutableModuleRecord>()
66
+ ): ModuleStore<transformed, resolved, emitted> {
67
+ let recordsByIdentityPath = new Map<string, MutableModuleRecord<transformed, resolved, emitted>>()
60
68
  let recordsByTrackedFile = new Map<string, Set<string>>()
61
69
  let watchDirectoryRefCountByPath = new Map<string, number>()
62
70
 
@@ -65,16 +73,16 @@ export function createModuleStore(
65
73
  let existing = recordsByIdentityPath.get(identityPath)
66
74
  if (existing) return existing
67
75
 
68
- let record: MutableModuleRecord = {
76
+ let record: MutableModuleRecord<transformed, resolved, emitted> = {
69
77
  identityPath,
70
78
  invalidationVersion: 0,
71
79
  trackedFiles: new Set(),
72
- trackedResolutions: [],
80
+ trackedDirectories: new Set(),
73
81
  }
74
82
  recordsByIdentityPath.set(identityPath, record)
75
83
  return record
76
84
  },
77
- setTransformFailure(identityPath, failure) {
85
+ clearTransformed(identityPath, tracking) {
78
86
  let record = getOrCreateMutableRecord(identityPath)
79
87
  record.transformed = undefined
80
88
  record.resolved = undefined
@@ -82,13 +90,10 @@ export function createModuleStore(
82
90
  record.emittedSnapshot = undefined
83
91
  record.staleEmitted = undefined
84
92
  record.staleEmittedSnapshot = undefined
85
- setTracking(record, {
86
- trackedFiles: failure.trackedFiles,
87
- trackedResolutions: [],
88
- })
93
+ setTracking(record, tracking)
89
94
  },
90
95
 
91
- setTransformed(identityPath, transformed) {
96
+ setTransformed(identityPath, transformed, tracking) {
92
97
  let record = getOrCreateMutableRecord(identityPath)
93
98
  record.transformed = transformed
94
99
  record.resolved = undefined
@@ -96,36 +101,27 @@ export function createModuleStore(
96
101
  record.emittedSnapshot = undefined
97
102
  record.staleEmitted = undefined
98
103
  record.staleEmittedSnapshot = undefined
99
- setTracking(record, {
100
- trackedFiles: transformed.trackedFiles,
101
- trackedResolutions: [],
102
- })
104
+ setTracking(record, tracking)
103
105
  },
104
106
 
105
- setResolved(identityPath, resolved) {
107
+ setResolved(identityPath, resolved, tracking) {
106
108
  let record = getOrCreateMutableRecord(identityPath)
107
109
  record.resolved = resolved
108
110
  record.emitted = undefined
109
111
  record.emittedSnapshot = undefined
110
112
  record.staleEmitted = undefined
111
113
  record.staleEmittedSnapshot = undefined
112
- setTracking(record, {
113
- trackedFiles: resolved.trackedFiles,
114
- trackedResolutions: resolved.trackedResolutions,
115
- })
114
+ setTracking(record, tracking)
116
115
  },
117
116
 
118
- setResolveFailure(identityPath, failure) {
117
+ clearResolved(identityPath, tracking) {
119
118
  let record = getOrCreateMutableRecord(identityPath)
120
119
  record.resolved = undefined
121
120
  record.emitted = undefined
122
121
  record.emittedSnapshot = undefined
123
122
  record.staleEmitted = undefined
124
123
  record.staleEmittedSnapshot = undefined
125
- setTracking(record, {
126
- trackedFiles: failure.trackedFiles,
127
- trackedResolutions: failure.trackedResolutions,
128
- })
124
+ setTracking(record, tracking)
129
125
  },
130
126
 
131
127
  setEmitted(identityPath, emitted, snapshot) {
@@ -141,11 +137,7 @@ export function createModuleStore(
141
137
 
142
138
  if (event !== 'change') {
143
139
  for (let record of recordsByIdentityPath.values()) {
144
- if (
145
- record.trackedResolutions.some((tracked) =>
146
- mayAffectTrackedResolution(tracked, filePath),
147
- )
148
- ) {
140
+ if (matchesTrackedDirectory(record.trackedDirectories, filePath)) {
149
141
  affected.add(record.identityPath)
150
142
  }
151
143
  }
@@ -171,21 +163,26 @@ export function createModuleStore(
171
163
  },
172
164
  }
173
165
 
174
- function getOrCreateMutableRecord(identityPath: string): MutableModuleRecord {
166
+ function getOrCreateMutableRecord(
167
+ identityPath: string,
168
+ ): MutableModuleRecord<transformed, resolved, emitted> {
175
169
  let existing = recordsByIdentityPath.get(identityPath)
176
170
  if (existing) return existing
177
171
 
178
- let record: MutableModuleRecord = {
172
+ let record: MutableModuleRecord<transformed, resolved, emitted> = {
179
173
  identityPath,
180
174
  invalidationVersion: 0,
181
175
  trackedFiles: new Set(),
182
- trackedResolutions: [],
176
+ trackedDirectories: new Set(),
183
177
  }
184
178
  recordsByIdentityPath.set(identityPath, record)
185
179
  return record
186
180
  }
187
181
 
188
- function invalidateRecord(record: MutableModuleRecord, options: { retainStale: boolean }) {
182
+ function invalidateRecord(
183
+ record: MutableModuleRecord<transformed, resolved, emitted>,
184
+ options: { retainStale: boolean },
185
+ ) {
189
186
  if (!options.retainStale) {
190
187
  record.staleEmitted = undefined
191
188
  record.staleEmittedSnapshot = undefined
@@ -205,17 +202,15 @@ export function createModuleStore(
205
202
  }
206
203
 
207
204
  function setTracking(
208
- record: MutableModuleRecord,
209
- tracking: {
210
- trackedFiles: readonly string[]
211
- trackedResolutions: readonly TrackedResolution[]
212
- },
205
+ record: MutableModuleRecord<transformed, resolved, emitted>,
206
+ tracking: readonly ModuleTracking[],
213
207
  ) {
214
208
  let previousWatchedDirectories = getWatchedDirectories(record)
215
209
  removeIndexes(record)
216
210
 
217
- record.trackedFiles = new Set(tracking.trackedFiles)
218
- record.trackedResolutions = [...tracking.trackedResolutions]
211
+ let normalizedTracking = mergeTracking(tracking)
212
+ record.trackedFiles = normalizedTracking.trackedFiles
213
+ record.trackedDirectories = normalizedTracking.trackedDirectories
219
214
 
220
215
  for (let trackedFile of record.trackedFiles) {
221
216
  addToIndexedSet(recordsByTrackedFile, trackedFile, record.identityPath)
@@ -226,14 +221,11 @@ export function createModuleStore(
226
221
  emitWatchDirectoryDelta(delta)
227
222
  }
228
223
 
229
- function clearTracking(record: MutableModuleRecord) {
230
- setTracking(record, {
231
- trackedFiles: [],
232
- trackedResolutions: [],
233
- })
224
+ function clearTracking(record: MutableModuleRecord<transformed, resolved, emitted>) {
225
+ setTracking(record, [])
234
226
  }
235
227
 
236
- function removeIndexes(record: MutableModuleRecord) {
228
+ function removeIndexes(record: MutableModuleRecord<transformed, resolved, emitted>) {
237
229
  for (let trackedFile of record.trackedFiles) {
238
230
  removeFromIndexedSet(recordsByTrackedFile, trackedFile, record.identityPath)
239
231
  }
@@ -292,19 +284,47 @@ function removeFromIndexedSet(map: Map<string, Set<string>>, key: string, value:
292
284
  }
293
285
  }
294
286
 
295
- function mayAffectTrackedResolution(
296
- trackedResolution: TrackedResolution,
287
+ function matchesTrackedDirectory(
288
+ trackedDirectories: ReadonlySet<string>,
297
289
  filePath: string,
298
290
  ): boolean {
299
- return (
300
- trackedResolution.candidatePaths.includes(filePath) ||
301
- trackedResolution.candidatePrefixes.some((prefix) => filePath.startsWith(prefix))
302
- )
291
+ for (let trackedDirectory of trackedDirectories) {
292
+ if (filePath === trackedDirectory || filePath.startsWith(`${trackedDirectory}/`)) return true
293
+ }
294
+
295
+ return false
296
+ }
297
+
298
+ function normalizeTrackedDirectory(trackedDirectory: string): string {
299
+ return trackedDirectory.replace(/\/+$/, '') || '/'
300
+ }
301
+
302
+ function mergeTracking(tracking: readonly ModuleTracking[]): {
303
+ trackedFiles: Set<string>
304
+ trackedDirectories: Set<string>
305
+ } {
306
+ let trackedFiles = new Set<string>()
307
+ let trackedDirectories = new Set<string>()
308
+
309
+ for (let fragment of tracking) {
310
+ for (let trackedFile of fragment.trackedFiles) {
311
+ trackedFiles.add(trackedFile)
312
+ }
313
+
314
+ for (let trackedDirectory of fragment.trackedDirectories ?? []) {
315
+ trackedDirectories.add(normalizeTrackedDirectory(trackedDirectory))
316
+ }
317
+ }
318
+
319
+ return {
320
+ trackedFiles,
321
+ trackedDirectories,
322
+ }
303
323
  }
304
324
 
305
325
  function getWatchedDirectories(record: {
306
326
  trackedFiles: ReadonlySet<string>
307
- trackedResolutions: readonly TrackedResolution[]
327
+ trackedDirectories: ReadonlySet<string>
308
328
  }): Set<string> {
309
329
  let watchedDirectories = new Set<string>()
310
330
 
@@ -312,15 +332,8 @@ function getWatchedDirectories(record: {
312
332
  watchedDirectories.add(getFilePathDirectory(trackedFile))
313
333
  }
314
334
 
315
- for (let trackedResolution of record.trackedResolutions) {
316
- for (let candidatePath of trackedResolution.candidatePaths) {
317
- watchedDirectories.add(getFilePathDirectory(candidatePath))
318
- }
319
-
320
- for (let candidatePrefix of trackedResolution.candidatePrefixes) {
321
- let directoryPath = candidatePrefix.replace(/\/+$/, '') || '/'
322
- watchedDirectories.add(directoryPath)
323
- }
335
+ for (let trackedDirectory of record.trackedDirectories) {
336
+ watchedDirectories.add(trackedDirectory)
324
337
  }
325
338
 
326
339
  return watchedDirectories