roles-privileges-payload-plugin 1.1.1 → 1.1.2
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.
|
@@ -14,6 +14,6 @@ declare const _default_1: import("react").NamedExoticComponent<{
|
|
|
14
14
|
readonly validate?: import("payload").ArrayFieldValidation;
|
|
15
15
|
} & import("payload").FieldPaths & {
|
|
16
16
|
readonly field: Omit<import("payload").ArrayFieldClient, "type"> & Partial<Pick<import("payload").ArrayFieldClient, "type">>;
|
|
17
|
-
} & Omit<import("payload").ClientComponentProps, "
|
|
17
|
+
} & Omit<import("payload").ClientComponentProps, "field" | "customComponents">>;
|
|
18
18
|
export default _default_1;
|
|
19
19
|
export type { CollectionPrivileges, GlobalPrivileges };
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { AcceptedLanguages } from '@payloadcms/translations'\nimport type { CollectionConfig, Config } from 'payload'\n\nimport { createRolesCollection } from './collections/roles.js'\nimport { translations } from './translations/index.js'\nimport type { PluginDefaultTranslationsObject } from './translations/types.js'\n\nimport type { PayloadRequest, Where } from 'payload'\nimport { customPrivilegesRegistry } from './utils/createCustomPrivilege.js'\nimport {\n allGlobalPrivilegesMap,\n generateGlobalPrivilegeKey,\n generateGlobalPrivileges,\n} from './utils/generateGlobalPrivileges.js'\nimport {\n allPrivilegesMap,\n generateCollectionPrivileges,\n generatePrivilegeKey,\n} from './utils/generatePrivileges.js'\nimport { hasPrivilege } from './utils/privilegesAccess.js'\nimport { seedSuperAdminRole } from './utils/seedSuperAdminRole.js'\n/* -------------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------------- */\n\nexport type RolesPrivilegesPayloadPluginConfig = {\n enable?: boolean\n disabled?: boolean\n excludeCollections?: string[]\n excludeGlobals?: string[]\n wrapCollectionAccess?: boolean\n wrapGlobalAccess?: boolean\n seedSuperAdmin?: boolean\n /**\n * Custom roles collection configuration.\n * If provided, this collection will be used instead of the default one.\n * Use `createRolesCollection` helper to create a base configuration and customize it.\n */\n customRolesCollection?: CollectionConfig\n}\n\nexport * from './exports/types.js'\nexport * from './exports/utilities.js'\n\ntype AccessArgs = {\n req: PayloadRequest\n [key: string]: any\n}\n\ntype AccessResult = boolean | Where\ntype AccessFn = (args: AccessArgs) => AccessResult | Promise<AccessResult>\n\n/* -------------------------------------------------------------------------- */\n/* Helper Functions */\n/* -------------------------------------------------------------------------- */\n\nconst wrapAccess =\n (\n original: AccessFn | AccessResult | undefined,\n privilegeKey: string,\n ): ((args: AccessArgs) => Promise<boolean | Where>) =>\n async (args) => {\n let originalResult: AccessResult = true\n\n if (original !== undefined) {\n originalResult = typeof original === 'function' ? await original(args) : original\n\n if (originalResult === false) return false\n }\n\n const hasPriv = await hasPrivilege(privilegeKey)(args)\n if (!hasPriv) return false\n\n return originalResult\n }\n\nfunction buildPrivilegesMap(\n autoMap: Map<string, any>,\n type: 'collection' | 'global',\n slugKey: 'collectionSlug' | 'globalSlug',\n labelKey: 'collectionLabel' | 'globalLabel',\n) {\n const map = new Map<string, any>()\n\n for (const entry of autoMap.values()) {\n map.set(entry[slugKey], {\n [slugKey]: entry[slugKey],\n [labelKey]: entry[labelKey],\n privileges: { ...entry.privileges },\n })\n }\n\n for (const custom of customPrivilegesRegistry.values()) {\n if (custom.type !== type) continue\n\n const existing = map.get(custom.slug)\n if (existing) {\n existing.privileges = {\n ...existing.privileges,\n ...custom.privileges,\n }\n } else {\n map.set(custom.slug, {\n [slugKey]: custom.slug,\n [labelKey]: custom.label,\n privileges: { ...custom.privileges },\n })\n }\n }\n\n return Array.from(map.values())\n}\n\n/* -------------------------------------------------------------------------- */\n/* Plugin */\n/* -------------------------------------------------------------------------- */\n\nexport const rolesPrivilegesPayloadPlugin =\n (pluginOptions: RolesPrivilegesPayloadPluginConfig = {}) =>\n (config: Config): Config => {\n const {\n enable = true,\n excludeCollections = [],\n excludeGlobals = [],\n wrapCollectionAccess = true,\n wrapGlobalAccess = true,\n seedSuperAdmin = true,\n } = pluginOptions\n\n if (!enable) {\n return config\n }\n\n config.collections ??= []\n config.globals ??= []\n\n /* ---------------------------------------------------------------------- */\n /* Generate initial privileges */\n /* ---------------------------------------------------------------------- */\n\n for (const collection of config.collections) {\n if (!excludeCollections.includes(collection.slug) && collection.slug !== 'roles') {\n generateCollectionPrivileges(collection)\n }\n }\n\n for (const global of config.globals) {\n if (!excludeGlobals.includes(global.slug)) {\n generateGlobalPrivileges(global)\n }\n }\n\n /* ---------------------------------------------------------------------- */\n /* Roles collection */\n /* ---------------------------------------------------------------------- */\n\n const rolesCollectionToAdd =\n pluginOptions.customRolesCollection || createRolesCollection([], [])\n\n // Ensure the custom collection has slug 'roles'\n if (rolesCollectionToAdd.slug !== 'roles') {\n throw new Error('[Roles & Privileges Plugin] Custom roles collection must have slug \"roles\"')\n }\n\n config.collections.push(rolesCollectionToAdd)\n\n const rolesCollection = config.collections.find((c) => c.slug === 'roles')\n\n if (rolesCollection) {\n generateCollectionPrivileges(rolesCollection)\n\n const privilegesField = rolesCollection.fields.find(\n (f) => 'name' in f && f.name === 'privileges',\n )\n\n if (\n privilegesField &&\n 'admin' in privilegesField &&\n privilegesField.admin?.components?.Field\n ) {\n const fieldComponent = privilegesField.admin.components.Field\n\n if (typeof fieldComponent === 'object' && 'clientProps' in fieldComponent) {\n fieldComponent.clientProps = {\n get collections() {\n return buildPrivilegesMap(\n allPrivilegesMap,\n 'collection',\n 'collectionSlug',\n 'collectionLabel',\n )\n },\n get globals() {\n return buildPrivilegesMap(\n allGlobalPrivilegesMap,\n 'global',\n 'globalSlug',\n 'globalLabel',\n )\n },\n }\n }\n }\n }\n\n if (pluginOptions.disabled) {\n return config\n }\n\n /* ---------------------------------------------------------------------- */\n /* Collection access wrapping */\n /* ---------------------------------------------------------------------- */\n\n const COLLECTION_ACTIONS = [\n 'create',\n 'read',\n 'update',\n 'delete',\n 'admin',\n 'readVersions',\n 'unlock',\n ] as const\n\n if (wrapCollectionAccess) {\n for (const collection of config.collections) {\n if (excludeCollections.includes(collection.slug) || collection.slug === 'roles') {\n continue\n }\n\n collection.access ??= {}\n const originalAccess = { ...collection.access }\n\n for (const action of COLLECTION_ACTIONS) {\n const key = generatePrivilegeKey(collection.slug, action)\n collection.access[action] = wrapAccess(originalAccess[action], key) as any\n }\n }\n }\n\n /* ---------------------------------------------------------------------- */\n /* Global access wrapping */\n /* ---------------------------------------------------------------------- */\n\n const GLOBAL_ACTIONS = ['read', 'update', 'readDrafts', 'readVersions'] as const\n\n if (wrapGlobalAccess) {\n for (const global of config.globals) {\n if (excludeGlobals.includes(global.slug)) continue\n\n global.access ??= {}\n const originalAccess = { ...global.access }\n\n for (const action of GLOBAL_ACTIONS) {\n const key = generateGlobalPrivilegeKey(global.slug, action)\n global.access[action] = wrapAccess(originalAccess[action], key) as any\n }\n }\n }\n\n /* ---------------------------------------------------------------------- */\n /* onInit */\n /* ---------------------------------------------------------------------- */\n\n const incomingOnInit = config.onInit\n\n config.onInit = async (payload) => {\n if (incomingOnInit) {\n await incomingOnInit(payload)\n }\n\n const existingCollections = new Set(allPrivilegesMap.keys())\n\n for (const slug of Object.keys(payload.collections)) {\n if (\n existingCollections.has(slug) ||\n excludeCollections.includes(slug) ||\n slug === 'payload-preferences' ||\n slug === 'payload-migrations' ||\n slug === 'payload-locked-documents'\n ) {\n continue\n }\n\n const collection = payload.collections[slug]\n if (collection?.config) {\n payload.logger.info(`[Roles & Privileges] Discovered late-loaded collection: ${slug}`)\n generateCollectionPrivileges(collection.config)\n }\n }\n\n const existingGlobals = new Set(allGlobalPrivilegesMap.keys())\n\n for (const slug of Object.keys(payload.globals)) {\n if (existingGlobals.has(slug) || excludeGlobals.includes(slug)) continue\n\n const global = (payload.globals as any)[slug]\n if (global?.config) {\n payload.logger.info(`[Roles & Privileges] Discovered late-loaded global: ${slug}`)\n generateGlobalPrivileges(global.config)\n }\n }\n\n if (seedSuperAdmin) {\n await seedSuperAdminRole(payload)\n }\n }\n\n /* ---------------------------------------------------------------------- */\n /* Translations */\n /* ---------------------------------------------------------------------- */\n\n config.i18n ??= {}\n config.i18n.translations ??= {}\n\n for (const locale of Object.keys(translations) as AcceptedLanguages[]) {\n const pluginBlock = translations[locale]['plugin-roles-privileges']\n\n config.i18n.translations[locale] ??= {}\n ;(config.i18n.translations[locale] as PluginDefaultTranslationsObject)[\n 'plugin-roles-privileges'\n ] = {\n ...pluginBlock,\n }\n }\n\n return config\n }\n"],"names":["createRolesCollection","translations","customPrivilegesRegistry","allGlobalPrivilegesMap","generateGlobalPrivilegeKey","generateGlobalPrivileges","allPrivilegesMap","generateCollectionPrivileges","generatePrivilegeKey","hasPrivilege","seedSuperAdminRole","wrapAccess","original","privilegeKey","args","originalResult","undefined","hasPriv","buildPrivilegesMap","autoMap","type","slugKey","labelKey","map","Map","entry","values","set","privileges","custom","existing","get","slug","label","Array","from","rolesPrivilegesPayloadPlugin","pluginOptions","config","enable","excludeCollections","excludeGlobals","wrapCollectionAccess","wrapGlobalAccess","seedSuperAdmin","collections","globals","collection","includes","global","rolesCollectionToAdd","customRolesCollection","Error","push","rolesCollection","find","c","privilegesField","fields","f","name","admin","components","Field","fieldComponent","clientProps","disabled","COLLECTION_ACTIONS","access","originalAccess","action","key","GLOBAL_ACTIONS","incomingOnInit","onInit","payload","existingCollections","Set","keys","Object","has","logger","info","existingGlobals","i18n","locale","pluginBlock"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { AcceptedLanguages } from '@payloadcms/translations'\nimport type { CollectionConfig, Config } from 'payload'\n\nimport { createRolesCollection } from './collections/roles.js'\nimport { translations } from './translations/index.js'\nimport type { PluginDefaultTranslationsObject } from './translations/types.js'\n\nimport type { PayloadRequest, Where } from 'payload'\nimport { customPrivilegesRegistry } from './utils/createCustomPrivilege.js'\nimport {\n allGlobalPrivilegesMap,\n generateGlobalPrivilegeKey,\n generateGlobalPrivileges,\n} from './utils/generateGlobalPrivileges.js'\nimport {\n allPrivilegesMap,\n generateCollectionPrivileges,\n generatePrivilegeKey,\n} from './utils/generatePrivileges.js'\nimport { hasPrivilege } from './utils/privilegesAccess.js'\nimport { seedSuperAdminRole } from './utils/seedSuperAdminRole.js'\n/* -------------------------------------------------------------------------- */\n/* Types */\n/* -------------------------------------------------------------------------- */\n\nexport type RolesPrivilegesPayloadPluginConfig = {\n enable?: boolean\n disabled?: boolean\n excludeCollections?: string[]\n excludeGlobals?: string[]\n wrapCollectionAccess?: boolean\n wrapGlobalAccess?: boolean\n seedSuperAdmin?: boolean\n /**\n * Custom roles collection configuration.\n * If provided, this collection will be used instead of the default one.\n * Use `createRolesCollection` helper to create a base configuration and customize it.\n */\n customRolesCollection?: CollectionConfig\n}\n\nexport * from './exports/types.js'\nexport * from './exports/utilities.js'\n\ntype AccessArgs = {\n req: PayloadRequest\n [key: string]: any\n}\n\ntype AccessResult = boolean | Where\ntype AccessFn = (args: AccessArgs) => AccessResult | Promise<AccessResult>\n\n/* -------------------------------------------------------------------------- */\n/* Helper Functions */\n/* -------------------------------------------------------------------------- */\n\nconst wrapAccess =\n (\n original: AccessFn | AccessResult | undefined,\n privilegeKey: string,\n ): ((args: AccessArgs) => Promise<boolean | Where>) =>\n async (args) => {\n let originalResult: AccessResult = true\n\n if (original !== undefined) {\n originalResult = typeof original === 'function' ? await original(args) : original\n\n if (originalResult === false) return false\n }\n\n const hasPriv = await hasPrivilege(privilegeKey)(args)\n if (!hasPriv) return false\n\n return originalResult\n }\n\nfunction buildPrivilegesMap(\n autoMap: Map<string, any>,\n type: 'collection' | 'global',\n slugKey: 'collectionSlug' | 'globalSlug',\n labelKey: 'collectionLabel' | 'globalLabel',\n) {\n const map = new Map<string, any>()\n\n for (const entry of autoMap.values()) {\n map.set(entry[slugKey], {\n [slugKey]: entry[slugKey],\n [labelKey]: entry[labelKey],\n privileges: { ...entry.privileges },\n })\n }\n\n for (const custom of customPrivilegesRegistry.values()) {\n if (custom.type !== type) continue\n\n const existing = map.get(custom.slug)\n if (existing) {\n existing.privileges = {\n ...existing.privileges,\n ...custom.privileges,\n }\n } else {\n map.set(custom.slug, {\n [slugKey]: custom.slug,\n [labelKey]: custom.label,\n privileges: { ...custom.privileges },\n })\n }\n }\n\n return Array.from(map.values())\n}\n\n/* -------------------------------------------------------------------------- */\n/* Plugin */\n/* -------------------------------------------------------------------------- */\n\nexport const rolesPrivilegesPayloadPlugin =\n (pluginOptions: RolesPrivilegesPayloadPluginConfig = {}) =>\n (config: Config): Config => {\n const {\n enable = true,\n excludeCollections = [],\n excludeGlobals = [],\n wrapCollectionAccess = true,\n wrapGlobalAccess = true,\n seedSuperAdmin = true,\n } = pluginOptions\n\n if (!enable) {\n return config\n }\n\n config.collections ??= []\n config.globals ??= []\n\n /* ---------------------------------------------------------------------- */\n /* Generate initial privileges */\n /* ---------------------------------------------------------------------- */\n\n for (const collection of config.collections) {\n if (!excludeCollections.includes(collection.slug) && collection.slug !== 'roles') {\n generateCollectionPrivileges(collection)\n }\n }\n\n for (const global of config.globals) {\n if (!excludeGlobals.includes(global.slug)) {\n generateGlobalPrivileges(global)\n }\n }\n\n /* ---------------------------------------------------------------------- */\n /* Roles collection */\n /* ---------------------------------------------------------------------- */\n\n const rolesCollectionToAdd =\n pluginOptions.customRolesCollection || createRolesCollection([], [])\n\n // Ensure the custom collection has slug 'roles'\n if (rolesCollectionToAdd.slug !== 'roles') {\n throw new Error('[Roles & Privileges Plugin] Custom roles collection must have slug \"roles\"')\n }\n\n config.collections.push(rolesCollectionToAdd)\n\n const rolesCollection = config.collections.find((c) => c.slug === 'roles')\n\n if (rolesCollection) {\n generateCollectionPrivileges(rolesCollection)\n\n const privilegesField = rolesCollection.fields.find(\n (f) => 'name' in f && f.name === 'privileges',\n )\n\n if (\n privilegesField &&\n 'admin' in privilegesField &&\n privilegesField.admin?.components?.Field\n ) {\n const fieldComponent = privilegesField.admin.components.Field\n\n if (typeof fieldComponent === 'object' && 'clientProps' in fieldComponent) {\n fieldComponent.clientProps = {\n get collections() {\n return buildPrivilegesMap(\n allPrivilegesMap,\n 'collection',\n 'collectionSlug',\n 'collectionLabel',\n )\n },\n get globals() {\n return buildPrivilegesMap(\n allGlobalPrivilegesMap,\n 'global',\n 'globalSlug',\n 'globalLabel',\n )\n },\n }\n }\n }\n }\n\n if (pluginOptions.disabled) {\n return config\n }\n\n /* ---------------------------------------------------------------------- */\n /* Collection access wrapping */\n /* ---------------------------------------------------------------------- */\n\n const COLLECTION_ACTIONS = [\n 'create',\n 'read',\n 'update',\n 'delete',\n 'admin',\n 'readVersions',\n 'unlock',\n ] as const\n\n if (wrapCollectionAccess) {\n for (const collection of config.collections) {\n if (excludeCollections.includes(collection.slug) || collection.slug === 'roles') {\n continue\n }\n\n collection.access ??= {}\n const originalAccess = { ...collection.access }\n\n for (const action of COLLECTION_ACTIONS) {\n const key = generatePrivilegeKey(collection.slug, action)\n collection.access[action] = wrapAccess(originalAccess[action], key) as any\n }\n }\n }\n\n /* ---------------------------------------------------------------------- */\n /* Global access wrapping */\n /* ---------------------------------------------------------------------- */\n\n const GLOBAL_ACTIONS = ['read', 'update', 'readDrafts', 'readVersions'] as const\n\n if (wrapGlobalAccess) {\n for (const global of config.globals) {\n if (excludeGlobals.includes(global.slug)) continue\n\n global.access ??= {}\n const originalAccess = { ...global.access }\n\n for (const action of GLOBAL_ACTIONS) {\n const key = generateGlobalPrivilegeKey(global.slug, action)\n global.access[action] = wrapAccess(originalAccess[action], key) as any\n }\n }\n }\n\n /* ---------------------------------------------------------------------- */\n /* onInit */\n /* ---------------------------------------------------------------------- */\n\n const incomingOnInit = config.onInit\n\n config.onInit = async (payload) => {\n if (incomingOnInit) {\n await incomingOnInit(payload)\n }\n\n const existingCollections = new Set(allPrivilegesMap.keys())\n\n for (const slug of Object.keys(payload.collections)) {\n if (\n existingCollections.has(slug) ||\n excludeCollections.includes(slug) ||\n slug === 'payload-preferences' ||\n slug === 'payload-migrations' ||\n slug === 'payload-locked-documents'\n ) {\n continue\n }\n\n const collection = payload.collections[slug]\n if (collection?.config) {\n payload.logger.info(`[Roles & Privileges] Discovered late-loaded collection: ${slug}`)\n generateCollectionPrivileges(collection.config)\n }\n }\n\n const existingGlobals = new Set(allGlobalPrivilegesMap.keys())\n\n for (const slug of Object.keys(payload.globals)) {\n if (existingGlobals.has(slug) || excludeGlobals.includes(slug)) continue\n\n const global = (payload.globals as any)[slug]\n if (global?.config) {\n payload.logger.info(`[Roles & Privileges] Discovered late-loaded global: ${slug}`)\n generateGlobalPrivileges(global.config)\n }\n }\n\n if (seedSuperAdmin) {\n await seedSuperAdminRole(payload)\n }\n }\n\n /* ---------------------------------------------------------------------- */\n /* Translations */\n /* ---------------------------------------------------------------------- */\n\n config.i18n ??= {}\n config.i18n.translations ??= {}\n\n for (const locale of Object.keys(translations) as AcceptedLanguages[]) {\n const pluginBlock = translations[locale]['plugin-roles-privileges']\n\n ;(config.i18n.translations as any)[locale] ??= {}\n ;((config.i18n.translations as any)[locale] as PluginDefaultTranslationsObject)[\n 'plugin-roles-privileges'\n ] = {\n ...pluginBlock,\n }\n }\n\n return config\n }\n"],"names":["createRolesCollection","translations","customPrivilegesRegistry","allGlobalPrivilegesMap","generateGlobalPrivilegeKey","generateGlobalPrivileges","allPrivilegesMap","generateCollectionPrivileges","generatePrivilegeKey","hasPrivilege","seedSuperAdminRole","wrapAccess","original","privilegeKey","args","originalResult","undefined","hasPriv","buildPrivilegesMap","autoMap","type","slugKey","labelKey","map","Map","entry","values","set","privileges","custom","existing","get","slug","label","Array","from","rolesPrivilegesPayloadPlugin","pluginOptions","config","enable","excludeCollections","excludeGlobals","wrapCollectionAccess","wrapGlobalAccess","seedSuperAdmin","collections","globals","collection","includes","global","rolesCollectionToAdd","customRolesCollection","Error","push","rolesCollection","find","c","privilegesField","fields","f","name","admin","components","Field","fieldComponent","clientProps","disabled","COLLECTION_ACTIONS","access","originalAccess","action","key","GLOBAL_ACTIONS","incomingOnInit","onInit","payload","existingCollections","Set","keys","Object","has","logger","info","existingGlobals","i18n","locale","pluginBlock"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "roles-privileges-payload-plugin",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.2",
|
|
4
4
|
"description": "Automatic role-based access control (RBAC) plugin for Payload CMS that generates granular CRUD privileges for all collections with beautiful UI and zero configuration",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"payload",
|
|
@@ -34,28 +34,28 @@
|
|
|
34
34
|
"type": "module",
|
|
35
35
|
"exports": {
|
|
36
36
|
".": {
|
|
37
|
-
"import": "./
|
|
38
|
-
"types": "./
|
|
39
|
-
"default": "./
|
|
37
|
+
"import": "./dist/index.js",
|
|
38
|
+
"types": "./dist/index.d.ts",
|
|
39
|
+
"default": "./dist/index.js"
|
|
40
40
|
},
|
|
41
41
|
"./client": {
|
|
42
|
-
"import": "./
|
|
43
|
-
"types": "./
|
|
44
|
-
"default": "./
|
|
42
|
+
"import": "./dist/exports/client.js",
|
|
43
|
+
"types": "./dist/exports/client.d.ts",
|
|
44
|
+
"default": "./dist/exports/client.js"
|
|
45
45
|
},
|
|
46
46
|
"./utilities": {
|
|
47
|
-
"import": "./
|
|
48
|
-
"types": "./
|
|
49
|
-
"default": "./
|
|
47
|
+
"import": "./dist/exports/utilities.js",
|
|
48
|
+
"types": "./dist/exports/utilities.d.ts",
|
|
49
|
+
"default": "./dist/exports/utilities.js"
|
|
50
50
|
},
|
|
51
51
|
"./types": {
|
|
52
|
-
"import": "./
|
|
53
|
-
"types": "./
|
|
54
|
-
"default": "./
|
|
52
|
+
"import": "./dist/exports/types.js",
|
|
53
|
+
"types": "./dist/exports/types.d.ts",
|
|
54
|
+
"default": "./dist/exports/types.js"
|
|
55
55
|
}
|
|
56
56
|
},
|
|
57
|
-
"main": "./
|
|
58
|
-
"types": "./
|
|
57
|
+
"main": "./dist/index.js",
|
|
58
|
+
"types": "./dist/index.d.ts",
|
|
59
59
|
"files": [
|
|
60
60
|
"dist"
|
|
61
61
|
],
|
|
Binary file
|