@remix-run/assets 0.3.0 → 0.4.1
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.
- package/README.md +206 -8
- package/dist/assets.d.ts +1 -0
- package/dist/assets.d.ts.map +1 -1
- package/dist/assets.js +1 -0
- package/dist/lib/access.d.ts +1 -0
- package/dist/lib/access.d.ts.map +1 -1
- package/dist/lib/access.js +7 -1
- package/dist/lib/asset-server.d.ts +29 -6
- package/dist/lib/asset-server.d.ts.map +1 -1
- package/dist/lib/asset-server.js +176 -17
- package/dist/lib/compilation-error.d.ts +1 -1
- package/dist/lib/compilation-error.d.ts.map +1 -1
- package/dist/lib/files/compiler.d.ts +71 -0
- package/dist/lib/files/compiler.d.ts.map +1 -0
- package/dist/lib/files/compiler.js +552 -0
- package/dist/lib/files/config.d.ts +101 -0
- package/dist/lib/files/config.d.ts.map +1 -0
- package/dist/lib/files/config.js +219 -0
- package/dist/lib/files/store.d.ts +31 -0
- package/dist/lib/files/store.d.ts.map +1 -0
- package/dist/lib/files/store.js +63 -0
- package/dist/lib/fingerprint.d.ts +3 -3
- package/dist/lib/fingerprint.d.ts.map +1 -1
- package/dist/lib/fingerprint.js +5 -5
- package/dist/lib/routes.d.ts.map +1 -1
- package/dist/lib/routes.js +28 -20
- package/dist/lib/scripts/compiler.d.ts +1 -0
- package/dist/lib/scripts/compiler.d.ts.map +1 -1
- package/dist/lib/scripts/compiler.js +31 -14
- package/dist/lib/scripts/resolve.d.ts.map +1 -1
- package/dist/lib/scripts/resolve.js +35 -8
- package/dist/lib/scripts/specifiers.d.ts +2 -0
- package/dist/lib/scripts/specifiers.d.ts.map +1 -0
- package/dist/lib/scripts/specifiers.js +9 -0
- package/dist/lib/scripts/transform.d.ts.map +1 -1
- package/dist/lib/scripts/transform.js +3 -5
- package/dist/lib/styles/compiler.d.ts +4 -0
- package/dist/lib/styles/compiler.d.ts.map +1 -1
- package/dist/lib/styles/compiler.js +2 -0
- package/dist/lib/styles/emit.d.ts +3 -0
- package/dist/lib/styles/emit.d.ts.map +1 -1
- package/dist/lib/styles/emit.js +36 -1
- package/dist/lib/styles/resolve.d.ts +8 -1
- package/dist/lib/styles/resolve.d.ts.map +1 -1
- package/dist/lib/styles/resolve.js +85 -32
- package/dist/lib/watch.d.ts +2 -0
- package/dist/lib/watch.d.ts.map +1 -1
- package/dist/lib/watch.js +25 -8
- package/package.json +7 -5
- package/src/assets.ts +1 -0
- package/src/lib/access.ts +8 -1
- package/src/lib/asset-server.ts +273 -28
- package/src/lib/compilation-error.ts +9 -0
- package/src/lib/files/compiler.ts +885 -0
- package/src/lib/files/config.ts +479 -0
- package/src/lib/files/store.ts +109 -0
- package/src/lib/fingerprint.ts +8 -7
- package/src/lib/routes.ts +36 -33
- package/src/lib/scripts/compiler.ts +44 -17
- package/src/lib/scripts/resolve.ts +57 -9
- package/src/lib/scripts/specifiers.ts +11 -0
- package/src/lib/scripts/transform.ts +3 -6
- package/src/lib/styles/compiler.ts +9 -0
- package/src/lib/styles/emit.ts +75 -1
- package/src/lib/styles/resolve.ts +132 -35
- package/src/lib/watch.ts +34 -12
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
import { supportedScriptExtensions } from "../scripts/resolve.js";
|
|
2
|
+
export function defineFileTransform(transform) {
|
|
3
|
+
return transform;
|
|
4
|
+
}
|
|
5
|
+
const reservedFileExtensions = new Set([...supportedScriptExtensions, '.css', '.map']);
|
|
6
|
+
const defaultMaxRequestTransforms = 5;
|
|
7
|
+
export function normalizeFilesOptions(files) {
|
|
8
|
+
if (files == null) {
|
|
9
|
+
return {
|
|
10
|
+
extensions: [],
|
|
11
|
+
globalTransforms: [],
|
|
12
|
+
hasTransforms: false,
|
|
13
|
+
maxRequestTransforms: defaultMaxRequestTransforms,
|
|
14
|
+
transforms: new Map(),
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
if (!Array.isArray(files.extensions)) {
|
|
18
|
+
throw new TypeError('files.extensions must be an array');
|
|
19
|
+
}
|
|
20
|
+
let normalizedExtensions = [];
|
|
21
|
+
let seen = new Set();
|
|
22
|
+
for (let extension of files.extensions) {
|
|
23
|
+
if (typeof extension !== 'string') {
|
|
24
|
+
throw new TypeError('files.extensions values must be strings');
|
|
25
|
+
}
|
|
26
|
+
let normalizedExtension = extension.trim().toLowerCase();
|
|
27
|
+
if (!/^\.[A-Za-z0-9_-]+$/.test(normalizedExtension)) {
|
|
28
|
+
throw new TypeError(`files.extensions values must use ".ext" format. Received "${extension}".`);
|
|
29
|
+
}
|
|
30
|
+
if (reservedFileExtensions.has(normalizedExtension)) {
|
|
31
|
+
throw new TypeError(`files.extensions cannot include compiled asset extensions like "${normalizedExtension}".`);
|
|
32
|
+
}
|
|
33
|
+
if (seen.has(normalizedExtension))
|
|
34
|
+
continue;
|
|
35
|
+
seen.add(normalizedExtension);
|
|
36
|
+
normalizedExtensions.push(normalizedExtension);
|
|
37
|
+
}
|
|
38
|
+
let transforms = files.transforms ?? {};
|
|
39
|
+
if (transforms === null || typeof transforms !== 'object' || Array.isArray(transforms)) {
|
|
40
|
+
throw new TypeError('files.transforms must be an object');
|
|
41
|
+
}
|
|
42
|
+
let normalizedTransforms = new Map();
|
|
43
|
+
for (let [name, transform] of Object.entries(transforms)) {
|
|
44
|
+
if (!/^[A-Za-z0-9_-]+$/.test(name)) {
|
|
45
|
+
throw new TypeError(`files.transforms keys must use "transform-name" format. Received "${name}".`);
|
|
46
|
+
}
|
|
47
|
+
if (transform === null ||
|
|
48
|
+
typeof transform !== 'object' ||
|
|
49
|
+
typeof transform.transform !== 'function') {
|
|
50
|
+
throw new TypeError(`files.transforms.${name} must define a transform() function`);
|
|
51
|
+
}
|
|
52
|
+
if ('param' in transform &&
|
|
53
|
+
transform.param !== undefined &&
|
|
54
|
+
transform.param !== true &&
|
|
55
|
+
transform.param !== 'optional') {
|
|
56
|
+
throw new TypeError(`files.transforms.${name}.param must be true or "optional"`);
|
|
57
|
+
}
|
|
58
|
+
normalizedTransforms.set(name, {
|
|
59
|
+
...transform,
|
|
60
|
+
extensions: normalizeTransformExtensions(transform.extensions, `files.transforms.${name}.extensions`),
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
let globalTransforms = files.globalTransforms ?? [];
|
|
64
|
+
if (!Array.isArray(globalTransforms)) {
|
|
65
|
+
throw new TypeError('files.globalTransforms must be an array');
|
|
66
|
+
}
|
|
67
|
+
let normalizedGlobalTransforms = [];
|
|
68
|
+
for (let [index, transform] of globalTransforms.entries()) {
|
|
69
|
+
if (typeof transform === 'function') {
|
|
70
|
+
normalizedGlobalTransforms.push({ transform });
|
|
71
|
+
continue;
|
|
72
|
+
}
|
|
73
|
+
if (transform === null || typeof transform !== 'object') {
|
|
74
|
+
throw new TypeError(`files.globalTransforms[${index}] must be a function or object`);
|
|
75
|
+
}
|
|
76
|
+
if ('name' in transform && transform.name !== undefined && typeof transform.name !== 'string') {
|
|
77
|
+
throw new TypeError(`files.globalTransforms[${index}].name must be a string`);
|
|
78
|
+
}
|
|
79
|
+
if (typeof transform.transform !== 'function') {
|
|
80
|
+
throw new TypeError(`files.globalTransforms[${index}] must define a transform() function`);
|
|
81
|
+
}
|
|
82
|
+
normalizedGlobalTransforms.push({
|
|
83
|
+
...transform,
|
|
84
|
+
extensions: normalizeTransformExtensions(transform.extensions, `files.globalTransforms[${index}].extensions`),
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
let maxRequestTransforms = files.maxRequestTransforms ?? defaultMaxRequestTransforms;
|
|
88
|
+
if (!Number.isInteger(maxRequestTransforms) || maxRequestTransforms < 1) {
|
|
89
|
+
throw new TypeError('files.maxRequestTransforms must be a positive integer');
|
|
90
|
+
}
|
|
91
|
+
if (files.cache !== undefined) {
|
|
92
|
+
if (files.cache === null ||
|
|
93
|
+
typeof files.cache !== 'object' ||
|
|
94
|
+
typeof files.cache.get !== 'function' ||
|
|
95
|
+
typeof files.cache.set !== 'function') {
|
|
96
|
+
throw new TypeError('files.cache must implement the FileStorage interface');
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return {
|
|
100
|
+
cache: files.cache,
|
|
101
|
+
extensions: normalizedExtensions,
|
|
102
|
+
globalTransforms: normalizedGlobalTransforms,
|
|
103
|
+
hasTransforms: normalizedTransforms.size > 0 || normalizedGlobalTransforms.length > 0,
|
|
104
|
+
maxRequestTransforms,
|
|
105
|
+
transforms: normalizedTransforms,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
function normalizeTransformExtensions(extensions, optionPath) {
|
|
109
|
+
if (extensions === undefined)
|
|
110
|
+
return undefined;
|
|
111
|
+
if (!Array.isArray(extensions)) {
|
|
112
|
+
throw new TypeError(`${optionPath} must be an array`);
|
|
113
|
+
}
|
|
114
|
+
if (extensions.length === 0) {
|
|
115
|
+
throw new TypeError(`${optionPath} must include at least one extension`);
|
|
116
|
+
}
|
|
117
|
+
let normalizedExtensions = [];
|
|
118
|
+
let seen = new Set();
|
|
119
|
+
for (let extension of extensions) {
|
|
120
|
+
if (typeof extension !== 'string') {
|
|
121
|
+
throw new TypeError(`${optionPath} values must be strings`);
|
|
122
|
+
}
|
|
123
|
+
let normalizedExtension = extension.trim().toLowerCase();
|
|
124
|
+
if (!/^\.[A-Za-z0-9_-]+$/.test(normalizedExtension)) {
|
|
125
|
+
throw new TypeError(`${optionPath} values must use ".ext" format. Received "${extension}".`);
|
|
126
|
+
}
|
|
127
|
+
if (seen.has(normalizedExtension))
|
|
128
|
+
continue;
|
|
129
|
+
seen.add(normalizedExtension);
|
|
130
|
+
normalizedExtensions.push(normalizedExtension);
|
|
131
|
+
}
|
|
132
|
+
return normalizedExtensions;
|
|
133
|
+
}
|
|
134
|
+
export function serializeAssetTransformInvocations(transforms, transformsByName, maxTransforms = defaultMaxRequestTransforms) {
|
|
135
|
+
if (transforms.length > maxTransforms) {
|
|
136
|
+
throw new TypeError(`Expected at most ${maxTransforms} request transforms`);
|
|
137
|
+
}
|
|
138
|
+
return transforms.map((transformInvocation) => normalizeAssetTransformInvocation(transformInvocation, transformsByName, (message) => {
|
|
139
|
+
throw new TypeError(message);
|
|
140
|
+
}));
|
|
141
|
+
}
|
|
142
|
+
export function parseAssetTransformInvocations(transformsQuery, transformsByName, maxTransforms = defaultMaxRequestTransforms) {
|
|
143
|
+
if (transformsQuery.length > maxTransforms) {
|
|
144
|
+
throw new TypeError(`Expected at most ${maxTransforms} request transforms`);
|
|
145
|
+
}
|
|
146
|
+
return transformsQuery.map((transformQuery) => parseSerializedAssetTransformInvocation(transformQuery, transformsByName, (message) => {
|
|
147
|
+
throw new TypeError(message);
|
|
148
|
+
}));
|
|
149
|
+
}
|
|
150
|
+
function normalizeAssetTransformInvocation(transformInvocation, transformsByName, onError) {
|
|
151
|
+
if (typeof transformInvocation === 'string') {
|
|
152
|
+
if (!/^[A-Za-z0-9_-]+$/.test(transformInvocation)) {
|
|
153
|
+
return onError('Expected each transform name to use "transform-name" format');
|
|
154
|
+
}
|
|
155
|
+
let transform = transformsByName.get(transformInvocation);
|
|
156
|
+
if (transform === undefined) {
|
|
157
|
+
return onError(`Unknown file transform "${transformInvocation}"`);
|
|
158
|
+
}
|
|
159
|
+
if (transform.param === true) {
|
|
160
|
+
return onError(`File transform "${transformInvocation}" requires a param`);
|
|
161
|
+
}
|
|
162
|
+
return transformInvocation;
|
|
163
|
+
}
|
|
164
|
+
if (!Array.isArray(transformInvocation)) {
|
|
165
|
+
return onError('Expected each transform to be a string name or tuple');
|
|
166
|
+
}
|
|
167
|
+
if (transformInvocation.length === 0 || transformInvocation.length > 2) {
|
|
168
|
+
return onError('Expected each transform tuple to have one or two items');
|
|
169
|
+
}
|
|
170
|
+
let [name, rawParam] = transformInvocation;
|
|
171
|
+
if (typeof name !== 'string' || !/^[A-Za-z0-9_-]+$/.test(name)) {
|
|
172
|
+
return onError('Expected each transform name to use "transform-name" format');
|
|
173
|
+
}
|
|
174
|
+
let transform = transformsByName.get(name);
|
|
175
|
+
if (transform === undefined) {
|
|
176
|
+
return onError(`Unknown file transform "${name}"`);
|
|
177
|
+
}
|
|
178
|
+
if (transformInvocation.length === 1) {
|
|
179
|
+
if (transform.param === true) {
|
|
180
|
+
return onError(`File transform "${name}" requires a param`);
|
|
181
|
+
}
|
|
182
|
+
return name;
|
|
183
|
+
}
|
|
184
|
+
if (typeof rawParam !== 'string') {
|
|
185
|
+
return onError(`Invalid param for file transform "${name}": expected a string`);
|
|
186
|
+
}
|
|
187
|
+
if (transform.param === undefined) {
|
|
188
|
+
if (transformInvocation.length === 2) {
|
|
189
|
+
return onError(`File transform "${name}" does not accept a param`);
|
|
190
|
+
}
|
|
191
|
+
return name;
|
|
192
|
+
}
|
|
193
|
+
return `${name}:${rawParam}`;
|
|
194
|
+
}
|
|
195
|
+
function parseSerializedAssetTransformInvocation(transformQuery, transformsByName, onError) {
|
|
196
|
+
let separatorIndex = transformQuery.indexOf(':');
|
|
197
|
+
let name = separatorIndex === -1 ? transformQuery : transformQuery.slice(0, separatorIndex);
|
|
198
|
+
let param = separatorIndex === -1 ? undefined : transformQuery.slice(separatorIndex + 1);
|
|
199
|
+
if (!/^[A-Za-z0-9_-]+$/.test(name)) {
|
|
200
|
+
return onError('Expected each transform name to use "transform-name" format');
|
|
201
|
+
}
|
|
202
|
+
let transform = transformsByName.get(name);
|
|
203
|
+
if (transform === undefined) {
|
|
204
|
+
return onError(`Unknown file transform "${name}"`);
|
|
205
|
+
}
|
|
206
|
+
if (transform.param === undefined) {
|
|
207
|
+
if (param !== undefined) {
|
|
208
|
+
return onError(`File transform "${name}" does not accept a param`);
|
|
209
|
+
}
|
|
210
|
+
return name;
|
|
211
|
+
}
|
|
212
|
+
if (transform.param === true && param === undefined) {
|
|
213
|
+
return onError(`File transform "${name}" requires a param`);
|
|
214
|
+
}
|
|
215
|
+
if (param === undefined) {
|
|
216
|
+
return name;
|
|
217
|
+
}
|
|
218
|
+
return [name, param];
|
|
219
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export type FileSnapshot = {
|
|
2
|
+
filePath: string;
|
|
3
|
+
mtimeNs: bigint;
|
|
4
|
+
size: bigint;
|
|
5
|
+
};
|
|
6
|
+
export type SourceFileMetadata = {
|
|
7
|
+
contentType: string;
|
|
8
|
+
etag: string;
|
|
9
|
+
extension: string;
|
|
10
|
+
fingerprint: string | null;
|
|
11
|
+
};
|
|
12
|
+
type SourceFileRecordState = {
|
|
13
|
+
metadata?: SourceFileMetadata;
|
|
14
|
+
metadataSnapshot?: FileSnapshot;
|
|
15
|
+
identityPath: string;
|
|
16
|
+
invalidationVersion: number;
|
|
17
|
+
staleMetadata?: SourceFileMetadata;
|
|
18
|
+
staleMetadataSnapshot?: FileSnapshot;
|
|
19
|
+
};
|
|
20
|
+
export type SourceFileRecord = Readonly<SourceFileRecordState>;
|
|
21
|
+
export type SourceFileStore = {
|
|
22
|
+
get(identityPath: string): SourceFileRecord;
|
|
23
|
+
invalidate(identityPath: string, options?: {
|
|
24
|
+
retainStale: boolean;
|
|
25
|
+
}): void;
|
|
26
|
+
invalidateForFileEvent(filePath: string, event: 'add' | 'change' | 'unlink'): void;
|
|
27
|
+
set(identityPath: string, metadata: SourceFileMetadata, snapshot: FileSnapshot | null): void;
|
|
28
|
+
};
|
|
29
|
+
export declare function createSourceFileStore(): SourceFileStore;
|
|
30
|
+
export {};
|
|
31
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../src/lib/files/store.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,OAAO,EAAE,MAAM,CAAA;IACf,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,EAAE,MAAM,CAAA;IACnB,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAC3B,CAAA;AAED,KAAK,qBAAqB,GAAG;IAC3B,QAAQ,CAAC,EAAE,kBAAkB,CAAA;IAC7B,gBAAgB,CAAC,EAAE,YAAY,CAAA;IAC/B,YAAY,EAAE,MAAM,CAAA;IACpB,mBAAmB,EAAE,MAAM,CAAA;IAC3B,aAAa,CAAC,EAAE,kBAAkB,CAAA;IAClC,qBAAqB,CAAC,EAAE,YAAY,CAAA;CACrC,CAAA;AAED,MAAM,MAAM,gBAAgB,GAAG,QAAQ,CAAC,qBAAqB,CAAC,CAAA;AAW9D,MAAM,MAAM,eAAe,GAAG;IAC5B,GAAG,CAAC,YAAY,EAAE,MAAM,GAAG,gBAAgB,CAAA;IAC3C,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,WAAW,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAA;IAC1E,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAA;IAClF,GAAG,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,kBAAkB,EAAE,QAAQ,EAAE,YAAY,GAAG,IAAI,GAAG,IAAI,CAAA;CAC7F,CAAA;AAED,wBAAgB,qBAAqB,IAAI,eAAe,CAoEvD"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
export function createSourceFileStore() {
|
|
2
|
+
let recordsByIdentityPath = new Map();
|
|
3
|
+
let invalidationVersionByIdentityPath = new Map();
|
|
4
|
+
return {
|
|
5
|
+
get(identityPath) {
|
|
6
|
+
return getOrCreateRecord(identityPath);
|
|
7
|
+
},
|
|
8
|
+
invalidate(identityPath, options = { retainStale: false }) {
|
|
9
|
+
let record = recordsByIdentityPath.get(identityPath);
|
|
10
|
+
if (!record)
|
|
11
|
+
return;
|
|
12
|
+
invalidateRecord(record, options);
|
|
13
|
+
},
|
|
14
|
+
invalidateForFileEvent(filePath, event) {
|
|
15
|
+
let record = recordsByIdentityPath.get(filePath);
|
|
16
|
+
if (!record)
|
|
17
|
+
return;
|
|
18
|
+
invalidateRecord(record, { retainStale: event === 'change' });
|
|
19
|
+
if (event === 'unlink') {
|
|
20
|
+
recordsByIdentityPath.delete(filePath);
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
set(identityPath, metadata, snapshot) {
|
|
24
|
+
let record = recordsByIdentityPath.get(identityPath);
|
|
25
|
+
if (!record) {
|
|
26
|
+
record = getOrCreateRecord(identityPath);
|
|
27
|
+
}
|
|
28
|
+
record.metadata = metadata;
|
|
29
|
+
record.metadataSnapshot = snapshot ?? undefined;
|
|
30
|
+
record.staleMetadata = undefined;
|
|
31
|
+
record.staleMetadataSnapshot = undefined;
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
function invalidateRecord(record, options) {
|
|
35
|
+
if (!options.retainStale) {
|
|
36
|
+
record.staleMetadata = undefined;
|
|
37
|
+
record.staleMetadataSnapshot = undefined;
|
|
38
|
+
}
|
|
39
|
+
else if (record.metadata && record.metadataSnapshot) {
|
|
40
|
+
record.staleMetadata = record.metadata;
|
|
41
|
+
record.staleMetadataSnapshot = record.metadataSnapshot;
|
|
42
|
+
}
|
|
43
|
+
else if (!record.staleMetadata || !record.staleMetadataSnapshot) {
|
|
44
|
+
record.staleMetadata = undefined;
|
|
45
|
+
record.staleMetadataSnapshot = undefined;
|
|
46
|
+
}
|
|
47
|
+
record.metadata = undefined;
|
|
48
|
+
record.metadataSnapshot = undefined;
|
|
49
|
+
record.invalidationVersion += 1;
|
|
50
|
+
invalidationVersionByIdentityPath.set(record.identityPath, record.invalidationVersion);
|
|
51
|
+
}
|
|
52
|
+
function getOrCreateRecord(identityPath) {
|
|
53
|
+
let existing = recordsByIdentityPath.get(identityPath);
|
|
54
|
+
if (existing)
|
|
55
|
+
return existing;
|
|
56
|
+
let record = {
|
|
57
|
+
identityPath,
|
|
58
|
+
invalidationVersion: invalidationVersionByIdentityPath.get(identityPath) ?? 0,
|
|
59
|
+
};
|
|
60
|
+
recordsByIdentityPath.set(identityPath, record);
|
|
61
|
+
return record;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
export declare function hashContent(content: string): Promise<string>;
|
|
2
|
-
export declare function generateFingerprint(
|
|
1
|
+
export declare function hashContent(content: string | Uint8Array<ArrayBufferLike>): Promise<string>;
|
|
2
|
+
export declare function generateFingerprint(args: {
|
|
3
3
|
buildId: string;
|
|
4
|
-
content: string
|
|
4
|
+
content: string | Uint8Array<ArrayBufferLike>;
|
|
5
5
|
}): Promise<string>;
|
|
6
6
|
export declare function parseFingerprintSuffix(pathname: string): {
|
|
7
7
|
pathname: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../src/lib/fingerprint.ts"],"names":[],"mappings":"AAGA,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"fingerprint.d.ts","sourceRoot":"","sources":["../../src/lib/fingerprint.ts"],"names":[],"mappings":"AAGA,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC,eAAe,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAIhG;AAED,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,GAAG,UAAU,CAAC,eAAe,CAAC,CAAA;CAC9C,GAAG,OAAO,CAAC,MAAM,CAAC,CAIlB;AAED,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG;IACxD,QAAQ,EAAE,MAAM,CAAA;IAChB,oBAAoB,EAAE,MAAM,GAAG,IAAI,CAAA;CACpC,CAyBA;AAED,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAahG;AAED,wBAAgB,iCAAiC,CAAC,oBAAoB,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAE7F"}
|
package/dist/lib/fingerprint.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
const fingerprintedExtensionRE = /^(.+)\.@([A-Za-z0-9_-]+)(\.[^./]+)$/;
|
|
2
2
|
const fingerprintedBasenameRE = /^(.+)\.@([A-Za-z0-9_-]+)$/;
|
|
3
3
|
export async function hashContent(content) {
|
|
4
|
-
let
|
|
5
|
-
let
|
|
6
|
-
let hashBuffer = await crypto.subtle.digest('SHA-256', data);
|
|
4
|
+
let bytes = typeof content === 'string' ? new TextEncoder().encode(content) : Buffer.from(content);
|
|
5
|
+
let hashBuffer = await crypto.subtle.digest('SHA-256', bytes);
|
|
7
6
|
return Buffer.from(hashBuffer).toString('base64url').slice(0, 6);
|
|
8
7
|
}
|
|
9
|
-
export async function generateFingerprint(
|
|
10
|
-
|
|
8
|
+
export async function generateFingerprint(args) {
|
|
9
|
+
let content = typeof args.content === 'string' ? args.content : Buffer.from(args.content).toString('base64');
|
|
10
|
+
return hashContent(JSON.stringify([content, args.buildId]));
|
|
11
11
|
}
|
|
12
12
|
export function parseFingerprintSuffix(pathname) {
|
|
13
13
|
let lastSlashIndex = pathname.lastIndexOf('/');
|
package/dist/lib/routes.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/lib/routes.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/lib/routes.ts"],"names":[],"mappings":"AAiBA,UAAU,WAAW;IACnB,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IACzC,OAAO,EAAE,MAAM,CAAA;CAChB;AAUD,MAAM,WAAW,cAAc;IAC7B,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IACnD,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;CAC/C;AAYD,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,SAAS,WAAW,EAAE,GACnC,cAAc,CA8ChB"}
|
package/dist/lib/routes.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { RoutePattern } from '@remix-run/route-pattern';
|
|
2
|
+
import { createHref } from '@remix-run/route-pattern/href';
|
|
3
|
+
import { createMatcher } from '@remix-run/route-pattern/match';
|
|
2
4
|
import { getRelativeFilePath, isAbsoluteFilePath, normalizeFilePath, normalizePathname, resolveFilePath, } from "./paths.js";
|
|
3
5
|
function normalizeFilePattern(pattern) {
|
|
4
6
|
if (isAbsoluteFilePath(pattern)) {
|
|
@@ -21,10 +23,10 @@ export function compileRoutes(basePath, routeConfigs) {
|
|
|
21
23
|
resolveUrlPathname(pathname) {
|
|
22
24
|
let normalizedPathname = normalizePathname(pathname);
|
|
23
25
|
for (let route of compiledRoutes) {
|
|
24
|
-
let match = route.
|
|
26
|
+
let match = route.urlMatcher.match(`http://remix.run${normalizedPathname}`);
|
|
25
27
|
if (!match)
|
|
26
28
|
continue;
|
|
27
|
-
let relativeFilePath = route.filePattern
|
|
29
|
+
let relativeFilePath = createHref(route.filePattern, match.params).replace(/^\/+/, '');
|
|
28
30
|
return resolveFilePath(route.rootDir, relativeFilePath);
|
|
29
31
|
}
|
|
30
32
|
return null;
|
|
@@ -33,10 +35,10 @@ export function compileRoutes(basePath, routeConfigs) {
|
|
|
33
35
|
let normalizedFilePath = normalizeFilePath(filePath);
|
|
34
36
|
for (let route of compiledRoutes) {
|
|
35
37
|
let relativeFilePath = getRelativeFilePath(route.rootDir, normalizedFilePath);
|
|
36
|
-
let match = route.
|
|
38
|
+
let match = route.fileMatcher.match(`http://remix.run/${relativeFilePath}`);
|
|
37
39
|
if (!match)
|
|
38
40
|
continue;
|
|
39
|
-
return normalizePathname(route.urlPattern
|
|
41
|
+
return normalizePathname(createHref(route.urlPattern, match.params));
|
|
40
42
|
}
|
|
41
43
|
return null;
|
|
42
44
|
},
|
|
@@ -47,45 +49,51 @@ function compileRoute(route, options) {
|
|
|
47
49
|
let relativeUrlPattern = normalizePathname(route.urlPattern);
|
|
48
50
|
let urlPatternSource = normalizePathname(`${basePath.replace(/\/+$/, '')}/${relativeUrlPattern.replace(/^\/+/, '')}`);
|
|
49
51
|
let filePatternSource = normalizeFilePattern(route.filePattern);
|
|
50
|
-
let urlPattern =
|
|
51
|
-
let filePattern =
|
|
52
|
+
let urlPattern = RoutePattern.parse(urlPatternSource);
|
|
53
|
+
let filePattern = RoutePattern.parse(filePatternSource);
|
|
52
54
|
validateNoUnnamedWildcards(urlPattern, 'URL');
|
|
53
55
|
validateNoUnnamedWildcards(filePattern, 'File');
|
|
54
56
|
validateRoutePatterns(urlPattern, filePattern);
|
|
55
57
|
return {
|
|
56
58
|
rootDir: normalizeFilePath(options.rootDir).replace(/\/+$/, ''),
|
|
57
59
|
urlPattern,
|
|
60
|
+
urlMatcher: createMatcher(urlPattern),
|
|
58
61
|
filePattern,
|
|
62
|
+
fileMatcher: createMatcher(stripDotSegments(filePatternSource)),
|
|
59
63
|
};
|
|
60
64
|
}
|
|
61
|
-
function
|
|
62
|
-
let
|
|
63
|
-
for (let
|
|
64
|
-
if (
|
|
65
|
+
function stripDotSegments(pattern) {
|
|
66
|
+
let segments = [];
|
|
67
|
+
for (let segment of pattern.split('/')) {
|
|
68
|
+
if (segment === '' || segment === '.')
|
|
65
69
|
continue;
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
for (let param of match) {
|
|
69
|
-
if (param.name === '*')
|
|
70
|
+
if (segment === '..') {
|
|
71
|
+
segments.pop();
|
|
70
72
|
continue;
|
|
71
|
-
|
|
73
|
+
}
|
|
74
|
+
segments.push(segment);
|
|
72
75
|
}
|
|
73
|
-
return
|
|
76
|
+
return segments.join('/');
|
|
74
77
|
}
|
|
75
78
|
function validateRoutePatterns(urlPattern, filePattern) {
|
|
76
|
-
let urlParams = urlPattern
|
|
77
|
-
let fileParams = filePattern
|
|
79
|
+
let urlParams = getPathnameParams(urlPattern);
|
|
80
|
+
let fileParams = getPathnameParams(filePattern);
|
|
78
81
|
if (urlParams.length !== fileParams.length) {
|
|
79
82
|
throw new Error(`Route patterns must have matching capture structure.\nURL: ${urlPattern}\nFile: ${filePattern}`);
|
|
80
83
|
}
|
|
81
84
|
for (let i = 0; i < urlParams.length; i++) {
|
|
82
|
-
|
|
85
|
+
let urlParam = urlParams[i];
|
|
86
|
+
let fileParam = fileParams[i];
|
|
87
|
+
if (urlParam.type !== fileParam.type || urlParam.name !== fileParam.name) {
|
|
83
88
|
throw new Error(`Route patterns must have matching capture structure.\nURL: ${urlPattern}\nFile: ${filePattern}`);
|
|
84
89
|
}
|
|
85
90
|
}
|
|
86
91
|
}
|
|
87
92
|
function validateNoUnnamedWildcards(pattern, label) {
|
|
88
|
-
if (pattern.
|
|
93
|
+
if (pattern.pathname.tokens.some((token) => token.type === '*' && token.name === '*')) {
|
|
89
94
|
throw new Error(`${label} route patterns must use named wildcards for reversible mapping.\nPattern: ${pattern}`);
|
|
90
95
|
}
|
|
91
96
|
}
|
|
97
|
+
function getPathnameParams(pattern) {
|
|
98
|
+
return pattern.pathname.tokens.filter((token) => token.type === ':' || token.type === '*');
|
|
99
|
+
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../../src/lib/scripts/compiler.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAExD,OAAO,KAAK,EAKV,gBAAgB,EACjB,MAAM,oBAAoB,CAAA;AAI3B,OAAO,KAAK,EAAE,YAAY,EAAiB,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"compiler.d.ts","sourceRoot":"","sources":["../../../src/lib/scripts/compiler.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,7 @@ import { resolveModule, resolverExtensionAlias, resolverExtensions, supportedScr
|
|
|
12
12
|
import { createModuleStore } from "../module-store.js";
|
|
13
13
|
import { createTsconfigTransformOptionsResolver, transformModule } from "./transform.js";
|
|
14
14
|
import { ResolverFactory } from 'oxc-resolver';
|
|
15
|
+
import { isBareImportSpecifier } from "./specifiers.js";
|
|
15
16
|
const supportedScriptExtensionSet = new Set(supportedScriptExtensions);
|
|
16
17
|
const preloadConcurrency = Math.max(1, Math.min(8, os.availableParallelism() - 1));
|
|
17
18
|
export function createScriptCompiler(options) {
|
|
@@ -30,8 +31,14 @@ export function createScriptCompiler(options) {
|
|
|
30
31
|
extensionAlias: resolverExtensionAlias,
|
|
31
32
|
extensions: resolverExtensions,
|
|
32
33
|
mainFields: ['browser', 'module', 'main'],
|
|
34
|
+
symlinks: false,
|
|
33
35
|
tsconfig: 'auto',
|
|
34
36
|
});
|
|
37
|
+
let resolveModulePathOptions = {
|
|
38
|
+
isAllowed: resolvedOptions.isAllowed,
|
|
39
|
+
isDenied: resolvedOptions.isDenied,
|
|
40
|
+
routes: resolvedOptions.routes,
|
|
41
|
+
};
|
|
35
42
|
let resolveInFlightByCacheKey = new Map();
|
|
36
43
|
let emitInFlightByCacheKey = new Map();
|
|
37
44
|
let transformArgs = {
|
|
@@ -50,7 +57,9 @@ export function createScriptCompiler(options) {
|
|
|
50
57
|
let resolveArgs = {
|
|
51
58
|
isAllowed: resolvedOptions.isAllowed,
|
|
52
59
|
isWatchIgnored,
|
|
53
|
-
resolveModulePath
|
|
60
|
+
resolveModulePath(absolutePath) {
|
|
61
|
+
return resolveModulePath(absolutePath, resolveModulePathOptions);
|
|
62
|
+
},
|
|
54
63
|
resolverFactory,
|
|
55
64
|
routes: resolvedOptions.routes,
|
|
56
65
|
};
|
|
@@ -144,7 +153,7 @@ export function createScriptCompiler(options) {
|
|
|
144
153
|
return resolveFilePath(resolvedOptions.rootDir, filePath);
|
|
145
154
|
}
|
|
146
155
|
function resolveServedScriptOrThrow(absolutePath) {
|
|
147
|
-
let resolvedModule = resolveModulePath(absolutePath);
|
|
156
|
+
let resolvedModule = resolveModulePath(absolutePath, resolveModulePathOptions);
|
|
148
157
|
if (!resolvedModule) {
|
|
149
158
|
throw createAssetServerCompilationError(`File not found: ${absolutePath}`, {
|
|
150
159
|
code: 'FILE_NOT_FOUND',
|
|
@@ -366,10 +375,11 @@ function isTsconfigPath(filePath) {
|
|
|
366
375
|
function shouldClearResolverCacheForFileEvent(filePath, event) {
|
|
367
376
|
return event !== 'change' || isPackageJsonPath(filePath) || isTsconfigPath(filePath);
|
|
368
377
|
}
|
|
369
|
-
function resolveModulePath(absolutePath) {
|
|
378
|
+
function resolveModulePath(absolutePath, options) {
|
|
379
|
+
let candidateIdentityPath = normalizeFilePath(absolutePath);
|
|
370
380
|
let resolvedPath;
|
|
371
381
|
try {
|
|
372
|
-
resolvedPath = normalizeFilePath(fs.realpathSync(
|
|
382
|
+
resolvedPath = normalizeFilePath(fs.realpathSync(candidateIdentityPath));
|
|
373
383
|
}
|
|
374
384
|
catch (error) {
|
|
375
385
|
if (isNoEntityError(error))
|
|
@@ -380,10 +390,26 @@ function resolveModulePath(absolutePath) {
|
|
|
380
390
|
return null;
|
|
381
391
|
}
|
|
382
392
|
return {
|
|
383
|
-
identityPath: resolvedPath,
|
|
393
|
+
identityPath: getModuleIdentityPath(candidateIdentityPath, resolvedPath, options),
|
|
384
394
|
resolvedPath,
|
|
385
395
|
};
|
|
386
396
|
}
|
|
397
|
+
function getModuleIdentityPath(candidateIdentityPath, resolvedPath, options) {
|
|
398
|
+
if (candidateIdentityPath === resolvedPath)
|
|
399
|
+
return resolvedPath;
|
|
400
|
+
if (!containsNodeModulesPathSegment(candidateIdentityPath))
|
|
401
|
+
return resolvedPath;
|
|
402
|
+
if (!options.routes.toUrlPathname(candidateIdentityPath))
|
|
403
|
+
return resolvedPath;
|
|
404
|
+
if (!options.isAllowed(candidateIdentityPath))
|
|
405
|
+
return resolvedPath;
|
|
406
|
+
if (options.isDenied(resolvedPath))
|
|
407
|
+
return resolvedPath;
|
|
408
|
+
return candidateIdentityPath;
|
|
409
|
+
}
|
|
410
|
+
function containsNodeModulesPathSegment(filePath) {
|
|
411
|
+
return filePath.split('/').includes('node_modules');
|
|
412
|
+
}
|
|
387
413
|
function resolveActualPath(identityPath) {
|
|
388
414
|
try {
|
|
389
415
|
return normalizeFilePath(fs.realpathSync(identityPath));
|
|
@@ -394,15 +420,6 @@ function resolveActualPath(identityPath) {
|
|
|
394
420
|
throw error;
|
|
395
421
|
}
|
|
396
422
|
}
|
|
397
|
-
function isBareImportSpecifier(specifier) {
|
|
398
|
-
return (!specifier.startsWith('./') &&
|
|
399
|
-
!specifier.startsWith('../') &&
|
|
400
|
-
!specifier.startsWith('/') &&
|
|
401
|
-
!specifier.startsWith('file:') &&
|
|
402
|
-
!specifier.startsWith('data:') &&
|
|
403
|
-
!specifier.startsWith('http://') &&
|
|
404
|
-
!specifier.startsWith('https://'));
|
|
405
|
-
}
|
|
406
423
|
function isNoEntityError(error) {
|
|
407
424
|
return (error instanceof Error &&
|
|
408
425
|
'code' in error &&
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/lib/scripts/resolve.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAMnD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAA;AAM1E,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAC5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"resolve.d.ts","sourceRoot":"","sources":["../../../src/lib/scripts/resolve.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,cAAc,CAAA;AAMnD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAA;AAM1E,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,KAAK,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAA;AAC5E,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAG9C,KAAK,YAAY,GAAG,YAAY,CAAC,iBAAiB,EAAE,cAAc,EAAE,aAAa,CAAC,CAAA;AAElF,eAAO,MAAM,sBAAsB;;;;CAIC,CAAA;AAEpC,eAAO,MAAM,kBAAkB,UAAiD,CAAA;AAChF,eAAO,MAAM,yBAAyB,UAAiD,CAAA;AAGvF,KAAK,cAAc,GAAG;IACpB,OAAO,EAAE,MAAM,CAAA;IACf,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;IACvB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAYD,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,YAAY,EAAE,MAAM,CAAA;IACpB,OAAO,EAAE,cAAc,EAAE,CAAA;IACzB,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,iBAAiB,EAAE,MAAM,CAAA;CAC1B,CAAA;AAED,KAAK,aAAa,GAAG;IACnB,QAAQ,EAAE,cAAc,CAAA;CACzB,GAAG,CACA;IACE,EAAE,EAAE,IAAI,CAAA;IACR,KAAK,EAAE,cAAc,CAAA;CACtB,GACD;IACE,EAAE,EAAE,KAAK,CAAA;IACT,KAAK,EAAE,2BAA2B,CAAA;CACnC,CACJ,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAA;IACxC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAA;IACzC,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,mBAAmB,GAAG,IAAI,CAAA;IACnE,eAAe,EAAE,eAAe,CAAA;IAChC,MAAM,EAAE,cAAc,CAAA;CACvB,CAAA;AAkBD,wBAAsB,aAAa,CACjC,MAAM,EAAE,YAAY,EACpB,WAAW,EAAE,iBAAiB,EAC9B,IAAI,EAAE,WAAW,GAChB,OAAO,CAAC,aAAa,CAAC,CA+IxB"}
|