@hubspot/project-parsing-lib 0.9.0 → 0.10.0-beta.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hubspot/project-parsing-lib",
3
- "version": "0.9.0",
3
+ "version": "0.10.0-beta.0",
4
4
  "description": "Parsing library for converting projects directory structures to their intermediate representation",
5
5
  "license": "Apache-2.0",
6
6
  "main": "src/index.js",
@@ -31,6 +31,7 @@ export declare const errorMessages: {
31
31
  unsupportedType: (type: string) => string;
32
32
  errorWithField: (field: string, error: string | undefined) => string;
33
33
  invalidJson: string;
34
+ unexpectedToplevelFields: (unexpectedFields: string) => string;
34
35
  wrongDirectoryForComponent: (directory: string, componentType: string, componentMetadata: ComponentMetadata, correctDir: string) => string;
35
36
  };
36
37
  migrateThemes: {
package/src/lang/copy.js CHANGED
@@ -42,6 +42,7 @@ exports.errorMessages = {
42
42
  unsupportedType: (type) => `Unsupported type: ${(0, transform_1.mapToUserFacingType)(type)}`,
43
43
  errorWithField: (field, error) => `${field}: ${error || 'Unknown error'}`,
44
44
  invalidJson: 'Invalid JSON',
45
+ unexpectedToplevelFields: (unexpectedFields) => `Unexpected top-level properties found: ${unexpectedFields}`,
45
46
  wrongDirectoryForComponent: (directory, componentType, componentMetadata, correctDir) => `The directory '${directory}' is incorrect for type '${componentType}'. ${componentMetadata.userFriendlyName} ${componentMetadata.userFriendlyTypePlural} should only be placed in the '${correctDir}' directory`,
46
47
  },
47
48
  migrateThemes: {
@@ -1,3 +1,4 @@
1
+ import { Components as ComponentsTopLevel } from './types';
1
2
  export declare const AppKey = "app";
2
3
  export declare const ThemeKey = "theme";
3
4
  export declare const CmsAssetsKey = "cms-assets";
@@ -16,6 +17,7 @@ export declare const SettingsKey = "settings";
16
17
  export declare const TelemetryKey = "telemetry";
17
18
  export declare const VideoConferencingKey = "video-conferencing";
18
19
  export declare const WebhooksKey = "webhooks";
20
+ export declare const WebhooksJournalKey = "webhooks-journal";
19
21
  export declare const WorkflowActionsKey = "workflow-action";
20
22
  export declare const AppFunctionsPackageKey = "serverless-package";
21
23
  export declare const AutoGeneratedComponentTypes: string[];
@@ -52,3 +54,4 @@ export declare const ProfileVariableTypes: {
52
54
  readonly PROFILE_STRING: "PROFILE_STRING";
53
55
  readonly PROFILE_BOOLEAN: "PROFILE_BOOLEAN";
54
56
  };
57
+ export declare const allowedTopLevelFields: Set<keyof ComponentsTopLevel>;
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.ProfileVariableTypes = exports.allowedSubComponentDirectories = exports.allowedComponentDirectories = exports.ProjectStructure = exports.allowedCmsAssetSubComponentDirs = exports.allowedThemeSubComponentsDirs = exports.allowedAppSubComponentsDirs = exports.packageLockJson = exports.packageJson = exports.hsProjectJsonFilename = exports.profileFilePrefix = exports.metafileExtension = exports.internalTypeToUserFacing = exports.userFacingToInternalType = exports.Components = exports.AutoGeneratedComponentTypes = exports.AppFunctionsPackageKey = exports.WorkflowActionsKey = exports.WebhooksKey = exports.VideoConferencingKey = exports.TelemetryKey = exports.SettingsKey = exports.MediaBridgeKey = exports.MCPRegistryKey = exports.MarketingEventsKey = exports.SCIMKey = exports.CardsKey = exports.CallingKey = exports.AppObjectAssociationKey = exports.AppObjectKey = exports.PagesKey = exports.AppFunctionsKey = exports.AppEventsKey = exports.CmsAssetsKey = exports.ThemeKey = exports.AppKey = void 0;
36
+ exports.allowedTopLevelFields = exports.ProfileVariableTypes = exports.allowedSubComponentDirectories = exports.allowedComponentDirectories = exports.ProjectStructure = exports.allowedCmsAssetSubComponentDirs = exports.allowedThemeSubComponentsDirs = exports.allowedAppSubComponentsDirs = exports.packageLockJson = exports.packageJson = exports.hsProjectJsonFilename = exports.profileFilePrefix = exports.metafileExtension = exports.internalTypeToUserFacing = exports.userFacingToInternalType = exports.Components = exports.AutoGeneratedComponentTypes = exports.AppFunctionsPackageKey = exports.WorkflowActionsKey = exports.WebhooksJournalKey = exports.WebhooksKey = exports.VideoConferencingKey = exports.TelemetryKey = exports.SettingsKey = exports.MediaBridgeKey = exports.MCPRegistryKey = exports.MarketingEventsKey = exports.SCIMKey = exports.CardsKey = exports.CallingKey = exports.AppObjectAssociationKey = exports.AppObjectKey = exports.PagesKey = exports.AppFunctionsKey = exports.AppEventsKey = exports.CmsAssetsKey = exports.ThemeKey = exports.AppKey = void 0;
37
37
  // Top Level Component types
38
38
  const path = __importStar(require("path"));
39
39
  // Component types
@@ -56,6 +56,7 @@ exports.SettingsKey = 'settings';
56
56
  exports.TelemetryKey = 'telemetry';
57
57
  exports.VideoConferencingKey = 'video-conferencing';
58
58
  exports.WebhooksKey = 'webhooks';
59
+ exports.WebhooksJournalKey = 'webhooks-journal';
59
60
  exports.WorkflowActionsKey = 'workflow-action';
60
61
  // Auto-generated component types
61
62
  exports.AppFunctionsPackageKey = 'serverless-package';
@@ -170,6 +171,13 @@ exports.Components = {
170
171
  ...SubComponentFields,
171
172
  singularComponent: true,
172
173
  },
174
+ [exports.WebhooksJournalKey]: {
175
+ dir: exports.WebhooksJournalKey,
176
+ parentComponent: exports.AppKey,
177
+ userFriendlyName: 'Webhooks Journal',
178
+ ...SubComponentFields,
179
+ singularComponent: true,
180
+ },
173
181
  [exports.WorkflowActionsKey]: {
174
182
  dir: 'workflow-actions',
175
183
  parentComponent: exports.AppKey,
@@ -230,3 +238,9 @@ exports.ProfileVariableTypes = {
230
238
  PROFILE_STRING: 'PROFILE_STRING',
231
239
  PROFILE_BOOLEAN: 'PROFILE_BOOLEAN',
232
240
  };
241
+ exports.allowedTopLevelFields = new Set([
242
+ 'uid',
243
+ 'type',
244
+ 'config',
245
+ 'dependencies',
246
+ ]);
package/src/lib/files.js CHANGED
@@ -107,6 +107,17 @@ function parseFile(fileLoadResult) {
107
107
  catch (_e) {
108
108
  fileLoadResult.errors?.push(copy_1.errorMessages.validation.invalidJson);
109
109
  }
110
+ // Validate top-level fields (only uid, type, and config are expected)
111
+ if (parsedFileContents &&
112
+ typeof parsedFileContents === 'object' &&
113
+ !Array.isArray(parsedFileContents)) {
114
+ const actualFields = Object.keys(parsedFileContents);
115
+ const unexpectedFields = actualFields.filter(field => !constants_1.allowedTopLevelFields.has(field));
116
+ if (unexpectedFields.length > 0) {
117
+ const unexpectedFieldsList = unexpectedFields.join(', ');
118
+ fileLoadResult.errors?.push(copy_1.errorMessages.validation.unexpectedToplevelFields(unexpectedFieldsList));
119
+ }
120
+ }
110
121
  return { ...fileLoadResult, content: parsedFileContents };
111
122
  }
112
123
  async function projectContainsHsMetaFiles(projectSourceDir) {