Milestone 0: import zappier billing, Verae middleware, and Zapier research

Compose-ready workspace: packages/zappier (rate card, portal, Stripe),
packages/verae-zapier-middleware (timestamp + NATS), packages/verae-zapier
(CLI app), vendor/zapier-platform, and research/zapier vendor corpus.

Gate 0 structure checks pass. Product code and research are not yet wired.
This commit is contained in:
George Lambert 2026-09-09 02:37:36 -04:00
commit b4150c8250
1364 changed files with 6814366 additions and 0 deletions

View file

@ -0,0 +1,60 @@
/* globals describe, expect, test */
const zapier = require('zapier-platform-core');
const App = require('../index');
const appTester = zapier.createAppTester(App);
zapier.tools.env.inject();
const CORE_VERSION = zapier.version.split('.').map((s) => parseInt(s));
const FILE_URL =
'https://cdn.zapier.com/storage/files/f6679cf77afeaf6b8426de8d7b9642fc.pdf';
// This is what you get when doing `curl <FILE_URL> | sha1sum`
const EXPECTED_SHA1 = '3cf58b42a0fb1b7cc58de8110096841ece967530';
describe('uploadFile', () => {
test('upload file v10', async () => {
if (CORE_VERSION[0] < 10) {
console.warn(
`skipped because this only works on core v10+ and you're on ${zapier.version}`,
);
return;
}
const bundle = {
inputData: {
filename: 'sample.pdf',
// in production, this will be an hydration URL to the selected file's data
file: FILE_URL,
},
};
const result = await appTester(
App.creates.uploadFile_v10.operation.perform,
bundle,
);
expect(result.filename).toBe('sample.pdf');
expect(result.file.sha1).toBe(EXPECTED_SHA1);
});
test('upload file v9', async () => {
const bundle = {
inputData: {
filename: 'sample.pdf',
// in production, this will be an hydration URL to the selected file's data
file: FILE_URL,
},
};
const result = await appTester(
App.creates.uploadFile_v9.operation.perform,
bundle,
);
expect(result.filename).toBe('sample.pdf');
expect(result.file.sha1).toBe(EXPECTED_SHA1);
});
});

View file

@ -0,0 +1,27 @@
/* globals describe, expect, test */
const zapier = require('zapier-platform-core');
const App = require('../index');
const appTester = zapier.createAppTester(App);
zapier.tools.env.inject();
describe('downloadFile', () => {
test('download file', async () => {
if (!process.env.ZAPIER_DEPLOY_KEY) {
console.warn('skipped as ZAPIER_DEPLOY_KEY is not defined');
return;
}
const bundle = {
inputData: {
url: 'https://httpbin.zapier-tooling.com/xml',
},
};
const url = await appTester(App.hydrators.downloadFile, bundle);
expect(url).toContain(
'https://zapier-dev-files.s3.amazonaws.com/cli-platform/',
);
});
});

View file

@ -0,0 +1,26 @@
/* globals describe, expect, test */
const zapier = require('zapier-platform-core');
const App = require('../index');
const appTester = zapier.createAppTester(App);
zapier.tools.env.inject();
describe('newFile', () => {
test('fetch files', async () => {
const bundle = {};
const results = await appTester(
App.triggers.newFile.operation.perform,
bundle,
);
expect(results.length).toBeGreaterThan(0);
// The 'hydrate|||' thing how Zapier represents dehydrated data
const firstFile = results[0];
expect(firstFile).toEqual({
id: expect.stringMatching(/^https:/),
file: expect.stringMatching(/^hydrate\|\|\|/),
});
});
});