@remix-run/assets 0.0.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.
- package/LICENSE +21 -0
- package/README.md +325 -2
- package/dist/assets.d.ts +3 -0
- package/dist/assets.d.ts.map +1 -0
- package/dist/assets.js +1 -0
- package/dist/lib/access.d.ts +10 -0
- package/dist/lib/access.d.ts.map +1 -0
- package/dist/lib/access.js +14 -0
- package/dist/lib/asset-server.d.ts +139 -0
- package/dist/lib/asset-server.d.ts.map +1 -0
- package/dist/lib/asset-server.js +338 -0
- package/dist/lib/compilation-error.d.ts +33 -0
- package/dist/lib/compilation-error.d.ts.map +1 -0
- package/dist/lib/compilation-error.js +32 -0
- package/dist/lib/file-matcher.d.ts +6 -0
- package/dist/lib/file-matcher.d.ts.map +1 -0
- package/dist/lib/file-matcher.js +44 -0
- package/dist/lib/fingerprint.d.ts +12 -0
- package/dist/lib/fingerprint.d.ts.map +1 -0
- package/dist/lib/fingerprint.js +49 -0
- package/dist/lib/module-store.d.ts +41 -0
- package/dist/lib/module-store.d.ts.map +1 -0
- package/dist/lib/module-store.js +230 -0
- package/dist/lib/paths.d.ts +8 -0
- package/dist/lib/paths.d.ts.map +1 -0
- package/dist/lib/paths.js +50 -0
- package/dist/lib/routes.d.ts +13 -0
- package/dist/lib/routes.d.ts.map +1 -0
- package/dist/lib/routes.js +94 -0
- package/dist/lib/scripts/cjs-check.d.ts +3 -0
- package/dist/lib/scripts/cjs-check.d.ts.map +1 -0
- package/dist/lib/scripts/cjs-check.js +398 -0
- package/dist/lib/scripts/compiler.d.ts +62 -0
- package/dist/lib/scripts/compiler.d.ts.map +1 -0
- package/dist/lib/scripts/compiler.js +439 -0
- package/dist/lib/scripts/emit.d.ts +25 -0
- package/dist/lib/scripts/emit.d.ts.map +1 -0
- package/dist/lib/scripts/emit.js +63 -0
- package/dist/lib/scripts/resolve.d.ts +50 -0
- package/dist/lib/scripts/resolve.d.ts.map +1 -0
- package/dist/lib/scripts/resolve.js +236 -0
- package/dist/lib/scripts/transform.d.ts +64 -0
- package/dist/lib/scripts/transform.d.ts.map +1 -0
- package/dist/lib/scripts/transform.js +373 -0
- package/dist/lib/source-maps.d.ts +4 -0
- package/dist/lib/source-maps.d.ts.map +1 -0
- package/dist/lib/source-maps.js +62 -0
- package/dist/lib/styles/compiler.d.ts +52 -0
- package/dist/lib/styles/compiler.d.ts.map +1 -0
- package/dist/lib/styles/compiler.js +272 -0
- package/dist/lib/styles/emit.d.ts +25 -0
- package/dist/lib/styles/emit.d.ts.map +1 -0
- package/dist/lib/styles/emit.js +78 -0
- package/dist/lib/styles/resolve.d.ts +48 -0
- package/dist/lib/styles/resolve.d.ts.map +1 -0
- package/dist/lib/styles/resolve.js +188 -0
- package/dist/lib/styles/transform.d.ts +47 -0
- package/dist/lib/styles/transform.d.ts.map +1 -0
- package/dist/lib/styles/transform.js +131 -0
- package/dist/lib/target.d.ts +21 -0
- package/dist/lib/target.d.ts.map +1 -0
- package/dist/lib/target.js +127 -0
- package/dist/lib/watch.d.ts +22 -0
- package/dist/lib/watch.d.ts.map +1 -0
- package/dist/lib/watch.js +96 -0
- package/package.json +55 -12
- package/src/assets.ts +2 -0
- package/src/lib/access.ts +24 -0
- package/src/lib/asset-server.ts +537 -0
- package/src/lib/compilation-error.ts +61 -0
- package/src/lib/file-matcher.ts +63 -0
- package/src/lib/fingerprint.ts +65 -0
- package/src/lib/module-store.ts +340 -0
- package/src/lib/paths.ts +66 -0
- package/src/lib/routes.ts +164 -0
- package/src/lib/scripts/cjs-check.ts +476 -0
- package/src/lib/scripts/compiler.ts +640 -0
- package/src/lib/scripts/emit.ts +122 -0
- package/src/lib/scripts/resolve.ts +433 -0
- package/src/lib/scripts/transform.ts +609 -0
- package/src/lib/source-maps.ts +75 -0
- package/src/lib/styles/compiler.ts +400 -0
- package/src/lib/styles/emit.ts +137 -0
- package/src/lib/styles/resolve.ts +316 -0
- package/src/lib/styles/transform.ts +226 -0
- package/src/lib/target.ts +196 -0
- package/src/lib/watch.ts +136 -0
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as path from 'node:path';
|
|
3
|
+
import { createAssetServerCompilationError, isAssetServerCompilationError, } from "../compilation-error.js";
|
|
4
|
+
import { normalizeFilePath } from "../paths.js";
|
|
5
|
+
export const resolverExtensionAlias = {
|
|
6
|
+
'.js': ['.js', '.ts', '.tsx', '.jsx'],
|
|
7
|
+
'.jsx': ['.jsx', '.tsx'],
|
|
8
|
+
'.mjs': ['.mjs', '.mts'],
|
|
9
|
+
};
|
|
10
|
+
export const resolverExtensions = ['.ts', '.tsx', '.js', '.jsx', '.mts', '.mjs'];
|
|
11
|
+
export const supportedScriptExtensions = ['.ts', '.tsx', '.js', '.jsx', '.mts', '.mjs'];
|
|
12
|
+
const supportedScriptExtensionSet = new Set(supportedScriptExtensions);
|
|
13
|
+
export async function resolveModule(record, transformed, args) {
|
|
14
|
+
let trackedFiles = new Set(transformed.trackedFiles);
|
|
15
|
+
let trackedResolutions = [];
|
|
16
|
+
let resolvedImports;
|
|
17
|
+
try {
|
|
18
|
+
resolvedImports =
|
|
19
|
+
transformed.unresolvedImports.length > 0
|
|
20
|
+
? await batchResolveSpecifiers(getUniqueSpecifiers(transformed.unresolvedImports), transformed.resolvedPath, args.resolverFactory)
|
|
21
|
+
: new Map();
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
return failResolve(error, trackedFiles, trackedResolutions, transformed.resolvedPath, {
|
|
25
|
+
isWatchIgnored: args.isWatchIgnored,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
let importsWithPaths = [];
|
|
29
|
+
let deps = new Set();
|
|
30
|
+
for (let unresolved of transformed.unresolvedImports) {
|
|
31
|
+
let trackedResolution = getTrackedRelativeImportResolution(transformed.importerDir, unresolved.specifier, args.isWatchIgnored);
|
|
32
|
+
let resolvedSpec = resolvedImports.get(unresolved.specifier);
|
|
33
|
+
if (!resolvedSpec?.absolutePath) {
|
|
34
|
+
return failResolve(createAssetServerCompilationError(`Failed to resolve import "${unresolved.specifier}" in ${transformed.resolvedPath}. ` +
|
|
35
|
+
`Ensure it resolves to a file within the configured asset server fileMap, or mark it as external.`, {
|
|
36
|
+
code: 'IMPORT_RESOLUTION_FAILED',
|
|
37
|
+
}), trackedFiles, trackedResolutions, transformed.resolvedPath, { isWatchIgnored: args.isWatchIgnored, trackedResolution });
|
|
38
|
+
}
|
|
39
|
+
let resolvedImport = args.resolveModulePath(resolvedSpec.absolutePath);
|
|
40
|
+
if (!resolvedImport) {
|
|
41
|
+
return failResolve(createAssetServerCompilationError(`Import "${unresolved.specifier}" in ${transformed.resolvedPath}, resolved to "${resolvedSpec.absolutePath}", is not a supported script file. ` +
|
|
42
|
+
`Supported extensions are ${supportedScriptExtensions.join(', ')}.`, {
|
|
43
|
+
code: 'IMPORT_NOT_SUPPORTED',
|
|
44
|
+
}), trackedFiles, trackedResolutions, transformed.resolvedPath, { isWatchIgnored: args.isWatchIgnored, trackedResolution });
|
|
45
|
+
}
|
|
46
|
+
if (!args.isAllowed(resolvedImport.identityPath)) {
|
|
47
|
+
return failResolve(createAssetServerCompilationError(`Import "${unresolved.specifier}" in ${transformed.resolvedPath}, resolved to "${resolvedImport.identityPath}", is not allowed by the asset server allow/deny configuration. ` +
|
|
48
|
+
`Add a matching allow rule for this file path, remove a conflicting deny rule for this file path, or mark this import as external.`, {
|
|
49
|
+
code: 'IMPORT_NOT_ALLOWED',
|
|
50
|
+
}), trackedFiles, trackedResolutions, transformed.resolvedPath, { isWatchIgnored: args.isWatchIgnored, trackedResolution });
|
|
51
|
+
}
|
|
52
|
+
let stableUrlPathname = args.routes.toUrlPathname(resolvedImport.identityPath);
|
|
53
|
+
if (!stableUrlPathname) {
|
|
54
|
+
return failResolve(createAssetServerCompilationError(`Import "${unresolved.specifier}" in ${transformed.resolvedPath}, resolved to "${resolvedImport.identityPath}", is outside all configured fileMap entries. ` +
|
|
55
|
+
`Add a matching fileMap entry for this file path, or mark this import as external.`, {
|
|
56
|
+
code: 'IMPORT_OUTSIDE_FILE_MAP',
|
|
57
|
+
}), trackedFiles, trackedResolutions, transformed.resolvedPath, { isWatchIgnored: args.isWatchIgnored, trackedResolution });
|
|
58
|
+
}
|
|
59
|
+
deps.add(resolvedImport.identityPath);
|
|
60
|
+
if (transformed.packageSpecifiers.includes(unresolved.specifier)) {
|
|
61
|
+
let packageJsonPath = resolvedSpec.packageJsonPath ?? findNearestPackageJsonPath(resolvedImport.resolvedPath);
|
|
62
|
+
if (packageJsonPath && !args.isWatchIgnored(packageJsonPath)) {
|
|
63
|
+
trackedFiles.add(packageJsonPath);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
if (trackedResolution) {
|
|
67
|
+
trackedResolutions.push({
|
|
68
|
+
...trackedResolution,
|
|
69
|
+
resolvedIdentityPath: resolvedImport.identityPath,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
importsWithPaths.push({
|
|
73
|
+
depPath: resolvedImport.identityPath,
|
|
74
|
+
end: unresolved.end,
|
|
75
|
+
quote: unresolved.quote,
|
|
76
|
+
start: unresolved.start,
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
return {
|
|
80
|
+
ok: true,
|
|
81
|
+
tracking: toResolveTracking(trackedFiles, trackedResolutions),
|
|
82
|
+
value: {
|
|
83
|
+
deps: [...deps],
|
|
84
|
+
fingerprint: transformed.fingerprint,
|
|
85
|
+
identityPath: record.identityPath,
|
|
86
|
+
imports: importsWithPaths,
|
|
87
|
+
trackedFiles: [...trackedFiles],
|
|
88
|
+
rawCode: transformed.rawCode,
|
|
89
|
+
resolvedPath: transformed.resolvedPath,
|
|
90
|
+
sourceMap: transformed.sourceMap,
|
|
91
|
+
stableUrlPathname: transformed.stableUrlPathname,
|
|
92
|
+
},
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
function findNearestPackageJsonPath(filePath) {
|
|
96
|
+
let directory = path.dirname(filePath);
|
|
97
|
+
while (true) {
|
|
98
|
+
let packageJsonPath = path.join(directory, 'package.json');
|
|
99
|
+
if (fs.existsSync(packageJsonPath)) {
|
|
100
|
+
return normalizeFilePath(packageJsonPath);
|
|
101
|
+
}
|
|
102
|
+
let parentDirectory = path.dirname(directory);
|
|
103
|
+
if (parentDirectory === directory)
|
|
104
|
+
return null;
|
|
105
|
+
directory = parentDirectory;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
function isRelativeImportSpecifier(specifier) {
|
|
109
|
+
return specifier.startsWith('./') || specifier.startsWith('../');
|
|
110
|
+
}
|
|
111
|
+
function getTrackedRelativeImportResolution(importerDir, specifier, isWatchIgnored) {
|
|
112
|
+
if (!isRelativeImportSpecifier(specifier))
|
|
113
|
+
return null;
|
|
114
|
+
let candidatePath = resolveCandidateBasePath(importerDir, specifier);
|
|
115
|
+
let candidatePrefixes = [`${candidatePath}/`].filter((candidatePrefix) => !isWatchIgnored(candidatePrefix.replace(/\/+$/, '') || '/'));
|
|
116
|
+
let extension = path.extname(specifier);
|
|
117
|
+
if (extension === '') {
|
|
118
|
+
let candidatePaths = [
|
|
119
|
+
candidatePath,
|
|
120
|
+
...supportedScriptExtensions.map((candidateExtension) => `${candidatePath}${candidateExtension}`),
|
|
121
|
+
].filter((candidatePath) => !isWatchIgnored(candidatePath));
|
|
122
|
+
return candidatePaths.length === 0 && candidatePrefixes.length === 0
|
|
123
|
+
? null
|
|
124
|
+
: {
|
|
125
|
+
candidatePaths,
|
|
126
|
+
candidatePrefixes,
|
|
127
|
+
specifier,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
let candidateExtensions = resolverExtensionAlias[extension];
|
|
131
|
+
if (!candidateExtensions && !supportedScriptExtensionSet.has(extension)) {
|
|
132
|
+
let candidatePaths = [
|
|
133
|
+
candidatePath,
|
|
134
|
+
...supportedScriptExtensions.map((candidateExtension) => `${candidatePath}${candidateExtension}`),
|
|
135
|
+
].filter((candidatePath) => !isWatchIgnored(candidatePath));
|
|
136
|
+
return candidatePaths.length === 0 && candidatePrefixes.length === 0
|
|
137
|
+
? null
|
|
138
|
+
: {
|
|
139
|
+
candidatePaths,
|
|
140
|
+
candidatePrefixes,
|
|
141
|
+
specifier,
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
if (!candidateExtensions)
|
|
145
|
+
return null;
|
|
146
|
+
let candidatePaths = [
|
|
147
|
+
candidatePath,
|
|
148
|
+
...candidateExtensions.map((candidateExtension) => `${candidatePath.slice(0, candidatePath.length - extension.length)}${candidateExtension}`),
|
|
149
|
+
].filter((candidatePath) => !isWatchIgnored(candidatePath));
|
|
150
|
+
return candidatePaths.length === 0 && candidatePrefixes.length === 0
|
|
151
|
+
? null
|
|
152
|
+
: {
|
|
153
|
+
candidatePaths,
|
|
154
|
+
candidatePrefixes,
|
|
155
|
+
specifier,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
function resolveCandidateBasePath(importerDir, specifier) {
|
|
159
|
+
return normalizeFilePath(path.resolve(importerDir, specifier));
|
|
160
|
+
}
|
|
161
|
+
async function batchResolveSpecifiers(specifiers, importerPath, resolverFactory) {
|
|
162
|
+
let resolvedBySpecifier = new Map();
|
|
163
|
+
if (specifiers.length === 0)
|
|
164
|
+
return resolvedBySpecifier;
|
|
165
|
+
try {
|
|
166
|
+
for (let specifier of specifiers) {
|
|
167
|
+
let resolutionResult = await resolverFactory.resolveFileAsync(importerPath, specifier);
|
|
168
|
+
if (resolutionResult.error) {
|
|
169
|
+
throw createAssetServerCompilationError(`Failed to resolve import "${specifier}" in ${importerPath}. ` +
|
|
170
|
+
`Ensure it resolves to a file within the configured asset server fileMap, or mark it as external.`, {
|
|
171
|
+
code: 'IMPORT_RESOLUTION_FAILED',
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
resolvedBySpecifier.set(specifier, {
|
|
175
|
+
absolutePath: resolutionResult.path && path.isAbsolute(resolutionResult.path)
|
|
176
|
+
? normalizeFilePath(resolutionResult.path)
|
|
177
|
+
: null,
|
|
178
|
+
packageJsonPath: resolutionResult.packageJsonPath
|
|
179
|
+
? normalizeFilePath(resolutionResult.packageJsonPath)
|
|
180
|
+
: null,
|
|
181
|
+
specifier,
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
if (isAssetServerCompilationError(error) && error.code === 'IMPORT_RESOLUTION_FAILED') {
|
|
187
|
+
throw error;
|
|
188
|
+
}
|
|
189
|
+
throw createAssetServerCompilationError(`Failed to resolve imports in ${importerPath}. ${formatUnknownError(error)}`, {
|
|
190
|
+
cause: error,
|
|
191
|
+
code: 'IMPORT_RESOLUTION_FAILED',
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
return resolvedBySpecifier;
|
|
195
|
+
}
|
|
196
|
+
function getUniqueSpecifiers(unresolvedImports) {
|
|
197
|
+
return [...new Set(unresolvedImports.map((unresolved) => unresolved.specifier))];
|
|
198
|
+
}
|
|
199
|
+
function formatUnknownError(error) {
|
|
200
|
+
return error instanceof Error ? error.message : String(error);
|
|
201
|
+
}
|
|
202
|
+
function failResolve(error, trackedFiles, trackedResolutions, importerPath, options = {}) {
|
|
203
|
+
return {
|
|
204
|
+
ok: false,
|
|
205
|
+
error: toResolveError(error, importerPath),
|
|
206
|
+
tracking: toResolveTracking(trackedFiles, appendFailedTrackedResolution(trackedResolutions, options.trackedResolution)),
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
function toResolveTracking(trackedFiles, trackedResolutions) {
|
|
210
|
+
return {
|
|
211
|
+
trackedFiles: [
|
|
212
|
+
...trackedFiles,
|
|
213
|
+
...trackedResolutions.flatMap((trackedResolution) => trackedResolution.candidatePaths),
|
|
214
|
+
],
|
|
215
|
+
trackedDirectories: trackedResolutions.flatMap((trackedResolution) => trackedResolution.candidatePrefixes),
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
function appendFailedTrackedResolution(trackedResolutions, trackedResolution) {
|
|
219
|
+
if (trackedResolution == null)
|
|
220
|
+
return [...trackedResolutions];
|
|
221
|
+
return [
|
|
222
|
+
...trackedResolutions,
|
|
223
|
+
{
|
|
224
|
+
...trackedResolution,
|
|
225
|
+
resolvedIdentityPath: null,
|
|
226
|
+
},
|
|
227
|
+
];
|
|
228
|
+
}
|
|
229
|
+
function toResolveError(error, importerPath) {
|
|
230
|
+
if (isAssetServerCompilationError(error))
|
|
231
|
+
return error;
|
|
232
|
+
return createAssetServerCompilationError(`Failed to resolve imports in ${importerPath}. ${formatUnknownError(error)}`, {
|
|
233
|
+
cause: error,
|
|
234
|
+
code: 'IMPORT_RESOLUTION_FAILED',
|
|
235
|
+
});
|
|
236
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { TsConfigJsonResolved } from 'get-tsconfig';
|
|
2
|
+
import type { AssetServerCompilationError } from '../compilation-error.ts';
|
|
3
|
+
import type { ModuleRecord, ModuleTracking } from '../module-store.ts';
|
|
4
|
+
import type { CompiledRoutes } from '../routes.ts';
|
|
5
|
+
import type { EmittedModule } from './emit.ts';
|
|
6
|
+
import type { ResolvedScriptTarget } from '../target.ts';
|
|
7
|
+
import type { ResolvedModule } from './resolve.ts';
|
|
8
|
+
type ScriptRecord = ModuleRecord<TransformedModule, ResolvedModule, EmittedModule>;
|
|
9
|
+
export type ResolveModuleResult = {
|
|
10
|
+
identityPath: string;
|
|
11
|
+
resolvedPath: string;
|
|
12
|
+
};
|
|
13
|
+
type UnresolvedImport = {
|
|
14
|
+
end: number;
|
|
15
|
+
quote?: '"' | "'" | '`';
|
|
16
|
+
specifier: string;
|
|
17
|
+
start: number;
|
|
18
|
+
};
|
|
19
|
+
export type TransformedModule = {
|
|
20
|
+
fingerprint: string | null;
|
|
21
|
+
identityPath: string;
|
|
22
|
+
importerDir: string;
|
|
23
|
+
packageSpecifiers: string[];
|
|
24
|
+
rawCode: string;
|
|
25
|
+
resolvedPath: string;
|
|
26
|
+
sourceMap: string | null;
|
|
27
|
+
stableUrlPathname: string;
|
|
28
|
+
trackedFiles: string[];
|
|
29
|
+
unresolvedImports: UnresolvedImport[];
|
|
30
|
+
};
|
|
31
|
+
type TransformResult = {
|
|
32
|
+
tracking: ModuleTracking;
|
|
33
|
+
} & ({
|
|
34
|
+
ok: true;
|
|
35
|
+
value: TransformedModule;
|
|
36
|
+
} | {
|
|
37
|
+
ok: false;
|
|
38
|
+
error: AssetServerCompilationError;
|
|
39
|
+
});
|
|
40
|
+
type TsconfigTransformOptions = {
|
|
41
|
+
trackedFiles: string[];
|
|
42
|
+
tsconfigRaw?: TsConfigJsonResolved;
|
|
43
|
+
};
|
|
44
|
+
type TsconfigTransformOptionsResolver = ReturnType<typeof createTsconfigTransformOptionsResolver>;
|
|
45
|
+
export type TransformArgs = {
|
|
46
|
+
buildId: string | null;
|
|
47
|
+
define: Record<string, string> | null;
|
|
48
|
+
externalSet: ReadonlySet<string>;
|
|
49
|
+
isWatchIgnored(filePath: string): boolean;
|
|
50
|
+
minify: boolean;
|
|
51
|
+
resolveActualPath(identityPath: string): string | null;
|
|
52
|
+
routes: CompiledRoutes;
|
|
53
|
+
sourceMapSourcePaths: 'absolute' | 'url';
|
|
54
|
+
sourceMaps: 'external' | 'inline' | null;
|
|
55
|
+
target: ResolvedScriptTarget | null;
|
|
56
|
+
tsconfigTransformOptionsResolver: TsconfigTransformOptionsResolver;
|
|
57
|
+
};
|
|
58
|
+
export declare function createTsconfigTransformOptionsResolver(): {
|
|
59
|
+
clear(): void;
|
|
60
|
+
getTransformOptions(filePath: string, isWatchIgnored: (filePath: string) => boolean): TsconfigTransformOptions;
|
|
61
|
+
};
|
|
62
|
+
export declare function transformModule(record: ScriptRecord, args: TransformArgs): Promise<TransformResult>;
|
|
63
|
+
export {};
|
|
64
|
+
//# sourceMappingURL=transform.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transform.d.ts","sourceRoot":"","sources":["../../../src/lib/scripts/transform.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAS,oBAAoB,EAAE,MAAM,cAAc,CAAA;AAQ/D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,yBAAyB,CAAA;AAE1E,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AAEtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAElD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAA;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAElD,KAAK,YAAY,GAAG,YAAY,CAAC,iBAAiB,EAAE,cAAc,EAAE,aAAa,CAAC,CAAA;AA4BlF,MAAM,MAAM,mBAAmB,GAAG;IAChC,YAAY,EAAE,MAAM,CAAA;IACpB,YAAY,EAAE,MAAM,CAAA;CACrB,CAAA;AAED,KAAK,gBAAgB,GAAG;IACtB,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,CAAC,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,YAAY,EAAE,MAAM,CAAA;IACpB,WAAW,EAAE,MAAM,CAAA;IACnB,iBAAiB,EAAE,MAAM,EAAE,CAAA;IAC3B,OAAO,EAAE,MAAM,CAAA;IACf,YAAY,EAAE,MAAM,CAAA;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,iBAAiB,EAAE,MAAM,CAAA;IACzB,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,iBAAiB,EAAE,gBAAgB,EAAE,CAAA;CACtC,CAAA;AAED,KAAK,eAAe,GAAG;IACrB,QAAQ,EAAE,cAAc,CAAA;CACzB,GAAG,CACA;IACE,EAAE,EAAE,IAAI,CAAA;IACR,KAAK,EAAE,iBAAiB,CAAA;CACzB,GACD;IACE,EAAE,EAAE,KAAK,CAAA;IACT,KAAK,EAAE,2BAA2B,CAAA;CACnC,CACJ,CAAA;AAED,KAAK,wBAAwB,GAAG;IAC9B,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,WAAW,CAAC,EAAE,oBAAoB,CAAA;CACnC,CAAA;AAED,KAAK,gCAAgC,GAAG,UAAU,CAAC,OAAO,sCAAsC,CAAC,CAAA;AAEjG,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAA;IACrC,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;IAChC,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAA;IACzC,MAAM,EAAE,OAAO,CAAA;IACf,iBAAiB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;IACtD,MAAM,EAAE,cAAc,CAAA;IACtB,oBAAoB,EAAE,UAAU,GAAG,KAAK,CAAA;IACxC,UAAU,EAAE,UAAU,GAAG,QAAQ,GAAG,IAAI,CAAA;IACxC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAA;IACnC,gCAAgC,EAAE,gCAAgC,CAAA;CACnE,CAAA;AAED,wBAAgB,sCAAsC;;;EAkCrD;AAED,wBAAsB,eAAe,CACnC,MAAM,EAAE,YAAY,EACpB,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,eAAe,CAAC,CA6H1B"}
|
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as fsp from 'node:fs/promises';
|
|
3
|
+
import * as path from 'node:path';
|
|
4
|
+
import { getTsconfig } from 'get-tsconfig';
|
|
5
|
+
import { minify } from 'oxc-minify';
|
|
6
|
+
import { transform as oxcTransform } from 'oxc-transform';
|
|
7
|
+
import { init as esModuleLexerInit, parse as esModuleLexer } from 'es-module-lexer';
|
|
8
|
+
import { isCommonJS, mayContainCommonJSModuleGlobals } from "./cjs-check.js";
|
|
9
|
+
import { createAssetServerCompilationError, isAssetServerCompilationError, } from "../compilation-error.js";
|
|
10
|
+
import { generateFingerprint } from "../fingerprint.js";
|
|
11
|
+
import { normalizeFilePath } from "../paths.js";
|
|
12
|
+
import { composeSourceMaps, rewriteSourceMapSources, stringifySourceMap } from "../source-maps.js";
|
|
13
|
+
const scriptModuleTypes = [
|
|
14
|
+
{ extension: '.js', lang: 'js' },
|
|
15
|
+
{ extension: '.jsx', lang: 'jsx' },
|
|
16
|
+
{ extension: '.mjs', lang: 'js' },
|
|
17
|
+
{ extension: '.mts', lang: 'ts' },
|
|
18
|
+
{ extension: '.ts', lang: 'ts' },
|
|
19
|
+
{ extension: '.tsx', lang: 'tsx' },
|
|
20
|
+
];
|
|
21
|
+
const sourceLanguageByExtension = new Map(scriptModuleTypes.map(({ extension, lang }) => [extension, lang]));
|
|
22
|
+
const supportedTsconfigTransformCompilerOptions = {
|
|
23
|
+
allowNamespaces: 'allowNamespaces',
|
|
24
|
+
emitDecoratorMetadata: 'emitDecoratorMetadata',
|
|
25
|
+
experimentalDecorators: 'experimentalDecorators',
|
|
26
|
+
jsx: 'jsx',
|
|
27
|
+
jsxFactory: 'jsxFactory',
|
|
28
|
+
jsxFragmentFactory: 'jsxFragmentFactory',
|
|
29
|
+
jsxImportSource: 'jsxImportSource',
|
|
30
|
+
useDefineForClassFields: 'useDefineForClassFields',
|
|
31
|
+
};
|
|
32
|
+
export function createTsconfigTransformOptionsResolver() {
|
|
33
|
+
let fileSystemCache = new Map();
|
|
34
|
+
let transformOptionsByDirectory = new Map();
|
|
35
|
+
return {
|
|
36
|
+
clear() {
|
|
37
|
+
fileSystemCache = new Map();
|
|
38
|
+
transformOptionsByDirectory.clear();
|
|
39
|
+
},
|
|
40
|
+
getTransformOptions(filePath, isWatchIgnored) {
|
|
41
|
+
let directory = path.dirname(filePath);
|
|
42
|
+
let cached = transformOptionsByDirectory.get(directory);
|
|
43
|
+
if (cached)
|
|
44
|
+
return cached;
|
|
45
|
+
let tsconfig = getTsconfig(directory, 'tsconfig.json', fileSystemCache);
|
|
46
|
+
if (!tsconfig) {
|
|
47
|
+
let transformOptions = { trackedFiles: [] };
|
|
48
|
+
transformOptionsByDirectory.set(directory, transformOptions);
|
|
49
|
+
return transformOptions;
|
|
50
|
+
}
|
|
51
|
+
let tsconfigPath = findNearestTsconfigPath(directory);
|
|
52
|
+
let transformOptions = {
|
|
53
|
+
trackedFiles: tsconfigPath && !isWatchIgnored(tsconfigPath) ? [tsconfigPath] : [],
|
|
54
|
+
tsconfigRaw: tsconfig.config,
|
|
55
|
+
};
|
|
56
|
+
transformOptionsByDirectory.set(directory, transformOptions);
|
|
57
|
+
return transformOptions;
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
export async function transformModule(record, args) {
|
|
62
|
+
let resolvedPath = args.resolveActualPath(record.identityPath);
|
|
63
|
+
if (!resolvedPath) {
|
|
64
|
+
return {
|
|
65
|
+
ok: false,
|
|
66
|
+
error: createAssetServerCompilationError(`File not found: ${record.identityPath}`, {
|
|
67
|
+
code: 'FILE_NOT_FOUND',
|
|
68
|
+
}),
|
|
69
|
+
tracking: {
|
|
70
|
+
trackedFiles: args.isWatchIgnored(record.identityPath) ? [] : [record.identityPath],
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
let transformOptions = args.tsconfigTransformOptionsResolver.getTransformOptions(resolvedPath, args.isWatchIgnored);
|
|
75
|
+
let trackedFiles = [
|
|
76
|
+
...(args.isWatchIgnored(resolvedPath) ? [] : [resolvedPath]),
|
|
77
|
+
...transformOptions.trackedFiles,
|
|
78
|
+
];
|
|
79
|
+
let sourceText;
|
|
80
|
+
try {
|
|
81
|
+
sourceText = await fsp.readFile(resolvedPath, 'utf-8');
|
|
82
|
+
}
|
|
83
|
+
catch (error) {
|
|
84
|
+
if (isNoEntityError(error)) {
|
|
85
|
+
return {
|
|
86
|
+
ok: false,
|
|
87
|
+
error: createAssetServerCompilationError(`File not found: ${resolvedPath}`, {
|
|
88
|
+
cause: error,
|
|
89
|
+
code: 'FILE_NOT_FOUND',
|
|
90
|
+
}),
|
|
91
|
+
tracking: {
|
|
92
|
+
trackedFiles,
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
ok: false,
|
|
98
|
+
error: toTransformFailedError(error, resolvedPath),
|
|
99
|
+
tracking: {
|
|
100
|
+
trackedFiles,
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
try {
|
|
105
|
+
let analysis = await analyzeModuleSource(sourceText, resolvedPath, transformOptions, {
|
|
106
|
+
define: args.define ?? undefined,
|
|
107
|
+
minify: args.minify,
|
|
108
|
+
sourceMaps: args.sourceMaps ?? undefined,
|
|
109
|
+
target: args.target ?? undefined,
|
|
110
|
+
});
|
|
111
|
+
analysis.unresolvedImports = analysis.unresolvedImports.filter((unresolved) => !args.externalSet.has(unresolved.specifier));
|
|
112
|
+
if (mayContainCommonJSModuleGlobals(sourceText) && isCommonJS(analysis.rawCode)) {
|
|
113
|
+
throw createAssetServerCompilationError(`CommonJS module detected: ${resolvedPath}. ` +
|
|
114
|
+
`This module uses CommonJS (require/module.exports) which is not supported. ` +
|
|
115
|
+
`Please use an ESM-compatible module.`, {
|
|
116
|
+
code: 'COMMONJS_NOT_SUPPORTED',
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
let stableUrlPathname = args.routes.toUrlPathname(record.identityPath);
|
|
120
|
+
if (!stableUrlPathname) {
|
|
121
|
+
throw createAssetServerCompilationError(`File ${record.identityPath} is outside all configured fileMap entries.`, {
|
|
122
|
+
code: 'FILE_OUTSIDE_FILE_MAP',
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
let sourceMap = analysis.sourceMap
|
|
126
|
+
? rewriteSourceMapSources(analysis.sourceMap, resolvedPath, stableUrlPathname, args.sourceMapSourcePaths, sourceText)
|
|
127
|
+
: null;
|
|
128
|
+
return {
|
|
129
|
+
ok: true,
|
|
130
|
+
tracking: {
|
|
131
|
+
trackedFiles,
|
|
132
|
+
},
|
|
133
|
+
value: {
|
|
134
|
+
fingerprint: args.buildId === null
|
|
135
|
+
? null
|
|
136
|
+
: await generateFingerprint({
|
|
137
|
+
buildId: args.buildId,
|
|
138
|
+
content: sourceText,
|
|
139
|
+
}),
|
|
140
|
+
identityPath: record.identityPath,
|
|
141
|
+
importerDir: path.dirname(resolvedPath),
|
|
142
|
+
packageSpecifiers: analysis.unresolvedImports
|
|
143
|
+
.filter((unresolved) => isPackageImportSpecifier(unresolved.specifier))
|
|
144
|
+
.map((unresolved) => unresolved.specifier),
|
|
145
|
+
rawCode: analysis.rawCode,
|
|
146
|
+
resolvedPath,
|
|
147
|
+
sourceMap,
|
|
148
|
+
stableUrlPathname,
|
|
149
|
+
trackedFiles,
|
|
150
|
+
unresolvedImports: analysis.unresolvedImports,
|
|
151
|
+
},
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
catch (error) {
|
|
155
|
+
return {
|
|
156
|
+
ok: false,
|
|
157
|
+
error: toTransformFailedError(error, resolvedPath),
|
|
158
|
+
tracking: {
|
|
159
|
+
trackedFiles,
|
|
160
|
+
},
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
function findNearestTsconfigPath(directory) {
|
|
165
|
+
let currentDirectory = directory;
|
|
166
|
+
while (true) {
|
|
167
|
+
let tsconfigPath = path.join(currentDirectory, 'tsconfig.json');
|
|
168
|
+
if (fs.existsSync(tsconfigPath)) {
|
|
169
|
+
return normalizeFilePath(tsconfigPath);
|
|
170
|
+
}
|
|
171
|
+
let parentDirectory = path.dirname(currentDirectory);
|
|
172
|
+
if (parentDirectory === currentDirectory)
|
|
173
|
+
return null;
|
|
174
|
+
currentDirectory = parentDirectory;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
function isPackageImportSpecifier(specifier) {
|
|
178
|
+
return !specifier.startsWith('./') && !specifier.startsWith('../') && !specifier.startsWith('/');
|
|
179
|
+
}
|
|
180
|
+
async function analyzeModuleSource(sourceText, resolvedPath, transformOptions, options) {
|
|
181
|
+
let transformResult;
|
|
182
|
+
try {
|
|
183
|
+
transformResult = await oxcTransform(resolvedPath, sourceText, getTransformOptions(resolvedPath, transformOptions, options));
|
|
184
|
+
assertNoCompilerErrors(transformResult.errors, resolvedPath, 'transform');
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
if (isAssetServerCompilationError(error))
|
|
188
|
+
throw error;
|
|
189
|
+
throw createAssetServerCompilationError(`Failed to transform script ${resolvedPath}. ${formatUnknownError(error)}`, {
|
|
190
|
+
cause: error,
|
|
191
|
+
code: 'TRANSFORM_FAILED',
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
let rawCode = transformResult.code.trimEnd();
|
|
195
|
+
let sourceMap = stringifySourceMap(transformResult.map);
|
|
196
|
+
if (options.minify) {
|
|
197
|
+
let minifyResult = await minifyModule(rawCode, resolvedPath, options.target, options.sourceMaps);
|
|
198
|
+
rawCode = minifyResult.code.trimEnd();
|
|
199
|
+
let minifyMap = stringifySourceMap(minifyResult.map);
|
|
200
|
+
sourceMap =
|
|
201
|
+
minifyMap == null
|
|
202
|
+
? sourceMap
|
|
203
|
+
: sourceMap == null
|
|
204
|
+
? minifyMap
|
|
205
|
+
: composeSourceMaps(minifyMap, sourceMap);
|
|
206
|
+
}
|
|
207
|
+
return {
|
|
208
|
+
rawCode,
|
|
209
|
+
sourceMap,
|
|
210
|
+
unresolvedImports: await getUnresolvedImportsFromLexer(rawCode),
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
async function minifyModule(rawCode, resolvedPath, target, sourceMaps) {
|
|
214
|
+
try {
|
|
215
|
+
let result = await minify(resolvedPath, rawCode, {
|
|
216
|
+
compress: target ? { target } : true,
|
|
217
|
+
mangle: true,
|
|
218
|
+
module: true,
|
|
219
|
+
sourcemap: sourceMaps != null,
|
|
220
|
+
});
|
|
221
|
+
assertNoCompilerErrors(result.errors, resolvedPath, 'minify');
|
|
222
|
+
return result;
|
|
223
|
+
}
|
|
224
|
+
catch (error) {
|
|
225
|
+
if (isAssetServerCompilationError(error))
|
|
226
|
+
throw error;
|
|
227
|
+
throw createAssetServerCompilationError(`Failed to minify script ${resolvedPath}. ${formatUnknownError(error)}`, {
|
|
228
|
+
cause: error,
|
|
229
|
+
code: 'TRANSFORM_FAILED',
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
function getTransformOptions(resolvedPath, transformOptions, options) {
|
|
234
|
+
let compilerOptions = transformOptions.tsconfigRaw?.compilerOptions;
|
|
235
|
+
let useDefineForClassFields = getBooleanOption(compilerOptions, supportedTsconfigTransformCompilerOptions.useDefineForClassFields);
|
|
236
|
+
let jsxFactory = getStringOption(compilerOptions, supportedTsconfigTransformCompilerOptions.jsxFactory);
|
|
237
|
+
let jsxFragmentFactory = getStringOption(compilerOptions, supportedTsconfigTransformCompilerOptions.jsxFragmentFactory);
|
|
238
|
+
return {
|
|
239
|
+
assumptions: useDefineForClassFields === false
|
|
240
|
+
? {
|
|
241
|
+
setPublicClassFields: true,
|
|
242
|
+
}
|
|
243
|
+
: undefined,
|
|
244
|
+
decorator: getDecoratorOptions(compilerOptions),
|
|
245
|
+
define: options.define,
|
|
246
|
+
jsx: getJsxOptions(resolvedPath, compilerOptions),
|
|
247
|
+
lang: getSourceLanguageForPath(resolvedPath),
|
|
248
|
+
sourceType: 'module',
|
|
249
|
+
sourcemap: options.sourceMaps != null,
|
|
250
|
+
target: options.target,
|
|
251
|
+
typescript: {
|
|
252
|
+
allowNamespaces: getBooleanOption(compilerOptions, supportedTsconfigTransformCompilerOptions.allowNamespaces),
|
|
253
|
+
jsxPragma: jsxFactory,
|
|
254
|
+
jsxPragmaFrag: jsxFragmentFactory,
|
|
255
|
+
removeClassFieldsWithoutInitializer: useDefineForClassFields === false ? true : undefined,
|
|
256
|
+
},
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
function getJsxOptions(resolvedPath, compilerOptions) {
|
|
260
|
+
let language = getSourceLanguageForPath(resolvedPath);
|
|
261
|
+
if (language !== 'jsx' && language !== 'tsx')
|
|
262
|
+
return undefined;
|
|
263
|
+
let jsx = getStringOption(compilerOptions, supportedTsconfigTransformCompilerOptions.jsx);
|
|
264
|
+
let importSource = getStringOption(compilerOptions, supportedTsconfigTransformCompilerOptions.jsxImportSource);
|
|
265
|
+
let pragma = getStringOption(compilerOptions, supportedTsconfigTransformCompilerOptions.jsxFactory);
|
|
266
|
+
let pragmaFrag = getStringOption(compilerOptions, supportedTsconfigTransformCompilerOptions.jsxFragmentFactory);
|
|
267
|
+
if (jsx === 'preserve' || jsx === 'react-native') {
|
|
268
|
+
throw createAssetServerCompilationError(`Unsupported tsconfig compilerOptions.jsx = "${jsx}" for ${resolvedPath}. ` +
|
|
269
|
+
`Asset server must compile JSX to browser-runnable JavaScript.`, {
|
|
270
|
+
code: 'TRANSFORM_FAILED',
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
if (jsx === 'react-jsx' || jsx === 'react-jsxdev') {
|
|
274
|
+
return {
|
|
275
|
+
development: jsx === 'react-jsxdev',
|
|
276
|
+
importSource,
|
|
277
|
+
runtime: 'automatic',
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
return {
|
|
281
|
+
pragma,
|
|
282
|
+
pragmaFrag,
|
|
283
|
+
runtime: 'classic',
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
function getDecoratorOptions(compilerOptions) {
|
|
287
|
+
let legacy = getBooleanOption(compilerOptions, supportedTsconfigTransformCompilerOptions.experimentalDecorators);
|
|
288
|
+
let emitDecoratorMetadata = getBooleanOption(compilerOptions, supportedTsconfigTransformCompilerOptions.emitDecoratorMetadata);
|
|
289
|
+
if (legacy !== true && emitDecoratorMetadata !== true)
|
|
290
|
+
return undefined;
|
|
291
|
+
return {
|
|
292
|
+
emitDecoratorMetadata,
|
|
293
|
+
legacy,
|
|
294
|
+
};
|
|
295
|
+
}
|
|
296
|
+
function getBooleanOption(compilerOptions, key) {
|
|
297
|
+
let value = compilerOptions?.[key];
|
|
298
|
+
return typeof value === 'boolean' ? value : undefined;
|
|
299
|
+
}
|
|
300
|
+
function getStringOption(compilerOptions, key) {
|
|
301
|
+
let value = compilerOptions?.[key];
|
|
302
|
+
return typeof value === 'string' ? value : undefined;
|
|
303
|
+
}
|
|
304
|
+
function assertNoCompilerErrors(errors, resolvedPath, operation) {
|
|
305
|
+
if (!errors || errors.length === 0)
|
|
306
|
+
return;
|
|
307
|
+
throw createAssetServerCompilationError(`Failed to ${operation} script ${resolvedPath}. ${errors[0].message ?? 'Unknown error'}`, {
|
|
308
|
+
code: 'TRANSFORM_FAILED',
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
async function getUnresolvedImportsFromLexer(rawCode) {
|
|
312
|
+
await esModuleLexerInit;
|
|
313
|
+
let [imports] = esModuleLexer(rawCode);
|
|
314
|
+
let unresolvedImports = [];
|
|
315
|
+
for (let imported of imports) {
|
|
316
|
+
let specifier = getStaticImportSpecifier(rawCode, imported);
|
|
317
|
+
if (specifier == null || shouldSkipImportSpecifier(specifier))
|
|
318
|
+
continue;
|
|
319
|
+
unresolvedImports.push({
|
|
320
|
+
specifier,
|
|
321
|
+
start: imported.s,
|
|
322
|
+
end: imported.e,
|
|
323
|
+
quote: getImportQuote(rawCode, imported.s),
|
|
324
|
+
});
|
|
325
|
+
}
|
|
326
|
+
return unresolvedImports;
|
|
327
|
+
}
|
|
328
|
+
function getStaticImportSpecifier(source, imported) {
|
|
329
|
+
if (imported.n != null) {
|
|
330
|
+
return imported.n;
|
|
331
|
+
}
|
|
332
|
+
if (imported.d < 0) {
|
|
333
|
+
return null;
|
|
334
|
+
}
|
|
335
|
+
let rawSpecifier = source.slice(imported.s, imported.e);
|
|
336
|
+
if (!isStaticTemplateLiteral(rawSpecifier)) {
|
|
337
|
+
return null;
|
|
338
|
+
}
|
|
339
|
+
return rawSpecifier.slice(1, -1);
|
|
340
|
+
}
|
|
341
|
+
function isStaticTemplateLiteral(specifier) {
|
|
342
|
+
return specifier.startsWith('`') && specifier.endsWith('`') && !specifier.includes('${');
|
|
343
|
+
}
|
|
344
|
+
function shouldSkipImportSpecifier(specifier) {
|
|
345
|
+
return (specifier.startsWith('data:') ||
|
|
346
|
+
specifier.startsWith('http://') ||
|
|
347
|
+
specifier.startsWith('https://'));
|
|
348
|
+
}
|
|
349
|
+
function getImportQuote(source, start) {
|
|
350
|
+
let firstCharacter = source[start];
|
|
351
|
+
if (firstCharacter === '"' || firstCharacter === "'" || firstCharacter === '`') {
|
|
352
|
+
return firstCharacter;
|
|
353
|
+
}
|
|
354
|
+
return undefined;
|
|
355
|
+
}
|
|
356
|
+
function getSourceLanguageForPath(resolvedPath) {
|
|
357
|
+
let extension = path.extname(resolvedPath).toLowerCase();
|
|
358
|
+
return sourceLanguageByExtension.get(extension) ?? 'js';
|
|
359
|
+
}
|
|
360
|
+
function formatUnknownError(error) {
|
|
361
|
+
return error instanceof Error ? error.message : String(error);
|
|
362
|
+
}
|
|
363
|
+
function toTransformFailedError(error, resolvedPath) {
|
|
364
|
+
if (isAssetServerCompilationError(error))
|
|
365
|
+
return error;
|
|
366
|
+
return createAssetServerCompilationError(`Failed to transform script ${resolvedPath}. ${formatUnknownError(error)}`, {
|
|
367
|
+
cause: error,
|
|
368
|
+
code: 'TRANSFORM_FAILED',
|
|
369
|
+
});
|
|
370
|
+
}
|
|
371
|
+
function isNoEntityError(error) {
|
|
372
|
+
return (error instanceof Error && 'code' in error && error.code === 'ENOENT');
|
|
373
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function composeSourceMaps(rewriteSourceMap: string, transformSourceMap: string): string;
|
|
2
|
+
export declare function rewriteSourceMapSources(sourceMap: string, resolvedPath: string, stableUrlPathname: string, sourceMapSourcePaths: 'absolute' | 'url', sourceContent?: string): string;
|
|
3
|
+
export declare function stringifySourceMap(map: unknown): string | null;
|
|
4
|
+
//# sourceMappingURL=source-maps.d.ts.map
|