@nft-studio/js 0.1.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/LICENSE ADDED
@@ -0,0 +1,13 @@
1
+ Copyright 2018-2020 ArcBlock
2
+
3
+ Licensed under the Apache License, Version 2.0 (the "License");
4
+ you may not use this file except in compliance with the License.
5
+ You may obtain a copy of the License at
6
+
7
+ http://www.apache.org/licenses/LICENSE-2.0
8
+
9
+ Unless required by applicable law or agreed to in writing, software
10
+ distributed under the License is distributed on an "AS IS" BASIS,
11
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ See the License for the specific language governing permissions and
13
+ limitations under the License.
package/README.md ADDED
@@ -0,0 +1,19 @@
1
+ # NFT Studio Node.js SDK
2
+
3
+ A Node.js SDK for the NFT Studio API, can be used to manage resources in NFT Studio.
4
+
5
+ ## Installation
6
+
7
+ ```bash
8
+ npm install @nft-studio/js
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```js
14
+ // TODO
15
+ ```
16
+
17
+ ## Resources
18
+
19
+ ## Configuration
@@ -0,0 +1,16 @@
1
+ import * as utils from './libs/utils';
2
+ declare const _default: {
3
+ env: {
4
+ [key: string]: any;
5
+ chainHost: string;
6
+ makerUrl: string | null;
7
+ blenderUrl: string | null;
8
+ storeUrl: string | null;
9
+ didSpaceEndpoint: string | null;
10
+ makerComponentInfo: any;
11
+ blenderComponentInfo: any;
12
+ storeComponentInfo: any;
13
+ };
14
+ utils: typeof utils;
15
+ };
16
+ export default _default;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+
7
+ var _env = _interopRequireDefault(require("./libs/env"));
8
+ var utils = _interopRequireWildcard(require("./libs/utils"));
9
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
10
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
11
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
+ module.exports = {
13
+ env: _env.default,
14
+ utils
15
+ };
@@ -0,0 +1,12 @@
1
+ declare let envMap: {
2
+ [key: string]: any;
3
+ chainHost: string;
4
+ makerUrl: string | null;
5
+ blenderUrl: string | null;
6
+ storeUrl: string | null;
7
+ didSpaceEndpoint: string | null;
8
+ makerComponentInfo: any;
9
+ blenderComponentInfo: any;
10
+ storeComponentInfo: any;
11
+ };
12
+ export default envMap;
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+
7
+ var _config = _interopRequireDefault(require("@blocklet/sdk/lib/config"));
8
+ var _component = _interopRequireDefault(require("@blocklet/sdk/lib/component"));
9
+ var _logger = _interopRequireDefault(require("./logger"));
10
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
+ let envMap = {};
12
+ const getComponentInfo = did => {
13
+ return _config.default.components.find(item => item.did === did) || {};
14
+ };
15
+ const updateEnv = () => {
16
+ _logger.default.info("updating js sdk env");
17
+ envMap = {
18
+ ..._config.default.env,
19
+ get chainHost() {
20
+ return _config.default.env.CHAIN_HOST || process.env.CHAIN_HOST || "";
21
+ },
22
+ get makerUrl() {
23
+ return _component.default.getComponentWebEndpoint("z8ia2birZzhjbXqKnxPUUivmqErdsf3724tr6");
24
+ },
25
+ get blenderUrl() {
26
+ return _component.default.getComponentWebEndpoint("z8ia1ieY5KhEC4LMRETzS5nUwD7PvAND8qkfX");
27
+ },
28
+ get storeUrl() {
29
+ return _component.default.getComponentWebEndpoint("z8iZqkCjLP6TZpR12tT3jESWxB8SGzNsx8nZa");
30
+ },
31
+ get makerComponentInfo() {
32
+ return getComponentInfo("z8ia2birZzhjbXqKnxPUUivmqErdsf3724tr6");
33
+ },
34
+ get blenderComponentInfo() {
35
+ return getComponentInfo("z8ia1ieY5KhEC4LMRETzS5nUwD7PvAND8qkfX");
36
+ },
37
+ get storeComponentInfo() {
38
+ return getComponentInfo("z8iZqkCjLP6TZpR12tT3jESWxB8SGzNsx8nZa");
39
+ },
40
+ get didSpaceEndpoint() {
41
+ return _config.default.env.APP_SPACE_ENDPOINT || _config.default.env.BLOCKLET_APP_SPACE_ENDPOINT || process.env.APP_SPACE_ENDPOINT || process.env.BLOCKLET_APP_SPACE_ENDPOINT;
42
+ }
43
+ };
44
+ };
45
+ updateEnv();
46
+ _config.default.events.on(_config.default.Events.envUpdate, () => {
47
+ updateEnv();
48
+ });
49
+ module.exports = envMap;
@@ -0,0 +1,42 @@
1
+ declare const logger: {
2
+ log: (...args: any[]) => void;
3
+ info: (...args: any[]) => void;
4
+ warn: (...args: any[]) => void;
5
+ error: (...args: any[]) => void;
6
+ assert(condition?: boolean, ...data: any[]): void;
7
+ assert(value: any, message?: string, ...optionalParams: any[]): void;
8
+ clear(): void;
9
+ clear(): void;
10
+ count(label?: string): void;
11
+ count(label?: string): void;
12
+ countReset(label?: string): void;
13
+ countReset(label?: string): void;
14
+ debug(...data: any[]): void;
15
+ debug(message?: any, ...optionalParams: any[]): void;
16
+ dir(item?: any, options?: any): void;
17
+ dir(obj: any, options?: import("util").InspectOptions): void;
18
+ dirxml(...data: any[]): void;
19
+ dirxml(...data: any[]): void;
20
+ group(...data: any[]): void;
21
+ group(...label: any[]): void;
22
+ groupCollapsed(...data: any[]): void;
23
+ groupCollapsed(...label: any[]): void;
24
+ groupEnd(): void;
25
+ groupEnd(): void;
26
+ table(tabularData?: any, properties?: string[]): void;
27
+ table(tabularData: any, properties?: readonly string[]): void;
28
+ time(label?: string): void;
29
+ time(label?: string): void;
30
+ timeEnd(label?: string): void;
31
+ timeEnd(label?: string): void;
32
+ timeLog(label?: string, ...data: any[]): void;
33
+ timeLog(label?: string, ...data: any[]): void;
34
+ timeStamp(label?: string): void;
35
+ timeStamp(label?: string): void;
36
+ trace(...data: any[]): void;
37
+ trace(message?: any, ...optionalParams: any[]): void;
38
+ Console: console.ConsoleConstructor;
39
+ profile(label?: string): void;
40
+ profileEnd(label?: string): void;
41
+ };
42
+ export default logger;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+
7
+ const insertArgs = method => {
8
+ return (...args) => {
9
+ method.apply(console, args);
10
+ };
11
+ };
12
+ const logger = {
13
+ ...console,
14
+ // eslint-disable-next-line no-console
15
+ log: insertArgs(console.log),
16
+ // eslint-disable-next-line no-console
17
+ info: insertArgs(console.info),
18
+ warn: insertArgs(console.warn),
19
+ error: insertArgs(console.error)
20
+ };
21
+ module.exports = logger;
@@ -0,0 +1,55 @@
1
+ import type { TriggerUrlHookParams, NFTFactoryState } from '../types';
2
+ export declare const makerExist: () => boolean;
3
+ export declare const blenderExist: () => boolean;
4
+ export declare const storeExist: () => boolean;
5
+ export declare const triggerUrlHook: ({ factoryState, hookName, bodyValue }?: TriggerUrlHookParams) => Promise<null>;
6
+ export declare const shouldTriggerPreMintFactory: (factoryState: NFTFactoryState) => boolean;
7
+ export declare function replaceDynamicMountPoint({ src, splitKey, withAppUrl }?: {
8
+ src: string;
9
+ splitKey: string;
10
+ withAppUrl?: boolean;
11
+ }): string;
12
+ export declare const formatFactoryState: (factoryState: NFTFactoryState & {
13
+ loading?: boolean;
14
+ endTime?: string;
15
+ display?: string;
16
+ }) => {
17
+ address: string;
18
+ owner: string;
19
+ name: string;
20
+ description: string;
21
+ settlement: string;
22
+ limit: number;
23
+ trustedIssuers: string[];
24
+ input: GraphQLClient.IndexedFactoryInput;
25
+ output: {
26
+ moniker: string;
27
+ data: {
28
+ typeUrl: string;
29
+ value: string & {
30
+ sn: string;
31
+ };
32
+ };
33
+ readonly: boolean;
34
+ transferrable: boolean;
35
+ ttl: number;
36
+ parent: string;
37
+ address: string;
38
+ issuer: string;
39
+ endpoint: GraphQLClient.NFTEndpoint;
40
+ display: GraphQLClient.NFTDisplay;
41
+ tags: string[];
42
+ };
43
+ hooks: GraphQLClient.AssetFactoryHook[];
44
+ data: GraphQLClient.Any;
45
+ context: GraphQLClient.StateContext;
46
+ balance: string;
47
+ tokens: GraphQLClient.IndexedTokenInput[];
48
+ numMinted: number;
49
+ display: GraphQLClient.NFTDisplay;
50
+ lastSettlement: string;
51
+ } & {
52
+ loading?: boolean;
53
+ endTime?: string;
54
+ display?: string;
55
+ };
@@ -0,0 +1,107 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.makerExist = exports.formatFactoryState = exports.blenderExist = void 0;
7
+ exports.replaceDynamicMountPoint = replaceDynamicMountPoint;
8
+ exports.triggerUrlHook = exports.storeExist = exports.shouldTriggerPreMintFactory = void 0;
9
+ var _axios = _interopRequireDefault(require("axios"));
10
+ var _set = _interopRequireDefault(require("lodash/set"));
11
+ var _ufo = require("ufo");
12
+ var _constant = require("@blocklet/constant");
13
+ var _env = _interopRequireDefault(require("./env"));
14
+ var _logger = _interopRequireDefault(require("./logger"));
15
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
+ const makerExist = () => !!_env.default.makerUrl && _env.default.makerComponentInfo?.status === _constant.BlockletStatus.running;
17
+ exports.makerExist = makerExist;
18
+ const blenderExist = () => !!_env.default.blenderUrl && _env.default.blenderComponentInfo?.status === _constant.BlockletStatus.running;
19
+ exports.blenderExist = blenderExist;
20
+ const storeExist = () => !!_env.default.storeUrl && _env.default.storeComponentInfo?.status === _constant.BlockletStatus.running;
21
+ exports.storeExist = storeExist;
22
+ const triggerUrlHook = async ({
23
+ factoryState,
24
+ hookName,
25
+ bodyValue = {}
26
+ } = {}) => {
27
+ const {
28
+ hooks
29
+ } = factoryState;
30
+ const hookItem = hooks.find(x => x.name === hookName && x.type === "url");
31
+ let hookValue = null;
32
+ if (hookItem) {
33
+ try {
34
+ const {
35
+ data
36
+ } = await _axios.default.post(hookItem.hook, bodyValue);
37
+ _logger.default.info(`auth.hook:success:${hookName}`, {
38
+ hook: hookItem.hook,
39
+ bodyValue
40
+ });
41
+ hookValue = data;
42
+ } catch (err) {
43
+ _logger.default.error(`auth.hook:error:${hookName}`, err);
44
+ throw err;
45
+ }
46
+ }
47
+ return hookValue;
48
+ };
49
+ exports.triggerUrlHook = triggerUrlHook;
50
+ const shouldTriggerPreMintFactory = factoryState => {
51
+ return factoryState?.output?.data?.value?.sn === "{{input.sn}}";
52
+ };
53
+ exports.shouldTriggerPreMintFactory = shouldTriggerPreMintFactory;
54
+ function replaceDynamicMountPoint({
55
+ src = "",
56
+ splitKey = "",
57
+ withAppUrl = false
58
+ } = {}) {
59
+ try {
60
+ const startWithCurrentMountPoint = src?.startsWith((0, _ufo.joinURL)(_env.default.blenderComponentInfo.mountPoint, "/"));
61
+ if (!splitKey || !src || startWithCurrentMountPoint) {
62
+ return src;
63
+ }
64
+ const [, ...afterPathList] = src.split(splitKey);
65
+ const newPath = (0, _ufo.joinURL)(_env.default.blenderComponentInfo.mountPoint, splitKey, afterPathList.join(splitKey));
66
+ if (withAppUrl) {
67
+ return (0, _ufo.joinURL)(_env.default.appUrl, newPath);
68
+ }
69
+ return newPath;
70
+ } catch (error) {}
71
+ if (withAppUrl) {
72
+ return (0, _ufo.joinURL)(_env.default.appUrl, src);
73
+ }
74
+ return src;
75
+ }
76
+ const formatFactoryState = factoryState => {
77
+ if (factoryState.loading) {
78
+ return factoryState;
79
+ }
80
+ try {
81
+ if (typeof factoryState?.output?.data?.value === "string") {
82
+ (0, _set.default)(factoryState, "output.data.value", JSON.parse(factoryState?.output?.data?.value));
83
+ }
84
+ if (typeof factoryState?.data?.value === "string") {
85
+ (0, _set.default)(factoryState, "data.value", JSON.parse(factoryState?.data.value));
86
+ }
87
+ if (factoryState.endTime) {
88
+ (0, _set.default)(factoryState, "data.value.mintProps.endTime", factoryState.endTime);
89
+ }
90
+ if (factoryState?.display) {
91
+ try {
92
+ const {
93
+ pathname: oldValue
94
+ } = new URL(factoryState.display, "http://localhost");
95
+ (0, _set.default)(factoryState, "display", replaceDynamicMountPoint({
96
+ src: oldValue,
97
+ splitKey: "/api/assets/preview/",
98
+ withAppUrl: true
99
+ }));
100
+ } catch (error) {}
101
+ }
102
+ } catch (error) {
103
+ _logger.default.error("parse stringify data error: ", error);
104
+ }
105
+ return factoryState;
106
+ };
107
+ exports.formatFactoryState = formatFactoryState;
@@ -0,0 +1,28 @@
1
+ import type { AssetFactoryState } from '@ocap/client';
2
+ export type TriggerUrlHookParams = {
3
+ factoryState: AssetFactoryState;
4
+ hookName: string;
5
+ bodyValue?: any;
6
+ };
7
+ export type NFTFactoryState = DeepAddPropertyString<AssetFactoryState, 'output.data.value', 'sn', string>;
8
+ /**
9
+ * 深度添加属性到指定路径的工具类型
10
+ * T: 原始类型
11
+ * P: 要添加属性的路径,用字符串数组表示
12
+ * K: 要添加的属性名
13
+ * V: 要添加的属性值类型
14
+ */
15
+ type DeepAddProperty<T, P extends string[], K extends string, V> = P extends [infer F, ...infer R] ? F extends keyof T ? {
16
+ [Key in keyof T]: Key extends F ? DeepAddProperty<T[Key], R extends string[] ? R : never, K, V> : T[Key];
17
+ } : T : T & {
18
+ [key in K]: V;
19
+ };
20
+ /**
21
+ * 辅助类型,用于创建字符串路径元组类型
22
+ */
23
+ type PathTuple<T extends string> = T extends `${infer F}.${infer R}` ? [F, ...PathTuple<R>] : [T];
24
+ /**
25
+ * 使用点号分隔的字符串路径版本
26
+ */
27
+ type DeepAddPropertyString<T, Path extends string, K extends string, V> = DeepAddProperty<T, PathTuple<Path>, K, V>;
28
+ export {};
@@ -0,0 +1 @@
1
+ "use strict";
@@ -0,0 +1,16 @@
1
+ import * as utils from './libs/utils';
2
+ declare const _default: {
3
+ env: {
4
+ [key: string]: any;
5
+ chainHost: string;
6
+ makerUrl: string | null;
7
+ blenderUrl: string | null;
8
+ storeUrl: string | null;
9
+ didSpaceEndpoint: string | null;
10
+ makerComponentInfo: any;
11
+ blenderComponentInfo: any;
12
+ storeComponentInfo: any;
13
+ };
14
+ utils: typeof utils;
15
+ };
16
+ export default _default;
@@ -0,0 +1,6 @@
1
+ import env from "./libs/env.js";
2
+ import * as utils from "./libs/utils.js";
3
+ export default {
4
+ env,
5
+ utils
6
+ };
@@ -0,0 +1,12 @@
1
+ declare let envMap: {
2
+ [key: string]: any;
3
+ chainHost: string;
4
+ makerUrl: string | null;
5
+ blenderUrl: string | null;
6
+ storeUrl: string | null;
7
+ didSpaceEndpoint: string | null;
8
+ makerComponentInfo: any;
9
+ blenderComponentInfo: any;
10
+ storeComponentInfo: any;
11
+ };
12
+ export default envMap;
@@ -0,0 +1,42 @@
1
+ import config from "@blocklet/sdk/lib/config";
2
+ import component from "@blocklet/sdk/lib/component";
3
+ import logger from "./logger.js";
4
+ let envMap = {};
5
+ const getComponentInfo = (did) => {
6
+ return config.components.find((item) => item.did === did) || {};
7
+ };
8
+ const updateEnv = () => {
9
+ logger.info("updating js sdk env");
10
+ envMap = {
11
+ ...config.env,
12
+ get chainHost() {
13
+ return config.env.CHAIN_HOST || process.env.CHAIN_HOST || "";
14
+ },
15
+ get makerUrl() {
16
+ return component.getComponentWebEndpoint("z8ia2birZzhjbXqKnxPUUivmqErdsf3724tr6");
17
+ },
18
+ get blenderUrl() {
19
+ return component.getComponentWebEndpoint("z8ia1ieY5KhEC4LMRETzS5nUwD7PvAND8qkfX");
20
+ },
21
+ get storeUrl() {
22
+ return component.getComponentWebEndpoint("z8iZqkCjLP6TZpR12tT3jESWxB8SGzNsx8nZa");
23
+ },
24
+ get makerComponentInfo() {
25
+ return getComponentInfo("z8ia2birZzhjbXqKnxPUUivmqErdsf3724tr6");
26
+ },
27
+ get blenderComponentInfo() {
28
+ return getComponentInfo("z8ia1ieY5KhEC4LMRETzS5nUwD7PvAND8qkfX");
29
+ },
30
+ get storeComponentInfo() {
31
+ return getComponentInfo("z8iZqkCjLP6TZpR12tT3jESWxB8SGzNsx8nZa");
32
+ },
33
+ get didSpaceEndpoint() {
34
+ return config.env.APP_SPACE_ENDPOINT || config.env.BLOCKLET_APP_SPACE_ENDPOINT || process.env.APP_SPACE_ENDPOINT || process.env.BLOCKLET_APP_SPACE_ENDPOINT;
35
+ }
36
+ };
37
+ };
38
+ updateEnv();
39
+ config.events.on(config.Events.envUpdate, () => {
40
+ updateEnv();
41
+ });
42
+ export default envMap;
@@ -0,0 +1,42 @@
1
+ declare const logger: {
2
+ log: (...args: any[]) => void;
3
+ info: (...args: any[]) => void;
4
+ warn: (...args: any[]) => void;
5
+ error: (...args: any[]) => void;
6
+ assert(condition?: boolean, ...data: any[]): void;
7
+ assert(value: any, message?: string, ...optionalParams: any[]): void;
8
+ clear(): void;
9
+ clear(): void;
10
+ count(label?: string): void;
11
+ count(label?: string): void;
12
+ countReset(label?: string): void;
13
+ countReset(label?: string): void;
14
+ debug(...data: any[]): void;
15
+ debug(message?: any, ...optionalParams: any[]): void;
16
+ dir(item?: any, options?: any): void;
17
+ dir(obj: any, options?: import("util").InspectOptions): void;
18
+ dirxml(...data: any[]): void;
19
+ dirxml(...data: any[]): void;
20
+ group(...data: any[]): void;
21
+ group(...label: any[]): void;
22
+ groupCollapsed(...data: any[]): void;
23
+ groupCollapsed(...label: any[]): void;
24
+ groupEnd(): void;
25
+ groupEnd(): void;
26
+ table(tabularData?: any, properties?: string[]): void;
27
+ table(tabularData: any, properties?: readonly string[]): void;
28
+ time(label?: string): void;
29
+ time(label?: string): void;
30
+ timeEnd(label?: string): void;
31
+ timeEnd(label?: string): void;
32
+ timeLog(label?: string, ...data: any[]): void;
33
+ timeLog(label?: string, ...data: any[]): void;
34
+ timeStamp(label?: string): void;
35
+ timeStamp(label?: string): void;
36
+ trace(...data: any[]): void;
37
+ trace(message?: any, ...optionalParams: any[]): void;
38
+ Console: console.ConsoleConstructor;
39
+ profile(label?: string): void;
40
+ profileEnd(label?: string): void;
41
+ };
42
+ export default logger;
@@ -0,0 +1,15 @@
1
+ const insertArgs = (method) => {
2
+ return (...args) => {
3
+ method.apply(console, args);
4
+ };
5
+ };
6
+ const logger = {
7
+ ...console,
8
+ // eslint-disable-next-line no-console
9
+ log: insertArgs(console.log),
10
+ // eslint-disable-next-line no-console
11
+ info: insertArgs(console.info),
12
+ warn: insertArgs(console.warn),
13
+ error: insertArgs(console.error)
14
+ };
15
+ export default logger;
@@ -0,0 +1,55 @@
1
+ import type { TriggerUrlHookParams, NFTFactoryState } from '../types';
2
+ export declare const makerExist: () => boolean;
3
+ export declare const blenderExist: () => boolean;
4
+ export declare const storeExist: () => boolean;
5
+ export declare const triggerUrlHook: ({ factoryState, hookName, bodyValue }?: TriggerUrlHookParams) => Promise<null>;
6
+ export declare const shouldTriggerPreMintFactory: (factoryState: NFTFactoryState) => boolean;
7
+ export declare function replaceDynamicMountPoint({ src, splitKey, withAppUrl }?: {
8
+ src: string;
9
+ splitKey: string;
10
+ withAppUrl?: boolean;
11
+ }): string;
12
+ export declare const formatFactoryState: (factoryState: NFTFactoryState & {
13
+ loading?: boolean;
14
+ endTime?: string;
15
+ display?: string;
16
+ }) => {
17
+ address: string;
18
+ owner: string;
19
+ name: string;
20
+ description: string;
21
+ settlement: string;
22
+ limit: number;
23
+ trustedIssuers: string[];
24
+ input: GraphQLClient.IndexedFactoryInput;
25
+ output: {
26
+ moniker: string;
27
+ data: {
28
+ typeUrl: string;
29
+ value: string & {
30
+ sn: string;
31
+ };
32
+ };
33
+ readonly: boolean;
34
+ transferrable: boolean;
35
+ ttl: number;
36
+ parent: string;
37
+ address: string;
38
+ issuer: string;
39
+ endpoint: GraphQLClient.NFTEndpoint;
40
+ display: GraphQLClient.NFTDisplay;
41
+ tags: string[];
42
+ };
43
+ hooks: GraphQLClient.AssetFactoryHook[];
44
+ data: GraphQLClient.Any;
45
+ context: GraphQLClient.StateContext;
46
+ balance: string;
47
+ tokens: GraphQLClient.IndexedTokenInput[];
48
+ numMinted: number;
49
+ display: GraphQLClient.NFTDisplay;
50
+ lastSettlement: string;
51
+ } & {
52
+ loading?: boolean;
53
+ endTime?: string;
54
+ display?: string;
55
+ };
@@ -0,0 +1,77 @@
1
+ import axios from "axios";
2
+ import set from "lodash/set";
3
+ import { joinURL } from "ufo";
4
+ import { BlockletStatus } from "@blocklet/constant";
5
+ import env from "./env.js";
6
+ import logger from "./logger.js";
7
+ export const makerExist = () => !!env.makerUrl && env.makerComponentInfo?.status === BlockletStatus.running;
8
+ export const blenderExist = () => !!env.blenderUrl && env.blenderComponentInfo?.status === BlockletStatus.running;
9
+ export const storeExist = () => !!env.storeUrl && env.storeComponentInfo?.status === BlockletStatus.running;
10
+ export const triggerUrlHook = async ({ factoryState, hookName, bodyValue = {} } = {}) => {
11
+ const { hooks } = factoryState;
12
+ const hookItem = hooks.find((x) => x.name === hookName && x.type === "url");
13
+ let hookValue = null;
14
+ if (hookItem) {
15
+ try {
16
+ const { data } = await axios.post(hookItem.hook, bodyValue);
17
+ logger.info(`auth.hook:success:${hookName}`, { hook: hookItem.hook, bodyValue });
18
+ hookValue = data;
19
+ } catch (err) {
20
+ logger.error(`auth.hook:error:${hookName}`, err);
21
+ throw err;
22
+ }
23
+ }
24
+ return hookValue;
25
+ };
26
+ export const shouldTriggerPreMintFactory = (factoryState) => {
27
+ return factoryState?.output?.data?.value?.sn === "{{input.sn}}";
28
+ };
29
+ export function replaceDynamicMountPoint({ src = "", splitKey = "", withAppUrl = false } = {}) {
30
+ try {
31
+ const startWithCurrentMountPoint = src?.startsWith(joinURL(env.blenderComponentInfo.mountPoint, "/"));
32
+ if (!splitKey || !src || startWithCurrentMountPoint) {
33
+ return src;
34
+ }
35
+ const [, ...afterPathList] = src.split(splitKey);
36
+ const newPath = joinURL(env.blenderComponentInfo.mountPoint, splitKey, afterPathList.join(splitKey));
37
+ if (withAppUrl) {
38
+ return joinURL(env.appUrl, newPath);
39
+ }
40
+ return newPath;
41
+ } catch (error) {
42
+ }
43
+ if (withAppUrl) {
44
+ return joinURL(env.appUrl, src);
45
+ }
46
+ return src;
47
+ }
48
+ export const formatFactoryState = (factoryState) => {
49
+ if (factoryState.loading) {
50
+ return factoryState;
51
+ }
52
+ try {
53
+ if (typeof factoryState?.output?.data?.value === "string") {
54
+ set(factoryState, "output.data.value", JSON.parse(factoryState?.output?.data?.value));
55
+ }
56
+ if (typeof factoryState?.data?.value === "string") {
57
+ set(factoryState, "data.value", JSON.parse(factoryState?.data.value));
58
+ }
59
+ if (factoryState.endTime) {
60
+ set(factoryState, "data.value.mintProps.endTime", factoryState.endTime);
61
+ }
62
+ if (factoryState?.display) {
63
+ try {
64
+ const { pathname: oldValue } = new URL(factoryState.display, "http://localhost");
65
+ set(
66
+ factoryState,
67
+ "display",
68
+ replaceDynamicMountPoint({ src: oldValue, splitKey: "/api/assets/preview/", withAppUrl: true })
69
+ );
70
+ } catch (error) {
71
+ }
72
+ }
73
+ } catch (error) {
74
+ logger.error("parse stringify data error: ", error);
75
+ }
76
+ return factoryState;
77
+ };
@@ -0,0 +1,28 @@
1
+ import type { AssetFactoryState } from '@ocap/client';
2
+ export type TriggerUrlHookParams = {
3
+ factoryState: AssetFactoryState;
4
+ hookName: string;
5
+ bodyValue?: any;
6
+ };
7
+ export type NFTFactoryState = DeepAddPropertyString<AssetFactoryState, 'output.data.value', 'sn', string>;
8
+ /**
9
+ * 深度添加属性到指定路径的工具类型
10
+ * T: 原始类型
11
+ * P: 要添加属性的路径,用字符串数组表示
12
+ * K: 要添加的属性名
13
+ * V: 要添加的属性值类型
14
+ */
15
+ type DeepAddProperty<T, P extends string[], K extends string, V> = P extends [infer F, ...infer R] ? F extends keyof T ? {
16
+ [Key in keyof T]: Key extends F ? DeepAddProperty<T[Key], R extends string[] ? R : never, K, V> : T[Key];
17
+ } : T : T & {
18
+ [key in K]: V;
19
+ };
20
+ /**
21
+ * 辅助类型,用于创建字符串路径元组类型
22
+ */
23
+ type PathTuple<T extends string> = T extends `${infer F}.${infer R}` ? [F, ...PathTuple<R>] : [T];
24
+ /**
25
+ * 使用点号分隔的字符串路径版本
26
+ */
27
+ type DeepAddPropertyString<T, Path extends string, K extends string, V> = DeepAddProperty<T, PathTuple<Path>, K, V>;
28
+ export {};
File without changes
package/package.json ADDED
@@ -0,0 +1,63 @@
1
+ {
2
+ "name": "@nft-studio/js",
3
+ "version": "0.1.0",
4
+ "description": "Node.js client for NFT Studio",
5
+ "keywords": [
6
+ "types",
7
+ "stripe"
8
+ ],
9
+ "author": "wangshijun <wangshijun2010@gmail.com>",
10
+ "homepage": "https://github.com/blocklet/nft-studio#readme",
11
+ "license": "Apache-2.0",
12
+ "main": "lib/index.js",
13
+ "typings": "lib/index.d.ts",
14
+ "files": [
15
+ "lib",
16
+ "LICENSE",
17
+ "package.json",
18
+ "README.md"
19
+ ],
20
+ "exports": {
21
+ ".": {
22
+ "require": "./lib/cjs/index.js",
23
+ "import": "./lib/es/index.js",
24
+ "types": "./lib/cjs/index.d.ts"
25
+ }
26
+ },
27
+ "publishConfig": {
28
+ "access": "public"
29
+ },
30
+ "repository": {
31
+ "type": "git",
32
+ "url": "git+https://github.com/blocklet/nft-studio.git"
33
+ },
34
+ "bugs": {
35
+ "url": "https://github.com/blocklet/nft-studio/issues"
36
+ },
37
+ "dependencies": {
38
+ "@blocklet/constant": "^1.16.28",
39
+ "@blocklet/sdk": "^1.16.28",
40
+ "axios": "^1.7.2",
41
+ "lodash": "^4.17.21",
42
+ "ufo": "^1.5.3"
43
+ },
44
+ "devDependencies": {
45
+ "@arcblock/eslint-config": "^0.3.2",
46
+ "@arcblock/eslint-config-ts": "^0.3.2",
47
+ "@types/lodash": "^4.17.4",
48
+ "@types/node": "^18.19.34",
49
+ "eslint": "^8.57.0",
50
+ "prettier": "^3.3.2",
51
+ "type-fest": "^4.19.0",
52
+ "typescript": "^5.5.3",
53
+ "unbuild": "^2.0.0"
54
+ },
55
+ "scripts": {
56
+ "lint": "eslint src",
57
+ "lint:fix": "npm run lint -- --fix",
58
+ "clean": "rm -fr lib",
59
+ "prebuild": "npm run clean",
60
+ "build": "unbuild",
61
+ "build:watch": "npx nodemon --ext 'ts,tsx,json,js,jsx' --exec 'npm run build' --ignore 'lib/*'"
62
+ }
63
+ }