Pārlūkot izejas kodu

Merge pull request #585 from HeyPuter/eric/rename-traits-to-features

refactor(backend): rename traits to features
Nariman Jelveh 10 mēneši atpakaļ
vecāks
revīzija
b790bab9c0

+ 3 - 3
src/backend/src/filesystem/batch/commands.js

@@ -17,7 +17,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 const { AdvancedBase } = require("@heyputer/puter-js-common");
-const { AsyncProviderTrait } = require("../../traits/AsyncProviderTrait");
+const { AsyncProviderFeature } = require("../../traits/AsyncProviderFeature");
 const { HLMkdir, QuickMkdir } = require("../hl_operations/hl_mkdir");
 const { Context } = require("../../util/context");
 const { HLWrite } = require("../hl_operations/hl_write");
@@ -32,8 +32,8 @@ const { HLRemove } = require("../hl_operations/hl_remove");
 
 
 class BatchCommand extends AdvancedBase {
-    static TRAITS = [
-        new AsyncProviderTrait(),
+    static FEATURES = [
+        new AsyncProviderFeature(),
     ]
     static async run (executor, parameters) {
         const instance = new this();

+ 4 - 4
src/backend/src/filesystem/hl_operations/hl_mkdir.js

@@ -26,8 +26,8 @@ const StringParam = require('../../api/filesystem/StringParam');
 const FlagParam = require("../../api/filesystem/FlagParam");
 const UserParam = require('../../api/filesystem/UserParam');
 const FSNodeContext = require('../FSNodeContext');
-const { ContextAwareTrait } = require('../../traits/ContextAwareTrait');
-const { OtelTrait } = require('../../traits/OtelTrait');
+const { ContextAwareFeature } = require('../../traits/ContextAwareFeature');
+const { OtelFeature } = require('../../traits/OtelFeature');
 const { HLFilesystemOperation } = require('./definitions');
 const { is_valid_path } = require('../validation');
 const { HLRemove } = require('./hl_remove');
@@ -249,8 +249,8 @@ class HLMkdir extends HLFilesystemOperation {
         parent_directories_created: () => [],
     }
 
-    static TRAITS = [
-        new OtelTrait([
+    static FEATURES = [
+        new OtelFeature([
             '_get_existing_parent',
             '_create_parents',
         ]),

+ 3 - 3
src/backend/src/filesystem/hl_operations/hl_write.js

@@ -33,7 +33,7 @@ const { HLFilesystemOperation } = require("./definitions");
 const { MkTree } = require("./hl_mkdir");
 const { Actor } = require("../../services/auth/Actor");
 
-class WriteCommonTrait {
+class WriteCommonFeature {
     install_in_instance (instance) {
         instance._verify_size = async function () {
             if (
@@ -84,8 +84,8 @@ class HLWrite extends HLFilesystemOperation {
         - create shortcuts
     `
 
-    static TRAITS = [
-        new WriteCommonTrait(),
+    static FEATURES = [
+        new WriteCommonFeature(),
     ]
 
     static PARAMETERS = {

+ 3 - 3
src/backend/src/filesystem/storage/DatabaseFSEntryService.js

@@ -21,7 +21,7 @@ const { id2path } = require("../../helpers");
 
 const { PuterPath } = require("../lib/PuterPath");
 const { NodeUIDSelector } = require("../node/selectors");
-const { OtelTrait } = require("../../traits/OtelTrait");
+const { OtelFeature } = require("../../traits/OtelFeature");
 const { Context } = require("../../util/context");
 const { DB_WRITE } = require("../../services/database/consts");
 
@@ -195,8 +195,8 @@ class DatabaseFSEntryService extends AdvancedBase {
     static STATUS_READY = {};
     static STATUS_RUNNING_JOB = {};
 
-    static TRAITS = [
-        new OtelTrait([
+    static FEATURES = [
+        new OtelFeature([
             'insert',
             'update',
             'delete',

+ 3 - 3
src/backend/src/om/IdentifierUtil.js

@@ -17,13 +17,13 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 const { AdvancedBase } = require("@heyputer/puter-js-common");
-const { WeakConstructorTrait } = require("../traits/WeakConstructorTrait");
+const { WeakConstructorFeature } = require("../traits/WeakConstructorFeature");
 const { Eq, And } = require("./query/query");
 const { Entity } = require("./entitystorage/Entity");
 
 class IdentifierUtil extends AdvancedBase {
-    static TRAITS = [
-        new WeakConstructorTrait(),
+    static FEATURES = [
+        new WeakConstructorFeature(),
     ]
 
     async detect_identifier (object) {

+ 3 - 3
src/backend/src/om/definitions/Mapping.js

@@ -18,7 +18,7 @@
  */
 const { AdvancedBase } = require("@heyputer/puter-js-common");
 const { instance_ } = require("../../monitor/PerformanceMonitor");
-const { WeakConstructorTrait } = require("../../traits/WeakConstructorTrait");
+const { WeakConstructorFeature } = require("../../traits/WeakConstructorFeature");
 const { Property } = require("./Property");
 const { Entity } = require("../entitystorage/Entity");
 const FSNodeContext = require("../../filesystem/FSNodeContext");
@@ -29,13 +29,13 @@ const FSNodeContext = require("../../filesystem/FSNodeContext");
  * Both wrapping and registering are done by RegistrantService.
  */
 class Mapping extends AdvancedBase {
-    static TRAITS = [
+    static FEATURES = [
         // Whenever you can override something, it's reasonable to want
         // to pull the desired implementation from somewhere else to
         // avoid repeating yourself. Class constructors are one of a few
         // examples where this is typically not possible.
         // However, javascript is magic, and we do what we want.
-        new WeakConstructorTrait(),
+        new WeakConstructorFeature(),
     ]
 
     static create (context, data) {

+ 3 - 3
src/backend/src/om/definitions/PropType.js

@@ -17,11 +17,11 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 const { AdvancedBase } = require("@heyputer/puter-js-common");
-const { WeakConstructorTrait } = require("../../traits/WeakConstructorTrait");
+const { WeakConstructorFeature } = require("../../traits/WeakConstructorFeature");
 
 class PropType extends AdvancedBase {
-    static TRAITS = [
-        new WeakConstructorTrait(),
+    static FEATURES = [
+        new WeakConstructorFeature(),
     ]
 
     static create (context, data, k) {

+ 3 - 3
src/backend/src/om/definitions/Property.js

@@ -17,11 +17,11 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 const { AdvancedBase } = require("@heyputer/puter-js-common");
-const { WeakConstructorTrait } = require("../../traits/WeakConstructorTrait");
+const { WeakConstructorFeature } = require("../../traits/WeakConstructorFeature");
 
 class Property extends AdvancedBase {
-    static TRAITS = [
-        new WeakConstructorTrait(),
+    static FEATURES = [
+        new WeakConstructorFeature(),
     ]
 
     static create (context, name, descriptor) {

+ 3 - 3
src/backend/src/om/entitystorage/BaseES.js

@@ -17,15 +17,15 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 const { AdvancedBase } = require("@heyputer/puter-js-common");
-const { WeakConstructorTrait } = require("../../traits/WeakConstructorTrait");
+const { WeakConstructorFeature } = require("../../traits/WeakConstructorFeature");
 const { Context } = require("../../util/context");
 
 /**
  * BaseES is a base class for Entity Store classes.
  */
 class BaseES extends AdvancedBase {
-    static TRAITS = [
-        new WeakConstructorTrait(),
+    static FEATURES = [
+        new WeakConstructorFeature(),
     ]
 
     // Default implementations

+ 3 - 3
src/backend/src/om/entitystorage/Entity.js

@@ -17,11 +17,11 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 const { AdvancedBase } = require("@heyputer/puter-js-common");
-const { WeakConstructorTrait } = require("../../traits/WeakConstructorTrait");
+const { WeakConstructorFeature } = require("../../traits/WeakConstructorFeature");
 
 class Entity extends AdvancedBase {
-    static TRAITS = [
-        new WeakConstructorTrait(),
+    static FEATURES = [
+        new WeakConstructorFeature(),
     ]
 
     constructor (args) {

+ 3 - 3
src/backend/src/om/entitystorage/SQLES.js

@@ -21,14 +21,14 @@ const { BaseES } = require("./BaseES");
 
 const APIError = require("../../api/APIError");
 const { Entity } = require("./Entity");
-const { WeakConstructorTrait } = require("../../traits/WeakConstructorTrait");
+const { WeakConstructorFeature } = require("../../traits/WeakConstructorFeature");
 const { And, Or, Eq, Like, Null, Predicate, PredicateUtil, IsNotNull } = require("../query/query");
 const { DB_WRITE } = require("../../services/database/consts");
 
 class RawCondition extends AdvancedBase {
     // properties: sql:string, values:any[]
-    static TRAITS = [
-        new WeakConstructorTrait(),
+    static FEATURES = [
+        new WeakConstructorFeature(),
     ]
 }
 

+ 3 - 3
src/backend/src/om/query/query.js

@@ -17,11 +17,11 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 const { AdvancedBase } = require("@heyputer/puter-js-common");
-const { WeakConstructorTrait } = require("../../traits/WeakConstructorTrait");
+const { WeakConstructorFeature } = require("../../traits/WeakConstructorFeature");
 
 class Predicate extends AdvancedBase {
-    static TRAITS = [
-        new WeakConstructorTrait(),
+    static FEATURES = [
+        new WeakConstructorFeature(),
     ]
 }
 

+ 1 - 1
src/backend/src/services/EntityStoreService.js

@@ -40,7 +40,7 @@ class EntityStoreService extends BaseService {
         });
     }
 
-    // TODO: can replace these with MethodProxyTrait
+    // TODO: can replace these with MethodProxyFeature
     async create (entity) {
         return await this.upstream.upsert(entity, { old_entity: null });
     }

+ 7 - 7
src/backend/src/services/OperationTraceService.js

@@ -18,10 +18,10 @@
  */
 const { AdvancedBase } = require("@heyputer/puter-js-common");
 const { Context } = require("../util/context");
-const { ContextAwareTrait } = require("../traits/ContextAwareTrait");
-const { OtelTrait } = require("../traits/OtelTrait");
+const { ContextAwareFeature } = require("../traits/ContextAwareFeature");
+const { OtelFeature } = require("../traits/OtelFeature");
 const APIError = require("../api/APIError");
-const { AssignableMethodsTrait } = require("../traits/AssignableMethodsTrait");
+const { AssignableMethodsFeature } = require("../traits/AssignableMethodsFeature");
 
 const CONTEXT_KEY = Context.make_context_key('operation-trace');
 
@@ -220,10 +220,10 @@ class OperationTraceService {
 }
 
 class BaseOperation extends AdvancedBase {
-    static TRAITS = [
-        new ContextAwareTrait(),
-        new OtelTrait(['run']),
-        new AssignableMethodsTrait(),
+    static FEATURES = [
+        new ContextAwareFeature(),
+        new OtelFeature(['run']),
+        new AssignableMethodsFeature(),
     ]
 
     async run (values) {

+ 1 - 1
src/backend/src/services/auth/PermissionService.js

@@ -17,7 +17,7 @@
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 const { get_user, get_app } = require("../../helpers");
-const { AssignableMethodsTrait } = require("../../traits/AssignableMethodsTrait");
+const { AssignableMethodsFeature } = require("../../traits/AssignableMethodsFeature");
 const { Context } = require("../../util/context");
 const BaseService = require("../BaseService");
 const { DB_WRITE } = require("../database/consts");

+ 3 - 3
src/backend/src/services/sla/RateLimitService.js

@@ -20,7 +20,7 @@ const { AdvancedBase } = require("@heyputer/puter-js-common");
 const APIError = require("../../api/APIError");
 const { Context } = require("../../util/context");
 const BaseService = require("../BaseService");
-const { SyncTrait } = require("../../traits/SyncTrait");
+const { SyncFeature } = require("../../traits/SyncFeature");
 const { DB_WRITE } = require("../database/consts");
 
 const ts_to_sql = (ts) => Math.floor(ts / 1000);
@@ -31,8 +31,8 @@ class RateLimitService extends BaseService {
         kv: globalThis.kv,
     }
 
-    static TRAITS = [
-        new SyncTrait([
+    static FEATURES = [
+        new SyncFeature([
             'check_and_increment',
         ]),
     ]

+ 2 - 2
src/backend/src/traits/AssignableMethodsTrait.js → src/backend/src/traits/AssignableMethodsFeature.js

@@ -16,7 +16,7 @@
  * You should have received a copy of the GNU Affero General Public License
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
-class AssignableMethodsTrait {
+class AssignableMethodsFeature {
     install_in_instance (instance) {
         const methods = instance._get_merged_static_object('METHODS');
 
@@ -27,5 +27,5 @@ class AssignableMethodsTrait {
 }
 
 module.exports = {
-    AssignableMethodsTrait
+    AssignableMethodsFeature
 };

+ 7 - 7
src/backend/src/traits/AsyncProviderTrait.js → src/backend/src/traits/AsyncProviderFeature.js

@@ -16,18 +16,18 @@
  * You should have received a copy of the GNU Affero General Public License
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
-class AsyncProviderTrait {
+class AsyncProviderFeature {
     install_in_instance (instance) {
         instance.valueListeners_ = {};
         instance.valueFactories_ = {};
         instance.values_ = {};
         instance.rejections_ = {};
 
-        instance.provideValue = AsyncProviderTrait.prototype.provideValue;
-        instance.rejectValue = AsyncProviderTrait.prototype.rejectValue;
-        instance.awaitValue = AsyncProviderTrait.prototype.awaitValue;
-        instance.onValue = AsyncProviderTrait.prototype.onValue;
-        instance.setFactory = AsyncProviderTrait.prototype.setFactory;
+        instance.provideValue = AsyncProviderFeature.prototype.provideValue;
+        instance.rejectValue = AsyncProviderFeature.prototype.rejectValue;
+        instance.awaitValue = AsyncProviderFeature.prototype.awaitValue;
+        instance.onValue = AsyncProviderFeature.prototype.onValue;
+        instance.setFactory = AsyncProviderFeature.prototype.setFactory;
     }
 
     provideValue (key, value) {
@@ -116,5 +116,5 @@ class AsyncProviderTrait {
 }
 
 module.exports = {
-    AsyncProviderTrait
+    AsyncProviderFeature
 };

+ 2 - 2
src/backend/src/traits/ContextAwareTrait.js → src/backend/src/traits/ContextAwareFeature.js

@@ -18,7 +18,7 @@
  */
 const { Context } = require("../util/context");
 
-class ContextAwareTrait {
+class ContextAwareFeature {
     install_in_instance (instance) {
         instance.context = Context.get();
         instance.x = instance.context;
@@ -26,5 +26,5 @@ class ContextAwareTrait {
 }
 
 module.exports = {
-    ContextAwareTrait,
+    ContextAwareFeature,
 };

+ 3 - 3
src/backend/src/traits/OtelTrait.js → src/backend/src/traits/OtelFeature.js

@@ -18,7 +18,7 @@
  */
 const { Context } = require("../util/context");
 
-class OtelTrait {
+class OtelFeature {
     constructor (method_include_list) {
         this.method_include_list = method_include_list;
     }
@@ -44,7 +44,7 @@ class OtelTrait {
     }
 }
 
-class SyncOtelTrait {
+class SyncOtelFeature {
     constructor (method_include_list) {
         this.method_include_list = method_include_list;
     }
@@ -72,5 +72,5 @@ class SyncOtelTrait {
 }
 
 module.exports = {
-    OtelTrait
+    OtelFeature
 };

+ 2 - 2
src/backend/src/traits/SyncTrait.js → src/backend/src/traits/SyncFeature.js

@@ -18,7 +18,7 @@
  */
 const { Lock } = require("../util/promise");
 
-class SyncTrait {
+class SyncFeature {
     constructor (method_include_list) {
         this.method_include_list = method_include_list;
     }
@@ -37,5 +37,5 @@ class SyncTrait {
 }
 
 module.exports = {
-    SyncTrait,
+    SyncFeature,
 };

+ 2 - 2
src/backend/src/traits/WeakConstructorTrait.js → src/backend/src/traits/WeakConstructorFeature.js

@@ -16,7 +16,7 @@
  * You should have received a copy of the GNU Affero General Public License
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
-class WeakConstructorTrait {
+class WeakConstructorFeature {
     install_in_instance(instance, { parameters }) {
         for ( const key in parameters ) {
             instance[key] = parameters[key];
@@ -25,5 +25,5 @@ class WeakConstructorTrait {
 }
 
 module.exports = {
-    WeakConstructorTrait,
+    WeakConstructorFeature,
 };

+ 5 - 5
src/puter-js-common/src/AdvancedBase.js

@@ -19,12 +19,12 @@
 // This doesn't go in ./bases because it logically depends on
 // both ./bases and ./traits, and ./traits depends on ./bases.
 
-const { TraitBase } = require("./bases/TraitBase");
+const { FeatureBase } = require("./bases/FeatureBase");
 
-class AdvancedBase extends TraitBase {
-    static TRAITS = [
-        require('./traits/NodeModuleDITrait'),
-        require('./traits/PropertiesTrait'),
+class AdvancedBase extends FeatureBase {
+    static FEATURES = [
+        require('./features/NodeModuleDIFeature'),
+        require('./features/PropertiesFeature'),
     ]
 }
 

+ 6 - 6
src/puter-js-common/src/bases/TraitBase.js → src/puter-js-common/src/bases/FeatureBase.js

@@ -18,11 +18,11 @@
  */
 const { BasicBase } = require("./BasicBase");
 
-class TraitBase extends BasicBase {
+class FeatureBase extends BasicBase {
     constructor (parameters, ...a) {
         super(parameters, ...a);
-        for ( const trait of this.traits ) {
-            trait.install_in_instance(
+        for ( const feature of this.features ) {
+            feature.install_in_instance(
                 this,
                 {
                     parameters: parameters || {},
@@ -31,11 +31,11 @@ class TraitBase extends BasicBase {
         }
     }
 
-    get traits () {
-        return this._get_merged_static_array('TRAITS');
+    get features () {
+        return this._get_merged_static_array('FEATURES');
     }
 }
 
 module.exports = {
-    TraitBase,
+    FeatureBase,
 };

+ 1 - 1
src/puter-js-common/src/traits/NodeModuleDITrait.js → src/puter-js-common/src/features/NodeModuleDIFeature.js

@@ -45,7 +45,7 @@ module.exports = {
         }
 
         instance.modules = modules;
-
+        
         // This "require" function can shadow the real one so
         // that editor tools are aware of the modules that
         // are being used.

+ 0 - 0
src/puter-js-common/src/traits/PropertiesTrait.js → src/puter-js-common/src/features/PropertiesFeature.js