zapier-platform-cli 16.5.0 → 17.0.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/oclif.manifest.json +151 -131
- package/package.json +23 -23
- package/scaffold/create.template.ts +21 -14
- package/scaffold/search.template.ts +19 -12
- package/scaffold/trigger.template.ts +8 -5
- package/src/generators/index.js +77 -6
- package/src/generators/templates/index-esm.template.js +36 -0
- package/src/generators/templates/index-esm.template.ts +24 -0
- package/src/generators/templates/{typescript/src/index.ts → index.template.ts} +3 -4
- package/src/generators/templates/typescript/src/authentication.ts +1 -1
- package/src/generators/templates/typescript/src/creates/movie.ts +17 -10
- package/src/generators/templates/typescript/src/test/creates.test.ts +1 -1
- package/src/generators/templates/typescript/src/triggers/movie.ts +9 -6
- package/src/oclif/commands/build.js +1 -1
- package/src/oclif/commands/init.js +9 -2
- package/src/oclif/commands/invoke.js +1 -5
- package/src/oclif/commands/versions.js +16 -23
- package/src/utils/build.js +42 -104
- package/src/utils/local.js +108 -43
- package/src/utils/zapierwrapper.js +55 -0
- package/src/generators/templates/typescript/index.js +0 -1
package/src/utils/build.js
CHANGED
|
@@ -2,10 +2,9 @@ const crypto = require('crypto');
|
|
|
2
2
|
const os = require('os');
|
|
3
3
|
const path = require('path');
|
|
4
4
|
|
|
5
|
-
const browserify = require('browserify');
|
|
6
|
-
const through = require('through2');
|
|
7
5
|
const _ = require('lodash');
|
|
8
6
|
const archiver = require('archiver');
|
|
7
|
+
const esbuild = require('esbuild');
|
|
9
8
|
const fs = require('fs');
|
|
10
9
|
const fse = require('fs-extra');
|
|
11
10
|
const klaw = require('klaw');
|
|
@@ -20,13 +19,7 @@ const {
|
|
|
20
19
|
|
|
21
20
|
const constants = require('../constants');
|
|
22
21
|
|
|
23
|
-
const {
|
|
24
|
-
writeFile,
|
|
25
|
-
readFile,
|
|
26
|
-
copyDir,
|
|
27
|
-
ensureDir,
|
|
28
|
-
removeDir,
|
|
29
|
-
} = require('./files');
|
|
22
|
+
const { writeFile, copyDir, ensureDir, removeDir } = require('./files');
|
|
30
23
|
|
|
31
24
|
const {
|
|
32
25
|
prettyJSONstringify,
|
|
@@ -42,67 +35,39 @@ const {
|
|
|
42
35
|
validateApp,
|
|
43
36
|
} = require('./api');
|
|
44
37
|
|
|
38
|
+
const { copyZapierWrapper } = require('./zapierwrapper');
|
|
39
|
+
|
|
45
40
|
const checkMissingAppInfo = require('./check-missing-app-info');
|
|
46
41
|
|
|
47
42
|
const { runCommand, isWindows, findCorePackageDir } = require('./misc');
|
|
48
43
|
const { respectGitIgnore } = require('./ignore');
|
|
44
|
+
const { localAppCommand } = require('./local');
|
|
49
45
|
|
|
50
46
|
const debug = require('debug')('zapier:build');
|
|
51
47
|
|
|
52
48
|
const stripPath = (cwd, filePath) => filePath.split(cwd).pop();
|
|
53
49
|
|
|
54
50
|
// given entry points in a directory, return a list of files that uses
|
|
55
|
-
|
|
56
|
-
// TODO: needs to include package.json files too i think
|
|
57
|
-
// https://github.com/serverless/serverless-optimizer-plugin?
|
|
58
|
-
const requiredFiles = (cwd, entryPoints) => {
|
|
51
|
+
const requiredFiles = async ({ cwd, entryPoints }) => {
|
|
59
52
|
if (!_.endsWith(cwd, path.sep)) {
|
|
60
53
|
cwd += path.sep;
|
|
61
54
|
}
|
|
62
55
|
|
|
63
|
-
const
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
browserField: false,
|
|
74
|
-
detectGlobals: true,
|
|
75
|
-
insertGlobals: false,
|
|
76
|
-
insertGlobalVars: {
|
|
77
|
-
process: undefined,
|
|
78
|
-
global: undefined,
|
|
79
|
-
'Buffer.isBuffer': undefined,
|
|
80
|
-
Buffer: undefined,
|
|
81
|
-
},
|
|
82
|
-
ignoreMissing: true,
|
|
83
|
-
debug: false,
|
|
84
|
-
standalone: undefined,
|
|
85
|
-
};
|
|
86
|
-
const b = browserify(argv);
|
|
87
|
-
|
|
88
|
-
return new Promise((resolve, reject) => {
|
|
89
|
-
b.on('error', reject);
|
|
90
|
-
|
|
91
|
-
const paths = [];
|
|
92
|
-
b.pipeline.get('deps').push(
|
|
93
|
-
through
|
|
94
|
-
.obj((row, enc, next) => {
|
|
95
|
-
const filePath = row.file || row.id;
|
|
96
|
-
paths.push(stripPath(cwd, filePath));
|
|
97
|
-
next();
|
|
98
|
-
})
|
|
99
|
-
.on('end', () => {
|
|
100
|
-
paths.sort();
|
|
101
|
-
resolve(paths);
|
|
102
|
-
}),
|
|
103
|
-
);
|
|
104
|
-
b.bundle();
|
|
56
|
+
const result = await esbuild.build({
|
|
57
|
+
entryPoints,
|
|
58
|
+
outdir: './build',
|
|
59
|
+
bundle: true,
|
|
60
|
+
platform: 'node',
|
|
61
|
+
metafile: true,
|
|
62
|
+
logLevel: 'warning',
|
|
63
|
+
external: ['../test/userapp'],
|
|
64
|
+
format: 'esm',
|
|
65
|
+
write: false, // no need to write outfile
|
|
105
66
|
});
|
|
67
|
+
|
|
68
|
+
return Object.keys(result.metafile.inputs).map((path) =>
|
|
69
|
+
stripPath(cwd, path),
|
|
70
|
+
);
|
|
106
71
|
};
|
|
107
72
|
|
|
108
73
|
const listFiles = (dir) => {
|
|
@@ -194,16 +159,21 @@ const writeZipFromPaths = (dir, zipPath, paths) => {
|
|
|
194
159
|
};
|
|
195
160
|
|
|
196
161
|
const makeZip = async (dir, zipPath, disableDependencyDetection) => {
|
|
197
|
-
const entryPoints = [
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
162
|
+
const entryPoints = [path.resolve(dir, 'zapierwrapper.js')];
|
|
163
|
+
|
|
164
|
+
const indexPath = path.resolve(dir, 'index.js');
|
|
165
|
+
if (fs.existsSync(indexPath)) {
|
|
166
|
+
// Necessary for CommonJS integrations. The zapierwrapper they use require()
|
|
167
|
+
// the index.js file using a variable. esbuild can't detect it, so we need
|
|
168
|
+
// to add it here specifically.
|
|
169
|
+
entryPoints.push(indexPath);
|
|
170
|
+
}
|
|
201
171
|
|
|
202
172
|
let paths;
|
|
203
173
|
|
|
204
174
|
const [dumbPaths, smartPaths, appConfig] = await Promise.all([
|
|
205
175
|
listFiles(dir),
|
|
206
|
-
requiredFiles(dir, entryPoints),
|
|
176
|
+
requiredFiles({ cwd: dir, entryPoints }),
|
|
207
177
|
getLinkedAppConfig(dir).catch(() => ({})),
|
|
208
178
|
]);
|
|
209
179
|
|
|
@@ -234,24 +204,6 @@ const makeSourceZip = async (dir, zipPath) => {
|
|
|
234
204
|
await writeZipFromPaths(dir, zipPath, finalPaths);
|
|
235
205
|
};
|
|
236
206
|
|
|
237
|
-
// Similar to utils.appCommand, but given a ready to go app
|
|
238
|
-
// with a different location and ready to go zapierwrapper.js.
|
|
239
|
-
const _appCommandZapierWrapper = (dir, event) => {
|
|
240
|
-
const app = require(`${dir}/zapierwrapper.js`);
|
|
241
|
-
event = Object.assign({}, event, {
|
|
242
|
-
calledFromCli: true,
|
|
243
|
-
});
|
|
244
|
-
return new Promise((resolve, reject) => {
|
|
245
|
-
app.handler(event, {}, (err, resp) => {
|
|
246
|
-
if (err) {
|
|
247
|
-
reject(err);
|
|
248
|
-
} else {
|
|
249
|
-
resolve(resp);
|
|
250
|
-
}
|
|
251
|
-
});
|
|
252
|
-
});
|
|
253
|
-
};
|
|
254
|
-
|
|
255
207
|
const maybeNotifyAboutOutdated = () => {
|
|
256
208
|
// find a package.json for the app and notify on the core dep
|
|
257
209
|
// `build` won't run if package.json isn't there, so if we get to here we're good
|
|
@@ -417,35 +369,21 @@ const _buildFunc = async ({
|
|
|
417
369
|
|
|
418
370
|
if (printProgress) {
|
|
419
371
|
endSpinner();
|
|
420
|
-
startSpinner('Applying entry point
|
|
372
|
+
startSpinner('Applying entry point files');
|
|
421
373
|
}
|
|
422
374
|
|
|
423
|
-
|
|
424
|
-
const zapierWrapperBuf = await readFile(
|
|
425
|
-
path.join(
|
|
426
|
-
tmpDir,
|
|
427
|
-
'node_modules',
|
|
428
|
-
constants.PLATFORM_PACKAGE,
|
|
429
|
-
'include',
|
|
430
|
-
'zapierwrapper.js',
|
|
431
|
-
),
|
|
432
|
-
);
|
|
433
|
-
await writeFile(
|
|
434
|
-
path.join(tmpDir, 'zapierwrapper.js'),
|
|
435
|
-
zapierWrapperBuf.toString(),
|
|
436
|
-
);
|
|
375
|
+
await copyZapierWrapper(corePath, tmpDir);
|
|
437
376
|
|
|
438
377
|
if (printProgress) {
|
|
439
378
|
endSpinner();
|
|
440
379
|
startSpinner('Building app definition.json');
|
|
441
380
|
}
|
|
442
381
|
|
|
443
|
-
const rawDefinition = (
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
)
|
|
448
|
-
|
|
382
|
+
const rawDefinition = await localAppCommand(
|
|
383
|
+
{ command: 'definition' },
|
|
384
|
+
tmpDir,
|
|
385
|
+
false,
|
|
386
|
+
);
|
|
449
387
|
const fileWriteError = await writeFile(
|
|
450
388
|
path.join(tmpDir, 'definition.json'),
|
|
451
389
|
prettyJSONstringify(rawDefinition),
|
|
@@ -472,11 +410,11 @@ const _buildFunc = async ({
|
|
|
472
410
|
if (printProgress) {
|
|
473
411
|
startSpinner('Validating project schema and style');
|
|
474
412
|
}
|
|
475
|
-
const
|
|
476
|
-
command: 'validate',
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
413
|
+
const validationErrors = await localAppCommand(
|
|
414
|
+
{ command: 'validate' },
|
|
415
|
+
tmpDir,
|
|
416
|
+
false,
|
|
417
|
+
);
|
|
480
418
|
if (validationErrors.length) {
|
|
481
419
|
debug('\nErrors:\n', validationErrors, '\n');
|
|
482
420
|
throw new Error(
|
package/src/utils/local.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
const
|
|
2
|
-
const path = require('path');
|
|
1
|
+
const path = require('node:path');
|
|
3
2
|
|
|
4
|
-
const { findCorePackageDir } = require('./misc');
|
|
5
3
|
const { BASE_ENDPOINT } = require('../constants');
|
|
4
|
+
const { findCorePackageDir, runCommand } = require('./misc');
|
|
5
|
+
const { copyZapierWrapper, deleteZapierWrapper } = require('./zapierwrapper');
|
|
6
6
|
|
|
7
7
|
/**
|
|
8
8
|
* Wraps Node's http.request() / https.request() so that all requests go via a relay URL.
|
|
@@ -218,34 +218,75 @@ function wrapFetchWithRelay(fetchFunc, relayUrl, relayHeaders) {
|
|
|
218
218
|
};
|
|
219
219
|
}
|
|
220
220
|
|
|
221
|
-
const
|
|
222
|
-
|
|
223
|
-
|
|
221
|
+
const loadAppRawUsingImport = async (
|
|
222
|
+
appDir,
|
|
223
|
+
corePackageDir,
|
|
224
|
+
shouldDeleteWrapper,
|
|
225
|
+
) => {
|
|
226
|
+
const wrapperPath = await copyZapierWrapper(corePackageDir, appDir);
|
|
227
|
+
let appRaw;
|
|
228
|
+
try {
|
|
229
|
+
// zapierwrapper.mjs is only available since zapier-platform-core v17.
|
|
230
|
+
// And only zapierwrapper.mjs exposes appRaw just for this use case.
|
|
231
|
+
appRaw = (await import(wrapperPath)).appRaw;
|
|
232
|
+
} catch (err) {
|
|
233
|
+
if (err.name === 'SyntaxError') {
|
|
234
|
+
// Run a separate process to print the line number of the SyntaxError.
|
|
235
|
+
// This workaround is needed because `err` doesn't provide the location
|
|
236
|
+
// info about the SyntaxError. However, if the error is thrown to
|
|
237
|
+
// Node.js's built-in error handler, it will print the location info.
|
|
238
|
+
// See: https://github.com/nodejs/node/issues/49441
|
|
239
|
+
await runCommand(process.execPath, ['zapierwrapper.js'], {
|
|
240
|
+
cwd: appDir,
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
throw err;
|
|
244
|
+
} finally {
|
|
245
|
+
if (shouldDeleteWrapper) {
|
|
246
|
+
await deleteZapierWrapper(appDir);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
return appRaw;
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
const loadAppRawUsingRequire = (appDir) => {
|
|
254
|
+
let appRaw = require(appDir);
|
|
255
|
+
if (appRaw && appRaw.default) {
|
|
256
|
+
// Node.js 22+ supports using require() to import ESM.
|
|
257
|
+
// For Node.js < 20.17.0, require() will throw an error on ESM.
|
|
258
|
+
// https://nodejs.org/api/modules.html#loading-ecmascript-modules-using-require
|
|
259
|
+
appRaw = appRaw.default;
|
|
260
|
+
}
|
|
261
|
+
return appRaw;
|
|
262
|
+
};
|
|
263
|
+
|
|
264
|
+
const getLocalAppHandler = async ({
|
|
265
|
+
appDir = null,
|
|
224
266
|
appId = null,
|
|
225
267
|
deployKey = null,
|
|
226
268
|
relayAuthenticationId = null,
|
|
227
269
|
beforeRequest = null,
|
|
228
270
|
afterResponse = null,
|
|
271
|
+
shouldDeleteWrapper = true,
|
|
229
272
|
} = {}) => {
|
|
230
|
-
|
|
231
|
-
const rootPath = path.dirname(require.resolve(entryPath));
|
|
232
|
-
const corePackageDir = findCorePackageDir();
|
|
273
|
+
appDir = path.resolve(appDir || process.cwd());
|
|
233
274
|
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
if (cachePath.startsWith(rootPath)) {
|
|
237
|
-
delete require.cache[cachePath];
|
|
238
|
-
}
|
|
239
|
-
});
|
|
240
|
-
}
|
|
241
|
-
let appRaw, zapier;
|
|
275
|
+
const corePackageDir = findCorePackageDir();
|
|
276
|
+
let appRaw;
|
|
242
277
|
try {
|
|
243
|
-
appRaw =
|
|
244
|
-
zapier = require(corePackageDir);
|
|
278
|
+
appRaw = loadAppRawUsingRequire(appDir);
|
|
245
279
|
} catch (err) {
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
280
|
+
if (err.code === 'MODULE_NOT_FOUND' || err.code === 'ERR_REQUIRE_ESM') {
|
|
281
|
+
appRaw = await loadAppRawUsingImport(
|
|
282
|
+
appDir,
|
|
283
|
+
corePackageDir,
|
|
284
|
+
shouldDeleteWrapper,
|
|
285
|
+
);
|
|
286
|
+
} else {
|
|
287
|
+
// err.name === 'SyntaxError' or others
|
|
288
|
+
throw err;
|
|
289
|
+
}
|
|
249
290
|
}
|
|
250
291
|
|
|
251
292
|
if (beforeRequest) {
|
|
@@ -282,41 +323,65 @@ const getLocalAppHandler = ({
|
|
|
282
323
|
global.fetch = wrapFetchWithRelay(global.fetch, relayUrl, relayHeaders);
|
|
283
324
|
}
|
|
284
325
|
|
|
326
|
+
// Assumes the entry point of zapier-platform-core is index.js
|
|
327
|
+
const coreEntryPoint = path.join(corePackageDir, 'index.js');
|
|
328
|
+
const zapier = (await import(coreEntryPoint)).default;
|
|
329
|
+
|
|
285
330
|
const handler = zapier.createAppHandler(appRaw);
|
|
286
|
-
|
|
287
|
-
event
|
|
288
|
-
|
|
289
|
-
event
|
|
290
|
-
|
|
331
|
+
if (handler.length === 3) {
|
|
332
|
+
// < v17: function handler(event, ctx, callback)
|
|
333
|
+
return (event, ctx, callback) => {
|
|
334
|
+
event = {
|
|
335
|
+
...event,
|
|
291
336
|
calledFromCli: true,
|
|
292
|
-
}
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
337
|
+
};
|
|
338
|
+
return handler(event, ctx, callback);
|
|
339
|
+
};
|
|
340
|
+
} else {
|
|
341
|
+
// >= v17: async function handler(event, ctx = {})
|
|
342
|
+
return async (event, ctx = {}) => {
|
|
343
|
+
event = {
|
|
344
|
+
...event,
|
|
345
|
+
calledFromCli: true,
|
|
346
|
+
};
|
|
347
|
+
return await handler(event, ctx);
|
|
348
|
+
};
|
|
349
|
+
}
|
|
297
350
|
};
|
|
298
351
|
|
|
299
352
|
// Runs a local app command (./index.js) like {command: 'validate'};
|
|
300
|
-
const localAppCommand = (event) => {
|
|
301
|
-
const handler = getLocalAppHandler({
|
|
353
|
+
const localAppCommand = async (event, appDir, shouldDeleteWrapper = true) => {
|
|
354
|
+
const handler = await getLocalAppHandler({
|
|
302
355
|
appId: event.appId,
|
|
303
356
|
deployKey: event.deployKey,
|
|
304
357
|
relayAuthenticationId: event.relayAuthenticationId,
|
|
305
358
|
beforeRequest: event.beforeRequest,
|
|
306
359
|
afterResponse: event.afterResponse,
|
|
360
|
+
appDir,
|
|
361
|
+
shouldDeleteWrapper,
|
|
307
362
|
});
|
|
308
|
-
|
|
309
|
-
handler(event,
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
}
|
|
363
|
+
if (handler.length === 3) {
|
|
364
|
+
// < 17: function handler(event, ctx, callback)
|
|
365
|
+
return new Promise((resolve, reject) => {
|
|
366
|
+
event = {
|
|
367
|
+
...event,
|
|
368
|
+
calledFromCli: true,
|
|
369
|
+
};
|
|
370
|
+
handler(event, {}, (err, response) => {
|
|
371
|
+
if (err) {
|
|
372
|
+
reject(err);
|
|
373
|
+
} else {
|
|
374
|
+
resolve(response.results);
|
|
375
|
+
}
|
|
376
|
+
});
|
|
315
377
|
});
|
|
316
|
-
}
|
|
378
|
+
} else {
|
|
379
|
+
// >= 17: async function handler(event, ctx = {})
|
|
380
|
+
const response = await handler(event);
|
|
381
|
+
return response.results;
|
|
382
|
+
}
|
|
317
383
|
};
|
|
318
384
|
|
|
319
385
|
module.exports = {
|
|
320
|
-
getLocalAppHandler,
|
|
321
386
|
localAppCommand,
|
|
322
387
|
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
// Utility functions that helps you copy and delete the Lambda function entry
|
|
2
|
+
// point zapierwrapper.mjs or zapierwrapper.js to the integration directory.
|
|
3
|
+
|
|
4
|
+
const { existsSync } = require('node:fs');
|
|
5
|
+
const { readFile, writeFile, rm } = require('node:fs/promises');
|
|
6
|
+
const { join } = require('node:path');
|
|
7
|
+
|
|
8
|
+
// We have two different versions of zapierwrapper: the .mjs one for ESM and the
|
|
9
|
+
// .js one for CommonJS. To copy the right one, we check the module type in the
|
|
10
|
+
// integration's package.json.
|
|
11
|
+
//
|
|
12
|
+
// For esbuild to perform static analysis, zapierwrapper.mjs can only
|
|
13
|
+
// import('packageName') where the packageName must be a static string literal.
|
|
14
|
+
// It can't import(packageName) where packageName is a variable. So in
|
|
15
|
+
// zapierwrapper.mjs, there's a placeholder {REPLACE_ME_PACKAGE_NAME} that
|
|
16
|
+
// we'll replace with the actual package name.
|
|
17
|
+
const copyZapierWrapper = async (corePackageDir, appDir) => {
|
|
18
|
+
const appPackageJson = require(join(appDir, 'package.json'));
|
|
19
|
+
let wrapperFilename;
|
|
20
|
+
if (appPackageJson.type === 'module') {
|
|
21
|
+
wrapperFilename = 'zapierwrapper.mjs';
|
|
22
|
+
} else {
|
|
23
|
+
wrapperFilename = 'zapierwrapper.js';
|
|
24
|
+
}
|
|
25
|
+
const wrapperPath = join(corePackageDir, 'include', wrapperFilename);
|
|
26
|
+
|
|
27
|
+
if (appPackageJson.type === 'module' && !existsSync(wrapperPath)) {
|
|
28
|
+
throw new Error(
|
|
29
|
+
"Couldn't find zapierwrapper.mjs in zapier-platform-core. Are you trying to run ESM? " +
|
|
30
|
+
'If so, you need to upgrade zapier-platform-core to at least v17.',
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
const wrapperText = (await readFile(wrapperPath, 'utf8')).replace(
|
|
35
|
+
'{REPLACE_ME_PACKAGE_NAME}',
|
|
36
|
+
appPackageJson.name,
|
|
37
|
+
);
|
|
38
|
+
const wrapperDest = join(appDir, 'zapierwrapper.js');
|
|
39
|
+
await writeFile(wrapperDest, wrapperText);
|
|
40
|
+
return wrapperDest;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const deleteZapierWrapper = async (appDir) => {
|
|
44
|
+
const wrapperPath = join(appDir, 'zapierwrapper.js');
|
|
45
|
+
try {
|
|
46
|
+
await rm(wrapperPath);
|
|
47
|
+
} catch (err) {
|
|
48
|
+
// ignore
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
module.exports = {
|
|
53
|
+
copyZapierWrapper,
|
|
54
|
+
deleteZapierWrapper,
|
|
55
|
+
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
module.exports = require('./dist').default;
|