Skip to content

Commit 6bdc349

Browse files
authored
chore: refactor ingestion lambda to use loader function from @jsii/spec (#920)
Uses `loadAssemblyFromBuffer`, a new function available in jsii v1.62.0. This refactor does not break any current tests ---- *By submitting this pull request, I confirm that my contribution is made under the terms of the Apache-2.0 license*
1 parent 4f250e2 commit 6bdc349

File tree

8 files changed

+62
-35
lines changed

8 files changed

+62
-35
lines changed

src/__tests__/__snapshots__/construct-hub.test.ts.snap

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/__tests__/backend/ingestion/ingestion.lambda.test.ts

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
SchemaVersion,
99
Stability,
1010
TypeKind,
11+
SPEC_FILE_NAME,
1112
} from '@jsii/spec';
1213
import type { metricScope, MetricsLogger } from 'aws-embedded-metrics';
1314
import { Context, SQSEvent } from 'aws-lambda';
@@ -147,7 +148,7 @@ test('basic happy case', async () => {
147148
mockExtract.mockImplementation(
148149
() =>
149150
new FakeExtract(fakeTar, {
150-
'package/.jsii': fakeDotJsii,
151+
[`package/${SPEC_FILE_NAME}`]: fakeDotJsii,
151152
'package/index.js': '// Ignore me!',
152153
'package/package.json': JSON.stringify({
153154
name: packageName,
@@ -374,7 +375,7 @@ test('basic happy case with license file', async () => {
374375
mockExtract.mockImplementation(
375376
() =>
376377
new FakeExtract(fakeTar, {
377-
'package/.jsii': fakeDotJsii,
378+
[`package/${SPEC_FILE_NAME}`]: fakeDotJsii,
378379
'package/LICENSE.md': fakeLicense,
379380
'package/index.js': '// Ignore me!',
380381
'package/package.json': JSON.stringify({
@@ -617,7 +618,7 @@ test('basic happy case with custom package links', async () => {
617618
mockExtract.mockImplementation(
618619
() =>
619620
new FakeExtract(fakeTar, {
620-
'package/.jsii': fakeDotJsii,
621+
[`package/${SPEC_FILE_NAME}`]: fakeDotJsii,
621622
'package/index.js': '// Ignore me!',
622623
'package/package.json': JSON.stringify({
623624
name: packageName,
@@ -887,7 +888,7 @@ test('basic happy case with custom tags', async () => {
887888
mockExtract.mockImplementation(
888889
() =>
889890
new FakeExtract(fakeTar, {
890-
'package/.jsii': fakeDotJsii,
891+
[`package/${SPEC_FILE_NAME}`]: fakeDotJsii,
891892
'package/index.js': '// Ignore me!',
892893
'package/package.json': JSON.stringify({
893894
name: packageName,
@@ -1123,7 +1124,7 @@ for (const [frameworkName, frameworkPackage] of [
11231124
mockExtract.mockImplementation(
11241125
() =>
11251126
new FakeExtract(fakeTar, {
1126-
'package/.jsii': fakeDotJsii,
1127+
[`package/${SPEC_FILE_NAME}`]: fakeDotJsii,
11271128
'package/index.js': '// Ignore me!',
11281129
'package/package.json': JSON.stringify({
11291130
name: packageName,
@@ -1342,7 +1343,7 @@ for (const [frameworkName, frameworkPackage] of [
13421343
mockExtract.mockImplementation(
13431344
() =>
13441345
new FakeExtract(fakeTar, {
1345-
'package/.jsii': fakeDotJsii,
1346+
[`package/${SPEC_FILE_NAME}`]: fakeDotJsii,
13461347
'package/index.js': '// Ignore me!',
13471348
'package/package.json': JSON.stringify({
13481349
name: frameworkPackage,
@@ -1569,7 +1570,7 @@ for (const [frameworkName, frameworkPackage] of [
15691570
mockExtract.mockImplementation(
15701571
() =>
15711572
new FakeExtract(fakeTar, {
1572-
'package/.jsii': fakeDotJsii,
1573+
[`package/${SPEC_FILE_NAME}`]: fakeDotJsii,
15731574
'package/index.js': '// Ignore me!',
15741575
'package/package.json': JSON.stringify({
15751576
name: packageName,
@@ -1790,7 +1791,7 @@ test('mismatched package name', async () => {
17901791
mockExtract.mockImplementation(
17911792
() =>
17921793
new FakeExtract(fakeTar, {
1793-
'package/.jsii': fakeDotJsii,
1794+
[`package/${SPEC_FILE_NAME}`]: fakeDotJsii,
17941795
'package/LICENSE.md': fakeLicense,
17951796
'package/index.js': '// Ignore me!',
17961797
'package/package.json': JSON.stringify({
@@ -1928,7 +1929,7 @@ test('mismatched package version', async () => {
19281929
mockExtract.mockImplementation(
19291930
() =>
19301931
new FakeExtract(fakeTar, {
1931-
'package/.jsii': fakeDotJsii,
1932+
[`package/${SPEC_FILE_NAME}`]: fakeDotJsii,
19321933
'package/LICENSE.md': fakeLicense,
19331934
'package/index.js': '// Ignore me!',
19341935
'package/package.json': JSON.stringify({
@@ -2066,7 +2067,7 @@ test('mismatched package license', async () => {
20662067
mockExtract.mockImplementation(
20672068
() =>
20682069
new FakeExtract(fakeTar, {
2069-
'package/.jsii': fakeDotJsii,
2070+
[`package/${SPEC_FILE_NAME}`]: fakeDotJsii,
20702071
'package/LICENSE.md': fakeLicense,
20712072
'package/index.js': '// Ignore me!',
20722073
'package/package.json': JSON.stringify({
@@ -2332,7 +2333,7 @@ test('missing package.json file', async () => {
23322333
mockExtract.mockImplementation(
23332334
() =>
23342335
new FakeExtract(fakeTar, {
2335-
'package/.jsii': fakeDotJsii,
2336+
[`package/${SPEC_FILE_NAME}`]: fakeDotJsii,
23362337
'package/LICENSE.md': fakeLicense,
23372338
'package/index.js': '// Ignore me!',
23382339
}) as any

src/__tests__/devapp/__snapshots__/snapshot.test.ts.snap

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/__tests__/package-sources/__snapshots__/code-artifact.test.ts.snap

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/__tests__/package-sources/codeartifact/code-artifact-forwarder.lambda.test.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { pseudoRandomBytes } from 'crypto';
2+
import { SPEC_FILE_NAME } from '@jsii/spec';
23
import type { Context } from 'aws-lambda';
34
import * as AWS from 'aws-sdk';
45
import * as AWSMock from 'aws-sdk-mock';
@@ -142,7 +143,9 @@ test('happy path', async () => {
142143
expect(tgz).toEqual(
143144
Buffer.from(mockGetPackageVersionAssetResult.asset! as any)
144145
);
145-
expect(selector).toHaveProperty('assemblyJson', { path: 'package/.jsii' });
146+
expect(selector).toHaveProperty('assemblyJson', {
147+
path: `package/${SPEC_FILE_NAME}`,
148+
});
146149
expect(selector).toHaveProperty('packageJson', {
147150
path: 'package/package.json',
148151
required: true,
@@ -295,7 +298,9 @@ test('no license (i.e: UNLICENSED)', async () => {
295298
expect(tgz).toEqual(
296299
Buffer.from(mockGetPackageVersionAssetResult.asset! as any)
297300
);
298-
expect(selector).toHaveProperty('assemblyJson', { path: 'package/.jsii' });
301+
expect(selector).toHaveProperty('assemblyJson', {
302+
path: `package/${SPEC_FILE_NAME}`,
303+
});
299304
expect(selector).toHaveProperty('packageJson', {
300305
path: 'package/package.json',
301306
required: true,
@@ -370,7 +375,9 @@ test('ineligible license', async () => {
370375
expect(tgz).toEqual(
371376
Buffer.from(mockGetPackageVersionAssetResult.asset! as any)
372377
);
373-
expect(selector).toHaveProperty('assemblyJson', { path: 'package/.jsii' });
378+
expect(selector).toHaveProperty('assemblyJson', {
379+
path: `package/${SPEC_FILE_NAME}`,
380+
});
374381
expect(selector).toHaveProperty('packageJson', {
375382
path: 'package/package.json',
376383
required: true,
@@ -444,7 +451,9 @@ test('not a jsii package', async () => {
444451
expect(tgz).toEqual(
445452
Buffer.from(mockGetPackageVersionAssetResult.asset! as any)
446453
);
447-
expect(selector).toHaveProperty('assemblyJson', { path: 'package/.jsii' });
454+
expect(selector).toHaveProperty('assemblyJson', {
455+
path: `package/${SPEC_FILE_NAME}`,
456+
});
448457
expect(selector).toHaveProperty('packageJson', {
449458
path: 'package/package.json',
450459
required: true,

src/backend/ingestion/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -374,7 +374,7 @@ export class Ingestion extends Construct implements IGrantable {
374374
/**
375375
* This metrics is the total count of packages that were rejected due to
376376
* mismatched identity (name, version, license) between the `package.json`
377-
* file and te `.jsii` attribute.
377+
* file and the `.jsii` attribute.
378378
*/
379379
public metricMismatchedIdentityRejections(opts?: MetricOptions): Metric {
380380
return new Metric({

src/backend/ingestion/ingestion.lambda.ts

Lines changed: 25 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,12 @@ import { createHash } from 'crypto';
22
import { basename, extname } from 'path';
33
import { URL } from 'url';
44

5-
import { Assembly, validateAssembly } from '@jsii/spec';
5+
import {
6+
SPEC_FILE_NAME,
7+
Assembly,
8+
loadAssemblyFromBuffer,
9+
SPEC_FILE_NAME_COMPRESSED,
10+
} from '@jsii/spec';
611
import { metricScope, Configuration, Unit } from 'aws-embedded-metrics';
712
import type { Context, SQSEvent } from 'aws-lambda';
813
import { CacheStrategy } from '../../caching';
@@ -87,18 +92,21 @@ export const handler = metricScope(
8792
);
8893
}
8994

95+
const dotJsiiFile = `package/${SPEC_FILE_NAME}`;
96+
const compDotJsiiFile = `package/${SPEC_FILE_NAME_COMPRESSED}`;
97+
9098
let dotJsii: Buffer;
99+
let compDotJsii: Buffer | undefined;
91100
let packageJson: Buffer;
92101
let licenseText: Buffer | undefined;
93102
try {
94-
({ dotJsii, packageJson, licenseText } = await extractObjects(
95-
Buffer.from(tarball.Body! as any),
96-
{
97-
dotJsii: { path: 'package/.jsii', required: true },
103+
({ dotJsii, compDotJsii, packageJson, licenseText } =
104+
await extractObjects(Buffer.from(tarball.Body! as any), {
105+
dotJsii: { path: dotJsiiFile, required: true },
106+
compDotJsii: { path: compDotJsiiFile },
98107
packageJson: { path: 'package/package.json', required: true },
99108
licenseText: { filter: isLicenseFile },
100-
}
101-
));
109+
}));
102110
} catch (err) {
103111
console.error(`Invalid tarball content: ${err}`);
104112
metrics.putMetric(MetricName.INVALID_TARBALL, 1, Unit.Count);
@@ -112,8 +120,16 @@ export const handler = metricScope(
112120
let packageVersion: string;
113121
let packageReadme: string;
114122
try {
115-
parsedAssembly = validateAssembly(
116-
JSON.parse(dotJsii.toString('utf-8'))
123+
parsedAssembly = loadAssemblyFromBuffer(
124+
dotJsii,
125+
compDotJsii
126+
? (filename: string) => {
127+
if (filename !== compDotJsiiFile) {
128+
throw new Error('');
129+
}
130+
return compDotJsii!;
131+
}
132+
: undefined
117133
);
118134

119135
// needs `dependencyClosure`

src/package-sources/codeartifact/code-artifact-forwarder.lambda.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { SPEC_FILE_NAME } from '@jsii/spec';
12
import { metricScope, Unit } from 'aws-embedded-metrics';
23
import type { Context, EventBridgeEvent } from 'aws-lambda';
34

@@ -75,7 +76,7 @@ export const handler = metricScope(
7576
const tarball = Buffer.from(asset! as any);
7677

7778
const { assemblyJson, packageJson } = await extractObjects(tarball, {
78-
assemblyJson: { path: 'package/.jsii' },
79+
assemblyJson: { path: `package/${SPEC_FILE_NAME}` },
7980
packageJson: { path: 'package/package.json', required: true },
8081
});
8182
metrics.putMetric(
@@ -85,7 +86,7 @@ export const handler = metricScope(
8586
);
8687
if (assemblyJson == null) {
8788
console.log(
88-
`Package "${packageName}@${event.detail.packageVersion}" does not contain a .jsii assembly`
89+
`Package "${packageName}@${event.detail.packageVersion}" does not contain a ${SPEC_FILE_NAME} assembly`
8990
);
9091
return;
9192
}

0 commit comments

Comments
 (0)