@speckle/shared
Version:
Shared code between various Speckle JS packages
155 lines • 8.62 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.parseFeatureFlags = void 0;
exports.getFeatureFlags = getFeatureFlags;
const _lodash_1 = require("#lodash");
const znv_1 = require("znv");
const zod_1 = require("zod");
// Convenience variable to override below individual feature flags, which has the effect of setting all to 'false' (disabled)
// Takes precedence over ENABLE_ALL_FFS
const isDisableAllFFsMode = () => ['true', '1'].includes(process.env.DISABLE_ALL_FFS || '');
// Convenience variable to override below individual feature flags, which has the effect of setting all to 'true' (enabled)
// This requires a valid Speckle Enterprise Edition license in order to be enabled.
// See https://github.com/specklesystems/speckle-server?tab=License-1-ov-file#readme
const isEnableAllFFsMode = () => ['true', '1'].includes(process.env.ENABLE_ALL_FFS || '');
const parseFeatureFlags = (input, options) => {
const { forceInputs = true } = options || {};
// Clean up input: unset empty values
for (const key of Object.keys(input)) {
const typedKey = key;
const typedVal = input[typedKey];
if (typedVal === undefined || typedVal === '') {
delete input[typedKey];
}
}
//INFO
// As a convention all feature flags should be prefixed with a FF_
const res = (0, znv_1.parseEnv)(input, {
FF_AUTOMATE_MODULE_ENABLED: {
schema: zod_1.z.boolean(),
description: 'Enables the Automate module. Requires FF_GATEKEEPER_MODULE_ENABLED and FF_WORKSPACES_MODULE_ENABLED to be true. This requires a valid Speckle Enterprise Edition license in order to be enabled, see https://github.com/specklesystems/speckle-server?tab=License-1-ov-file#readme',
defaults: { _: false }
},
FF_GENDOAI_MODULE_ENABLED: {
schema: zod_1.z.boolean(),
description: 'Enables the gendo ai integration',
defaults: { _: false }
},
FF_WORKSPACES_MODULE_ENABLED: {
schema: zod_1.z.boolean(),
description: 'Enables the workspaces module. Requires FF_GATEKEEPER_MODULE_ENABLED to be true. This requires a valid Speckle Enterprise Edition license in order to be enabled, see https://github.com/specklesystems/speckle-server?tab=License-1-ov-file#readme',
defaults: { _: false }
},
FF_GATEKEEPER_MODULE_ENABLED: {
schema: zod_1.z.boolean(),
description: "Enables the 'gatekeeper', required for enabling licensed features. This requires a valid Speckle Enterprise Edition license in order to be enabled, see https://github.com/specklesystems/speckle-server?tab=License-1-ov-file#readme",
defaults: { _: false }
},
// This is expected to be disabled in Enterprise and self-hosted deployments, but enabled in app.speckle.systems
FF_BILLING_INTEGRATION_ENABLED: {
schema: zod_1.z.boolean(),
description: 'Enables Stripe billing integration. Requires FF_GATEKEEPER_MODULE_ENABLED and FF_WORKSPACES_MODULE_ENABLED to be true. This requires a valid Speckle Enterprise Edition license in order to be enabled, see https://github.com/specklesystems/speckle-server?tab=License-1-ov-file#readme',
defaults: { _: false }
},
FF_WORKSPACES_SSO_ENABLED: {
schema: zod_1.z.boolean(),
description: 'Enables using dynamic SSO on a per workspace basis. Requires FF_GATEKEEPER_MODULE_ENABLED and FF_WORKSPACES_MODULE_ENABLED to be true. This requires a valid Speckle Enterprise Edition license in order to be enabled, see https://github.com/specklesystems/speckle-server?tab=License-1-ov-file#readme',
defaults: { _: false }
},
FF_MULTIPLE_EMAILS_MODULE_ENABLED: {
schema: zod_1.z.boolean(),
description: 'Allows multiple email addresses to be associated with a single user',
defaults: { _: false }
},
FF_WORKSPACES_MULTI_REGION_ENABLED: {
schema: zod_1.z.boolean(),
description: 'Enables workspaces multi region DB support. Requires FF_GATEKEEPER_MODULE_ENABLED and FF_WORKSPACES_MODULE_ENABLED to be true. This requires a valid Speckle Enterprise Edition license in order to be enabled. See https://github.com/specklesystems/speckle-server?tab=License-1-ov-file#readme',
defaults: { _: false }
},
FF_FORCE_ONBOARDING: {
schema: zod_1.z.boolean(),
description: 'Forces onboarding flow for all users',
defaults: { _: false }
},
FF_NO_PERSONAL_EMAILS_ENABLED: {
schema: zod_1.z.boolean(),
description: 'Enable to not allow personal emails',
defaults: { _: false }
},
FF_MOVE_PROJECT_REGION_ENABLED: {
schema: zod_1.z.boolean(),
description: "Enables endpoint(s) for updating a project's region. Requires FF_WORKSPACES_MULTI_REGION_ENABLED to be true (which indirectly requires FF_GATEKEEPER_MODULE_ENABLED and FF_WORKSPACES_MODULE_ENABLED to be true. This requires a valid Speckle Enterprise Edition license in order to be enabled, see https://github.com/specklesystems/speckle-server?tab=License-1-ov-file#readme",
defaults: { _: false }
},
FF_PERSONAL_PROJECTS_LIMITS_ENABLED: {
schema: zod_1.z.boolean(),
defaults: { _: false }
},
// Enables retrying errored previews
FF_RETRY_ERRORED_PREVIEWS_ENABLED: {
schema: zod_1.z.boolean(),
description: 'Allows the retrying of previews which have previously failed.',
defaults: { _: false }
},
FF_NEXT_GEN_FILE_IMPORTER_ENABLED: {
schema: zod_1.z.boolean(),
description: 'Enables the new file importer.',
defaults: { _: false }
},
FF_RHINO_FILE_IMPORTER_ENABLED: {
schema: zod_1.z.boolean(),
description: 'Enables the Rhino based file importer.',
defaults: { _: false }
},
FF_BACKGROUND_JOBS_ENABLED: {
schema: zod_1.z.boolean(),
description: 'Enables the postgres based background job mechanism',
defaults: { _: false }
},
FF_LEGACY_FILE_IMPORTS_ENABLED: {
schema: zod_1.z.boolean(),
description: 'Enables the legacy file importer. This proxies file uploads via REST API on the server instead of directly PUTing files to S3 via pre-signed urls.',
defaults: { _: false }
},
FF_LEGACY_IFC_IMPORTER_ENABLED: {
schema: zod_1.z.boolean(),
description: 'Enables the legacy javascript based webIFC file importer (pre-2025). Even if disabled this importer can be accessed by appending `.legacyimporter.ifc` to the uploaded file name. This is deprecated and will be removed in the future.',
defaults: { _: false }
},
FF_EXPERIMENTAL_IFC_IMPORTER_ENABLED: {
schema: zod_1.z.boolean(),
description: 'Enables the IFC file importer based on IFCOpenShell (as of July 2025). Even if enabled, the previous webIFC & .Net importer can be accessed by appending `.dotnetimporter.ifc` to the uploaded file name.',
defaults: { _: false }
},
FF_ACC_INTEGRATION_ENABLED: {
schema: zod_1.z.boolean(),
description: 'Enables the integration with ACC. This synchronizes models with specified ACC assets.',
defaults: { _: false }
},
FF_SAVED_VIEWS_ENABLED: {
schema: zod_1.z.boolean(),
description: 'Enables the saved views feature for project models',
defaults: { _: false }
}
});
// Can be used to disable/enable all feature flags for testing purposes
if (isDisableAllFFsMode() || isEnableAllFFsMode()) {
for (const key of Object.keys(res)) {
if (forceInputs && (0, _lodash_1.has)(input, key)) {
continue; // skip if we are forcing inputs
}
;
res[key] = !isDisableAllFFsMode(); // disable takes precedence
}
}
return res;
};
exports.parseFeatureFlags = parseFeatureFlags;
let parsedFlags;
function getFeatureFlags() {
//@ts-expect-error this way, the parse function typing is a lot better
if (!parsedFlags)
parsedFlags = (0, exports.parseFeatureFlags)(process.env, { forceInputs: false });
return parsedFlags;
}
//# sourceMappingURL=index.js.map