zapier-platform-cli 16.5.1 → 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.
@@ -1,5 +1,4 @@
1
- import type { App } from 'zapier-platform-core';
2
- import { version as platformVersion } from 'zapier-platform-core';
1
+ import { version as platformVersion, defineApp } from 'zapier-platform-core';
3
2
 
4
3
  import packageJson from '../package.json';
5
4
 
@@ -8,7 +7,7 @@ import MovieTrigger from './triggers/movie';
8
7
  import authentication from './authentication';
9
8
  import { addBearerHeader } from './middleware';
10
9
 
11
- export default {
10
+ export default defineApp({
12
11
  version: packageJson.version,
13
12
  platformVersion,
14
13
 
@@ -22,4 +21,4 @@ export default {
22
21
  creates: {
23
22
  [MovieCreate.key]: MovieCreate,
24
23
  },
25
- } satisfies App;
24
+ });
@@ -1,6 +1,6 @@
1
1
  import type { Authentication } from 'zapier-platform-core';
2
2
 
3
- import { API_URL, SCOPES } from './constants';
3
+ import { API_URL, SCOPES } from './constants.js';
4
4
 
5
5
  export default {
6
6
  type: 'oauth2',
@@ -1,7 +1,17 @@
1
- import type { Create, PerformFunction } from 'zapier-platform-core';
2
- import { API_URL } from '../constants';
1
+ import {
2
+ defineInputFields,
3
+ defineCreate,
4
+ type CreatePerform,
5
+ type InferInputData,
6
+ } from 'zapier-platform-core';
7
+ import { API_URL } from '../constants.js';
3
8
 
4
- const perform: PerformFunction = async (z, bundle) => {
9
+ const inputFields = defineInputFields([
10
+ { key: 'title', required: true },
11
+ { key: 'year', type: 'integer' },
12
+ ]);
13
+
14
+ const perform = (async (z, bundle) => {
5
15
  const response = await z.request({
6
16
  method: 'POST',
7
17
  url: `${API_URL}/movies`,
@@ -11,9 +21,9 @@ const perform: PerformFunction = async (z, bundle) => {
11
21
  },
12
22
  });
13
23
  return response.data;
14
- };
24
+ }) satisfies CreatePerform<InferInputData<typeof inputFields>>;
15
25
 
16
- export default {
26
+ export default defineCreate({
17
27
  key: 'movie',
18
28
  noun: 'Movie',
19
29
 
@@ -24,13 +34,10 @@ export default {
24
34
 
25
35
  operation: {
26
36
  perform,
27
- inputFields: [
28
- { key: 'title', required: true },
29
- { key: 'year', type: 'integer' },
30
- ],
37
+ inputFields,
31
38
  sample: {
32
39
  id: '1',
33
40
  title: 'example',
34
41
  },
35
42
  },
36
- } satisfies Create;
43
+ });
@@ -10,7 +10,7 @@ describe('movie', () => {
10
10
  test('create a movie', async () => {
11
11
  const bundle = {
12
12
  inputData: { title: 'hello', year: 2020 },
13
- authData: { access_token: 'a_token' },
13
+ authData: { access_token: 'a_token' },
14
14
  };
15
15
  const result = await appTester(App.creates.movie.operation.perform, bundle);
16
16
  expect(result).toMatchObject({
@@ -1,12 +1,15 @@
1
- import type { PerformFunction, Trigger } from 'zapier-platform-core';
2
- import { API_URL } from '../constants';
1
+ import {
2
+ defineTrigger,
3
+ type PollingTriggerPerform,
4
+ } from 'zapier-platform-core';
5
+ import { API_URL } from '../constants.js';
3
6
 
4
- const perform: PerformFunction = async (z, bundle) => {
7
+ const perform = (async (z, bundle) => {
5
8
  const response = await z.request(`${API_URL}/movies`);
6
9
  return response.data;
7
- };
10
+ }) satisfies PollingTriggerPerform;
8
11
 
9
- export default {
12
+ export default defineTrigger({
10
13
  key: 'movie',
11
14
  noun: 'Movie',
12
15
 
@@ -23,4 +26,4 @@ export default {
23
26
  title: 'example',
24
27
  },
25
28
  },
26
- } satisfies Trigger;
29
+ });
@@ -51,7 +51,7 @@ This command does the following:
51
51
  * Copies all code into the temporary folder
52
52
  * Adds an entry point: \`zapierwrapper.js\`
53
53
  * Generates and validates app definition.
54
- * Detects dependencies via browserify (optional, on by default)
54
+ * Detects dependencies via esbuild (optional, on by default)
55
55
  * Zips up all needed \`.js\` files. If you want to include more files, add a "includeInBuild" property (array with strings of regexp paths) to your \`${CURRENT_APP_FILE}\`.
56
56
  * Moves the zip to \`${BUILD_PATH}\` and \`${SOURCE_PATH}\` and deletes the temp folder
57
57
 
@@ -10,12 +10,12 @@ const { TEMPLATE_CHOICES, ProjectGenerator } = require('../../generators');
10
10
  class InitCommand extends BaseCommand {
11
11
  async perform() {
12
12
  const { path } = this.args;
13
- const { template } = this.flags;
13
+ const { template, module } = this.flags;
14
14
 
15
15
  const env = yeoman.createEnv();
16
16
  env.registerStub(ProjectGenerator, 'zapier:integration');
17
17
 
18
- await env.run('zapier:integration', { path, template });
18
+ await env.run('zapier:integration', { path, template, module });
19
19
 
20
20
  this.log();
21
21
  this.log(`A new integration has been created in directory "${path}".`);
@@ -30,6 +30,12 @@ InitCommand.flags = buildFlags({
30
30
  description: 'The template to start your integration with.',
31
31
  options: TEMPLATE_CHOICES,
32
32
  }),
33
+ module: Flags.string({
34
+ char: 'm',
35
+ description:
36
+ 'Choose module type: CommonJS or ES Modules. Only enabled for Typescript and Minimal templates.',
37
+ options: ['commonjs', 'esm'],
38
+ }),
33
39
  },
34
40
  });
35
41
  InitCommand.args = {
@@ -42,6 +48,7 @@ InitCommand.args = {
42
48
  InitCommand.examples = [
43
49
  'zapier init myapp',
44
50
  'zapier init ./path/myapp --template oauth2',
51
+ 'zapier init ./path/myapp --template minimal --module esm',
45
52
  ];
46
53
  InitCommand.description = `Initialize a new Zapier integration with a project template.
47
54
 
@@ -13,7 +13,7 @@ const { DateTime, IANAZone } = require('luxon');
13
13
 
14
14
  const BaseCommand = require('../ZapierBaseCommand');
15
15
  const { buildFlags } = require('../buildFlags');
16
- const { localAppCommand, getLocalAppHandler } = require('../../utils/local');
16
+ const { localAppCommand } = require('../../utils/local');
17
17
  const { startSpinner, endSpinner } = require('../../utils/display');
18
18
  const {
19
19
  getLinkedAppConfig,
@@ -510,10 +510,6 @@ class InvokeCommand extends BaseCommand {
510
510
  }
511
511
 
512
512
  if (!_.isEmpty(env)) {
513
- // process.env changed, so we need to reload the modules that have loaded
514
- // the old values of process.env
515
- getLocalAppHandler({ reload: true });
516
-
517
513
  // Save envs so the user won't have to re-enter them if the command fails
518
514
  await appendEnv(env);
519
515
  console.warn('CLIENT_ID and CLIENT_SECRET saved to .env file.');
@@ -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
- // could probably be done better with module-deps...
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 argv = {
64
- noParse: [undefined],
65
- extensions: [],
66
- ignoreTransform: [],
67
- entries: entryPoints,
68
- fullPaths: false,
69
- builtins: false,
70
- commondir: false,
71
- bundleExternal: true,
72
- basedir: cwd,
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
- path.resolve(dir, 'zapierwrapper.js'),
199
- path.resolve(dir, 'index.js'),
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 file');
372
+ startSpinner('Applying entry point files');
421
373
  }
422
374
 
423
- // TODO: should this routine for include exist elsewhere?
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
- await _appCommandZapierWrapper(tmpDir, {
445
- command: 'definition',
446
- })
447
- ).results;
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 validateResponse = await _appCommandZapierWrapper(tmpDir, {
476
- command: 'validate',
477
- });
478
-
479
- const validationErrors = validateResponse.results;
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(
@@ -1,8 +1,8 @@
1
- const _ = require('lodash');
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 getLocalAppHandler = ({
222
- reload = false,
223
- baseEvent = {},
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
- const entryPath = `${process.cwd()}/index`;
231
- const rootPath = path.dirname(require.resolve(entryPath));
232
- const corePackageDir = findCorePackageDir();
273
+ appDir = path.resolve(appDir || process.cwd());
233
274
 
234
- if (reload) {
235
- Object.keys(require.cache).forEach((cachePath) => {
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 = require(entryPath);
244
- zapier = require(corePackageDir);
278
+ appRaw = loadAppRawUsingRequire(appDir);
245
279
  } catch (err) {
246
- // this err.stack doesn't give a nice traceback at all :-(
247
- // maybe we could do require('syntax-error') in the future
248
- return (event, ctx, callback) => callback(err);
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
- return (event, ctx, callback) => {
287
- event = _.merge(
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
- baseEvent,
294
- );
295
- handler(event, _, callback);
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
- return new Promise((resolve, reject) => {
309
- handler(event, {}, (err, resp) => {
310
- if (err) {
311
- reject(err);
312
- } else {
313
- resolve(resp.results);
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;