UNPKG

8.3 kBJavaScriptView Raw
1"use strict";
2var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3 if (k2 === undefined) k2 = k;
4 Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
5}) : (function(o, m, k, k2) {
6 if (k2 === undefined) k2 = k;
7 o[k2] = m[k];
8}));
9var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
10 Object.defineProperty(o, "default", { enumerable: true, value: v });
11}) : function(o, v) {
12 o["default"] = v;
13});
14var __importStar = (this && this.__importStar) || function (mod) {
15 if (mod && mod.__esModule) return mod;
16 var result = {};
17 if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
18 __setModuleDefault(result, mod);
19 return result;
20};
21var __importDefault = (this && this.__importDefault) || function (mod) {
22 return (mod && mod.__esModule) ? mod : { "default": mod };
23};
24Object.defineProperty(exports, "__esModule", { value: true });
25const fs_1 = require("fs");
26const colors = __importStar(require("kleur/colors"));
27const path_1 = __importDefault(require("path"));
28const rimraf_1 = __importDefault(require("rimraf"));
29const skypack_1 = require("skypack");
30const util_1 = __importDefault(require("util"));
31const logger_1 = require("../logger");
32const util_2 = require("../util");
33const fetchedPackages = new Set();
34function logFetching(origin, packageName, packageSemver) {
35 if (fetchedPackages.has(packageName)) {
36 return;
37 }
38 fetchedPackages.add(packageName);
39 logger_1.logger.info(`import ${colors.bold(packageName + (packageSemver ? `@${packageSemver}` : ''))} ${colors.dim(`→ ${origin}/${packageName}`)}`);
40 if (!packageSemver) {
41 logger_1.logger.info(colors.yellow(`pin project to this version: \`snowpack add ${packageName}\``));
42 }
43}
44function parseRawPackageImport(spec) {
45 const impParts = spec.split('/');
46 if (spec.startsWith('@')) {
47 const [scope, name, ...rest] = impParts;
48 return [`${scope}/${name}`, rest.join('/') || null];
49 }
50 const [name, ...rest] = impParts;
51 return [name, rest.join('/') || null];
52}
53/**
54 * Remote Package Source: A generic interface through which
55 * Snowpack interacts with the Skypack CDN. Used to load dependencies
56 * from the CDN during both development and optimized building.
57 */
58exports.default = {
59 async prepare(commandOptions) {
60 var _a;
61 const { config, lockfile } = commandOptions;
62 // Only install types if `packageOptions.types=true`. Otherwise, no need to prepare anything.
63 if (config.packageOptions.source === 'remote' && !config.packageOptions.types) {
64 return { imports: {} };
65 }
66 const lockEntryList = lockfile && Object.keys(lockfile.lock);
67 if (!lockfile || !lockEntryList || lockEntryList.length === 0) {
68 return { imports: {} };
69 }
70 logger_1.logger.info('checking for new TypeScript types...', { name: 'packageOptions.types' });
71 await rimraf_1.default.sync(path_1.default.join(this.getCacheFolder(config), '.snowpack/types'));
72 for (const lockEntry of lockEntryList) {
73 const [packageName, semverRange] = lockEntry.split('#');
74 const exactVersion = (_a = lockfile.lock[lockEntry]) === null || _a === void 0 ? void 0 : _a.substr(packageName.length + 1);
75 await util_2.remotePackageSDK
76 .installTypes(packageName, exactVersion || semverRange, path_1.default.join(this.getCacheFolder(config), 'types'))
77 .catch((err) => logger_1.logger.debug('dts fetch error: ' + err.message));
78 }
79 // Skypack resolves imports on the fly, so no import map needed.
80 logger_1.logger.info(`types updated. ${colors.dim('→ ./.snowpack/types')}`, {
81 name: 'packageOptions.types',
82 });
83 return { imports: {} };
84 },
85 modifyBuildInstallOptions({ installOptions, config, lockfile }) {
86 installOptions.importMap = lockfile
87 ? util_2.convertLockfileToSkypackImportMap(config.packageOptions.origin, lockfile)
88 : undefined;
89 installOptions.rollup = installOptions.rollup || {};
90 installOptions.rollup.plugins = installOptions.rollup.plugins || [];
91 installOptions.rollup.plugins.push(skypack_1.rollupPluginSkypack({
92 sdk: util_2.remotePackageSDK,
93 logger: {
94 debug: (...args) => logger_1.logger.debug(util_1.default.format(...args)),
95 log: (...args) => logger_1.logger.info(util_1.default.format(...args)),
96 warn: (...args) => logger_1.logger.warn(util_1.default.format(...args)),
97 error: (...args) => logger_1.logger.error(util_1.default.format(...args)),
98 },
99 }));
100 // config.installOptions.lockfile = lockfile || undefined;
101 return installOptions;
102 },
103 async load(spec, { config, lockfile }) {
104 let body;
105 if (spec.startsWith('-/') ||
106 spec.startsWith('pin/') ||
107 spec.startsWith('new/') ||
108 spec.startsWith('error/')) {
109 body = (await util_2.remotePackageSDK.fetch(`/${spec}`)).body;
110 }
111 else {
112 const [packageName, packagePath] = parseRawPackageImport(spec);
113 if (lockfile && lockfile.dependencies[packageName]) {
114 const lockEntry = packageName + '#' + lockfile.dependencies[packageName];
115 if (packagePath) {
116 body = (await util_2.remotePackageSDK.fetch('/' + lockfile.lock[lockEntry] + '/' + packagePath))
117 .body;
118 }
119 else {
120 body = (await util_2.remotePackageSDK.fetch('/' + lockfile.lock[lockEntry])).body;
121 }
122 }
123 else {
124 const packageSemver = 'latest';
125 logFetching(config.packageOptions.origin, packageName, packageSemver);
126 let lookupResponse = await util_2.remotePackageSDK.lookupBySpecifier(spec, packageSemver);
127 if (!lookupResponse.error && lookupResponse.importStatus === 'NEW') {
128 const buildResponse = await util_2.remotePackageSDK.buildNewPackage(spec, packageSemver);
129 if (!buildResponse.success) {
130 throw new Error('Package could not be built!');
131 }
132 lookupResponse = await util_2.remotePackageSDK.lookupBySpecifier(spec, packageSemver);
133 }
134 if (lookupResponse.error) {
135 throw lookupResponse.error;
136 }
137 // Trigger a type fetch asynchronously. We want to resolve the JS as fast as possible, and
138 // the result of this is totally disconnected from the loading flow.
139 if (!fs_1.existsSync(path_1.default.join(this.getCacheFolder(config), '.snowpack/types', packageName))) {
140 util_2.remotePackageSDK
141 .installTypes(packageName, packageSemver, path_1.default.join(this.getCacheFolder(config), '.snowpack/types'))
142 .catch(() => 'thats fine!');
143 }
144 body = lookupResponse.body;
145 }
146 }
147 const ext = path_1.default.extname(spec);
148 if (!ext || util_2.isJavaScript(spec)) {
149 return body
150 .toString()
151 .replace(/(from|import) \'\//g, `$1 '${config.buildOptions.metaUrlPath}/pkg/`)
152 .replace(/(from|import) \"\//g, `$1 "${config.buildOptions.metaUrlPath}/pkg/`);
153 }
154 return body;
155 },
156 resolvePackageImport(missingPackage, _, config) {
157 return path_1.default.posix.join(config.buildOptions.metaUrlPath, 'pkg', missingPackage);
158 },
159 async recoverMissingPackageImport() {
160 throw new Error('Unexpected Error: No such thing as a "missing" package import with Skypack.');
161 },
162 clearCache() {
163 return skypack_1.clearCache();
164 },
165 getCacheFolder(config) {
166 return ((config.packageOptions.source === 'remote' && config.packageOptions.cache) ||
167 path_1.default.join(config.root, '.snowpack'));
168 },
169};