@dxos/plugin-template 0.4.7-main.7a94090

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.
Files changed (51) hide show
  1. package/.eslintrc.js +9 -0
  2. package/LICENSE +8 -0
  3. package/README.md +21 -0
  4. package/dist/package.json +41 -0
  5. package/dist/src/dev/main.tsx.t.d.ts +49 -0
  6. package/dist/src/dev/main.tsx.t.d.ts.map +1 -0
  7. package/dist/src/dev/main.tsx.t.js +82 -0
  8. package/dist/src/dev/main.tsx.t.js.map +1 -0
  9. package/dist/src/dev/translations.d.ts +21 -0
  10. package/dist/src/dev/translations.d.ts.map +1 -0
  11. package/dist/src/dev/translations.js +27 -0
  12. package/dist/src/dev/translations.js.map +1 -0
  13. package/dist/src/package.json.t.d.ts +54 -0
  14. package/dist/src/package.json.t.d.ts.map +1 -0
  15. package/dist/src/package.json.t.js +102 -0
  16. package/dist/src/package.json.t.js.map +1 -0
  17. package/dist/src/src/plugin.tsx.t.d.ts +49 -0
  18. package/dist/src/src/plugin.tsx.t.d.ts.map +1 -0
  19. package/dist/src/src/plugin.tsx.t.js +68 -0
  20. package/dist/src/src/plugin.tsx.t.js.map +1 -0
  21. package/dist/src/template.t.d.ts +16 -0
  22. package/dist/src/template.t.d.ts.map +1 -0
  23. package/dist/src/template.t.js +25 -0
  24. package/dist/src/template.t.js.map +1 -0
  25. package/dist/src/utils.t/packageJson.d.ts +6 -0
  26. package/dist/src/utils.t/packageJson.d.ts.map +1 -0
  27. package/dist/src/utils.t/packageJson.js +6 -0
  28. package/dist/src/utils.t/packageJson.js.map +1 -0
  29. package/dist/src/vite.config.ts.t.d.ts +49 -0
  30. package/dist/src/vite.config.ts.t.d.ts.map +1 -0
  31. package/dist/src/vite.config.ts.t.js +77 -0
  32. package/dist/src/vite.config.ts.t.js.map +1 -0
  33. package/dist/test/scenarios.d.ts +4 -0
  34. package/dist/test/scenarios.d.ts.map +1 -0
  35. package/dist/test/scenarios.js +19 -0
  36. package/dist/test/scenarios.js.map +1 -0
  37. package/dist/test/template.test.d.ts +2 -0
  38. package/dist/test/template.test.d.ts.map +1 -0
  39. package/dist/test/template.test.js +61 -0
  40. package/dist/test/template.test.js.map +1 -0
  41. package/package.json +41 -0
  42. package/project.json +25 -0
  43. package/src/package.json.t.ts +107 -0
  44. package/src/src/plugin.tsx.t.ts +63 -0
  45. package/src/template.t.ts +20 -0
  46. package/src/utils.t/packageJson.ts +7 -0
  47. package/src/vite.config.ts.t.ts +72 -0
  48. package/test/scenarios.ts +20 -0
  49. package/test/template.test.ts +40 -0
  50. package/tsconfig.json +34 -0
  51. package/tsconfig.plate.json +15 -0
@@ -0,0 +1,49 @@
1
+ declare const _default: {
2
+ (options: import("@dxos/plate").Options<{
3
+ name: string;
4
+ createFolder: boolean;
5
+ defaultPlugins: boolean;
6
+ }, import("@dxos/plate").SlotsWithContext<{
7
+ name: string;
8
+ createFolder: boolean;
9
+ defaultPlugins: boolean;
10
+ }, {}, Required<Omit<import("@dxos/plate").Options<{
11
+ name: string;
12
+ createFolder: boolean;
13
+ defaultPlugins: boolean;
14
+ }, {}>, "slots" | "input">> & {
15
+ input: {
16
+ name: string;
17
+ createFolder: boolean;
18
+ defaultPlugins: boolean;
19
+ };
20
+ outputFile: string;
21
+ slots: import("@dxos/plate").SlotProducers<{}>;
22
+ inherited: import("@dxos/plate").FileResults<{
23
+ name: string;
24
+ createFolder: boolean;
25
+ defaultPlugins: boolean;
26
+ }, import("@dxos/plate").FileSlots<{
27
+ name: string;
28
+ createFolder: boolean;
29
+ defaultPlugins: boolean;
30
+ }>> | undefined;
31
+ } & {
32
+ imports: {
33
+ (): (relativeTo?: (string | string[]) | undefined) => string;
34
+ use: {
35
+ (name: string, from: string | string[], o?: {
36
+ aliasOf?: string | undefined;
37
+ isDefault?: boolean | undefined;
38
+ } | undefined): () => string;
39
+ (names: string[], from: string | string[], o?: {
40
+ aliasOf?: string | undefined;
41
+ isDefault?: boolean | undefined;
42
+ } | undefined): Record<string, () => string>;
43
+ };
44
+ };
45
+ }>>): Promise<import("@dxos/plate").FileResults<any, import("@dxos/plate").FileSlots<any>>>;
46
+ slots: {};
47
+ };
48
+ export default _default;
49
+ //# sourceMappingURL=vite.config.ts.t.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.config.ts.t.d.ts","sourceRoot":"","sources":["../../src/vite.config.ts.t.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,wBAoEE"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const template_t_1 = __importDefault(require("./template.t"));
7
+ const plate_1 = require("@dxos/plate");
8
+ exports.default = template_t_1.default.define.script({
9
+ content: ({ input: { defaultPlugins } }) => {
10
+ return (0, plate_1.plate /* javascript */) `
11
+ import { defineConfig } from "vite";
12
+ import { resolve } from "path";
13
+ import react from "@vitejs/plugin-react";
14
+ import { ThemePlugin } from "@dxos/react-ui-theme/plugin";
15
+
16
+ ${defaultPlugins && (0, plate_1.plate /* javascript */) `
17
+ import { ConfigPlugin } from "@dxos/config/vite-plugin";
18
+ import TopLevelAwaitPlugin from 'vite-plugin-top-level-await';
19
+ import WasmPlugin from 'vite-plugin-wasm';
20
+ `}
21
+
22
+ // https://vitejs.dev/config/
23
+ export default defineConfig({
24
+ server: {
25
+ host: true,
26
+ },
27
+ root: 'dev',
28
+ build: { outDir: "dev/out", target: "esnext" },
29
+ optimizeDeps: { esbuildOptions: { target: "esnext" } },
30
+ define: {
31
+ process: {
32
+ env: {
33
+ NODE_ENV: JSON.stringify(process.env.NODE_ENV),
34
+ },
35
+ },
36
+ },
37
+ plugins: [
38
+ react(),
39
+ ThemePlugin({
40
+ root: __dirname + '/dev',
41
+ content: [
42
+ resolve(__dirname, "./dev/index.html"),
43
+ resolve(__dirname, "./src/**/*.{js,ts,jsx,tsx}"),
44
+ resolve(__dirname, "./dev/**/*.{js,ts,jsx,tsx}"),
45
+ ${defaultPlugins && (0, plate_1.plate /* javascript */) `
46
+ resolve(__dirname, "node_modules/@dxos/react-ui/dist/**/*.mjs"),
47
+ resolve(__dirname, "node_modules/@dxos/react-ui-theme/dist/**/*.mjs"),
48
+ resolve(
49
+ __dirname,
50
+ "node_modules/@dxos/react-ui-mosaic/dist/lib/**/*.mjs"
51
+ ),
52
+ resolve(
53
+ __dirname,
54
+ "node_modules/@dxos/react-ui-stack/dist/lib/**/*.mjs"
55
+ ),
56
+ resolve(
57
+ __dirname,
58
+ "node_modules/@dxos/react-ui-navtree/dist/lib/**/*.mjs"
59
+ ),
60
+ resolve(
61
+ __dirname,
62
+ "node_modules/@braneframe/plugin-*/dist/lib/**/*.mjs"
63
+ ),
64
+ `}
65
+ ],
66
+ }),
67
+ ${defaultPlugins && (0, plate_1.plate /* javascript */) `
68
+ ConfigPlugin(),
69
+ TopLevelAwaitPlugin(),
70
+ WasmPlugin(),
71
+ `}
72
+ ],
73
+ });
74
+ `;
75
+ }
76
+ });
77
+ //# sourceMappingURL=vite.config.ts.t.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vite.config.ts.t.js","sourceRoot":"","sources":["../../src/vite.config.ts.t.ts"],"names":[],"mappings":";;;;;AAAA,8DAAoC;AACpC,uCAAoC;AAEpC,kBAAe,oBAAQ,CAAC,MAAM,CAAC,MAAM,CAAC;IACpC,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,EAAE;QACzC,OAAO,IAAA,aAAK,CAAA,gBAAgB,EAAA;;;;;;QAMxB,cAAc,IAAI,IAAA,aAAK,CAAA,gBAAgB,EAAA;;;;OAIxC;;;;;;;;;;;;;;;;;;;;;;;;;gBAyBS,cAAc,IAAI,IAAA,aAAK,CAAA,gBAAgB,EAAA;;;;;;;;;;;;;;;;;;;eAmBxC;;;YAGH,cAAc,IAAI,IAAA,aAAK,CAAA,gBAAgB,EAAA;;;;WAIxC;;;KAGN,CAAA;IACH,CAAC;CACF,CAAC,CAAA"}
@@ -0,0 +1,4 @@
1
+ import { type InputOf } from '@dxos/plate';
2
+ import type template from '../src/template.t';
3
+ export declare const scenarios: InputOf<typeof template>[];
4
+ //# sourceMappingURL=scenarios.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenarios.d.ts","sourceRoot":"","sources":["../../test/scenarios.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,aAAa,CAAC;AAE3C,OAAO,KAAK,QAAQ,MAAM,mBAAmB,CAAC;AAE9C,eAAO,MAAM,SAAS,EAAE,OAAO,CAAC,OAAO,QAAQ,CAAC,EAW/C,CAAC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ //
3
+ // Copyright 2023 DXOS.org
4
+ //
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.scenarios = void 0;
7
+ exports.scenarios = [
8
+ {
9
+ name: 'default',
10
+ createFolder: true,
11
+ defaultPlugins: true,
12
+ },
13
+ {
14
+ name: 'default-bare',
15
+ createFolder: true,
16
+ defaultPlugins: false,
17
+ },
18
+ ];
19
+ //# sourceMappingURL=scenarios.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scenarios.js","sourceRoot":"","sources":["../../test/scenarios.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;AAMW,QAAA,SAAS,GAA+B;IACnD;QACE,IAAI,EAAE,SAAS;QACf,YAAY,EAAE,IAAI;QAClB,cAAc,EAAE,IAAI;KACrB;IACD;QACE,IAAI,EAAE,cAAc;QACpB,YAAY,EAAE,IAAI;QAClB,cAAc,EAAE,KAAK;KACtB;CACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=template.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.test.d.ts","sourceRoot":"","sources":["../../test/template.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ //
3
+ // Copyright 2023 DXOS.org
4
+ //
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
17
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
18
+ }) : function(o, v) {
19
+ o["default"] = v;
20
+ });
21
+ var __importStar = (this && this.__importStar) || function (mod) {
22
+ if (mod && mod.__esModule) return mod;
23
+ var result = {};
24
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
25
+ __setModuleDefault(result, mod);
26
+ return result;
27
+ };
28
+ var __importDefault = (this && this.__importDefault) || function (mod) {
29
+ return (mod && mod.__esModule) ? mod : { "default": mod };
30
+ };
31
+ Object.defineProperty(exports, "__esModule", { value: true });
32
+ const chai_1 = __importStar(require("chai"));
33
+ const chai_as_promised_1 = __importDefault(require("chai-as-promised"));
34
+ const path_1 = __importDefault(require("path"));
35
+ const tmp_promise_1 = __importDefault(require("tmp-promise"));
36
+ const scenarios_1 = require("./scenarios");
37
+ const package_json_1 = __importDefault(require("../package.json"));
38
+ const template_t_1 = __importDefault(require("../src/template.t"));
39
+ chai_1.default.use(chai_as_promised_1.default);
40
+ describe('plugin template', () => {
41
+ it('exists', () => {
42
+ (0, chai_1.expect)(true).to.be.true;
43
+ });
44
+ it('execute with permuted inputs', async () => {
45
+ console.log('executing', scenarios_1.scenarios.length, 'scenarios...');
46
+ const tempFolder = await tmp_promise_1.default.dir({ unsafeCleanup: false, keep: true, prefix: 'plugin-template' });
47
+ const promises = scenarios_1.scenarios.map(async (scenario) => {
48
+ const outputDirectory = path_1.default.resolve(tempFolder.path);
49
+ const results = await template_t_1.default.apply({
50
+ input: { ...scenario, name: `${package_json_1.default.name.split('/')[1]}-${scenario.name}` },
51
+ outputDirectory,
52
+ after: false, // do not print messages
53
+ });
54
+ return await results.apply();
55
+ });
56
+ await Promise.all(promises);
57
+ console.log('done executing scenarios');
58
+ console.log(`temp folder: ${tempFolder.path}`);
59
+ });
60
+ });
61
+ //# sourceMappingURL=template.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.test.js","sourceRoot":"","sources":["../../test/template.test.ts"],"names":[],"mappings":";AAAA,EAAE;AACF,0BAA0B;AAC1B,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEF,6CAAoC;AACpC,wEAA8C;AAC9C,gDAAwB;AACxB,8DAA8B;AAE9B,2CAAwC;AACxC,mEAA0C;AAC1C,mEAAyC;AAEzC,cAAI,CAAC,GAAG,CAAC,0BAAc,CAAC,CAAC;AAEzB,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;IAC/B,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;QAChB,IAAA,aAAM,EAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,8BAA8B,EAAE,KAAK,IAAI,EAAE;QAC5C,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,qBAAS,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;QAC3D,MAAM,UAAU,GAAG,MAAM,qBAAG,CAAC,GAAG,CAAC,EAAE,aAAa,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;QAElG,MAAM,QAAQ,GAAG,qBAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;YAChD,MAAM,eAAe,GAAG,cAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAEtD,MAAM,OAAO,GAAG,MAAM,oBAAQ,CAAC,KAAK,CAAC;gBACnC,KAAK,EAAE,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,GAAG,sBAAW,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE;gBAClF,eAAe;gBACf,KAAK,EAAE,KAAK,EAAE,wBAAwB;aACvC,CAAC,CAAC;YAEH,OAAO,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;QAC/B,CAAC,CAAC,CAAC;QACH,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5B,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,gBAAgB,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@dxos/plugin-template",
3
+ "version": "0.4.7-main.7a94090",
4
+ "description": "An template project for prototyping plugins for the DXOS app framework.",
5
+ "keywords": [
6
+ "dxos",
7
+ "plugin",
8
+ "template",
9
+ "composer",
10
+ "local-first",
11
+ "offline",
12
+ "multiplayer"
13
+ ],
14
+ "homepage": "https://dxos.org",
15
+ "bugs": "https://github.com/dxos/dxos/issues",
16
+ "license": "MIT",
17
+ "author": "info@dxos.org",
18
+ "main": "dist/src/template.t.js",
19
+ "types": "dist/src/template.t.d.ts",
20
+ "dependencies": {
21
+ "lodash.merge": "^4.6.2",
22
+ "sanitize-filename": "1.6.3",
23
+ "@dxos/plate": "0.4.7-main.7a94090"
24
+ },
25
+ "devDependencies": {
26
+ "@phosphor-icons/react": "^2.0.5",
27
+ "@types/lodash.merge": "^4.6.6",
28
+ "tmp-promise": "^3.0.3",
29
+ "ts-node": "10.9.1",
30
+ "types-package-json": "^2.0.39",
31
+ "typescript": "^5.2.2",
32
+ "@dxos/app-framework": "0.4.7-main.7a94090"
33
+ },
34
+ "publishConfig": {
35
+ "access": "public"
36
+ },
37
+ "scripts": {
38
+ "build": "tsc",
39
+ "out": "plate ../bare-template/src --output=out --verbose"
40
+ }
41
+ }
package/project.json ADDED
@@ -0,0 +1,25 @@
1
+ {
2
+ "$schema": "../../../../node_modules/nx/schemas/project-schema.json",
3
+ "name": "plugin-template",
4
+ "sourceRoot": "packages/apps/templates/plugin-template/src",
5
+ "projectType": "library",
6
+ "targets": {
7
+ "build": {
8
+ "options": {
9
+ "main": "packages/apps/templates/plugin-template/src/config.t.ts",
10
+ "outputPath": "packages/apps/templates/plugin-template/dist",
11
+ "tsConfig": "packages/apps/templates/plugin-template/tsconfig.json"
12
+ }
13
+ },
14
+ "lint": {},
15
+ "test": {
16
+ "options": {
17
+ "checkLeaks": false,
18
+ "ciEnvironments": [
19
+ "nodejs"
20
+ ],
21
+ "forceExit": true
22
+ }
23
+ }
24
+ }
25
+ }
@@ -0,0 +1,107 @@
1
+ //
2
+ // Copyright 2022 DXOS.org
3
+ //
4
+ import path from 'path';
5
+ import { promises as fs } from 'fs';
6
+ import { InputOf, Slot } from '@dxos/plate';
7
+ import { PackageJson } from './utils.t/packageJson';
8
+
9
+ import merge from 'lodash.merge';
10
+
11
+ import template from './template.t';
12
+
13
+ type Context = { version: string } & InputOf<typeof template>;
14
+
15
+ export namespace Features {
16
+ export const react = (): Partial<PackageJson> => ({
17
+ dependencies: {
18
+ react: '^18.2.0',
19
+ 'react-dom': '^18.2.0',
20
+ },
21
+ devDependencies: {
22
+ '@types/react': '~18.2.0',
23
+ '@types/react-dom': '~18.2.0',
24
+ '@vitejs/plugin-react': '^4.2.1',
25
+ },
26
+ });
27
+
28
+ export const dxosUi = (): Partial<PackageJson> => ({
29
+ dependencies: {
30
+ '@phosphor-icons/react': '^2.0.5',
31
+ },
32
+ devDependencies: {
33
+ '@dxos/react-ui': '^0.4.6',
34
+ '@dxos/react-ui-theme': '^0.4.6',
35
+ },
36
+ });
37
+
38
+ export const defaultPlugins = (): Partial<PackageJson> => ({
39
+ devDependencies: {
40
+ 'vite-plugin-top-level-await': '^1.3.1',
41
+ 'vite-plugin-wasm': '^3.3.0',
42
+ '@dxos/config': '^0.4.6',
43
+ '@braneframe/plugin-space': '^0.4.6',
44
+ '@braneframe/plugin-navtree': '^0.4.6',
45
+ '@braneframe/plugin-layout': '^0.4.6',
46
+ '@braneframe/plugin-graph': '^0.4.6',
47
+ '@braneframe/plugin-client': '^0.4.6',
48
+ '@braneframe/plugin-stack': '^0.4.6',
49
+ },
50
+ });
51
+ }
52
+
53
+ export const base = ({ name, version }: Context): Partial<PackageJson> => {
54
+ return {
55
+ name,
56
+ version: version,
57
+ description: `${name} - a composer plugin`,
58
+ private: true,
59
+ main: 'dist/index.js',
60
+ types: 'dist/index.d.ts',
61
+ scripts: {
62
+ build: 'tsc',
63
+ dev: 'vite',
64
+ },
65
+ dependencies: {
66
+ '@preact/signals-react': '^1.3.6',
67
+ "@dxos/app-framework": "0.4.6",
68
+ },
69
+ devDependencies: {
70
+ '@types/node': '^18.11.9',
71
+ typescript: '^5.0.4',
72
+ vite: '^5.1.3',
73
+ '@braneframe/plugin-theme': '^0.4.6',
74
+ },
75
+ };
76
+ };
77
+
78
+ const loadJson = async (moduleRelativePath: string) => {
79
+ const content = await fs.readFile(path.resolve(__dirname, moduleRelativePath));
80
+ return JSON.parse(content.toString());
81
+ };
82
+
83
+ export default template.define
84
+ .slots<{ packageJson?: Slot<Partial<PackageJson>, InputOf<typeof template>, { depVersion?: string }> }>({
85
+ packageJson: {},
86
+ })
87
+ .text({
88
+ content: async ({ input, slots: { packageJson: slotPackageJson } }) => {
89
+ const context = {
90
+ version: '0.0.1',
91
+ ...input,
92
+ };
93
+
94
+ const [first, ...rest] = [
95
+ base(context),
96
+ Features.react(),
97
+ Features.dxosUi(),
98
+ input.defaultPlugins && Features.defaultPlugins(),
99
+ slotPackageJson?.() ?? {},
100
+ ].filter(Boolean);
101
+
102
+ const packageJson = merge(first, ...rest);
103
+
104
+ const result = JSON.stringify(packageJson, null, 2);
105
+ return result;
106
+ },
107
+ });
@@ -0,0 +1,63 @@
1
+ import { plate } from "@dxos/plate";
2
+ import template from "../template.t";
3
+
4
+ export default template.define.script({
5
+ content: ({ input: { name }, imports }) => plate/* javascript */`
6
+ ${imports}
7
+ import React from 'react';
8
+ import { Asterisk } from '@phosphor-icons/react';
9
+
10
+ import {
11
+ PluginDefinition,
12
+ type SurfaceProvides,
13
+ type GraphBuilderProvides,
14
+ type IntentResolverProvides,
15
+ type TranslationsProvides,
16
+ pluginMeta,
17
+ } from '@dxos/app-framework';
18
+
19
+ export const PLUGIN_ID = '${name}';
20
+
21
+ export const meta = pluginMeta({
22
+ id: PLUGIN_ID,
23
+ name: "",
24
+ iconComponent: Asterisk,
25
+ });
26
+
27
+ export type TemplatePluginProvides = SurfaceProvides &
28
+ IntentResolverProvides &
29
+ GraphBuilderProvides &
30
+ TranslationsProvides & {};
31
+
32
+ /**
33
+ * See https://docs.dxos.org/composer/plugins/definition
34
+ */
35
+ const plugin = (): PluginDefinition<TemplatePluginProvides> => {
36
+ return {
37
+ meta,
38
+ provides: {
39
+ root: () => null,
40
+ surface: {
41
+ component: ({ data, role }) => null,
42
+ },
43
+ intent: {
44
+ resolver: (intent) => {},
45
+ },
46
+ graph: {
47
+ builder: ({ parent, plugins }) => {},
48
+ },
49
+ translations: [
50
+ {
51
+ 'en-US': {
52
+ [PLUGIN_ID]: {
53
+ 'plugin name': 'Template',
54
+ },
55
+ },
56
+ },
57
+ ],
58
+ },
59
+ };
60
+ };
61
+ export default plugin;
62
+ `
63
+ })
@@ -0,0 +1,20 @@
1
+ import { z, interactiveDirectory } from '@dxos/plate';
2
+ import sanitize from 'sanitize-filename';
3
+ import path from 'path';
4
+
5
+ export default interactiveDirectory({
6
+ src: __filename.endsWith('.ts') ? __dirname : path.resolve(__dirname, '../../src'),
7
+ inputShape: z.object({
8
+ name: z.string().describe('Name the new package').default(path.basename(process.cwd())),
9
+ createFolder: z.boolean().describe('Create a new folder for the project').default(true),
10
+ defaultPlugins: z.boolean().describe('Include default plugins').default(true),
11
+ }),
12
+ options({ input, outputDirectory, ...rest }) {
13
+ const { name, createFolder } = {...input};
14
+ return {
15
+ input,
16
+ outputDirectory: createFolder ? path.resolve(outputDirectory, sanitize(name ?? '')) : outputDirectory,
17
+ ...rest,
18
+ };
19
+ },
20
+ });
@@ -0,0 +1,7 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { type PackageJson as _PackageJson } from 'types-package-json';
6
+
7
+ export type PackageJson = _PackageJson & { private: boolean; types: string };
@@ -0,0 +1,72 @@
1
+ import template from './template.t';
2
+ import { plate } from '@dxos/plate';
3
+
4
+ export default template.define.script({
5
+ content: ({ input: { defaultPlugins } }) => {
6
+ return plate/* javascript */`
7
+ import { defineConfig } from "vite";
8
+ import { resolve } from "path";
9
+ import react from "@vitejs/plugin-react";
10
+ import { ThemePlugin } from "@dxos/react-ui-theme/plugin";
11
+
12
+ ${defaultPlugins && plate/* javascript */`
13
+ import { ConfigPlugin } from "@dxos/config/vite-plugin";
14
+ import TopLevelAwaitPlugin from 'vite-plugin-top-level-await';
15
+ import WasmPlugin from 'vite-plugin-wasm';
16
+ `}
17
+
18
+ // https://vitejs.dev/config/
19
+ export default defineConfig({
20
+ server: {
21
+ host: true,
22
+ },
23
+ root: 'dev',
24
+ build: { outDir: "dev/out", target: "esnext" },
25
+ optimizeDeps: { esbuildOptions: { target: "esnext" } },
26
+ define: {
27
+ process: {
28
+ env: {
29
+ NODE_ENV: JSON.stringify(process.env.NODE_ENV),
30
+ },
31
+ },
32
+ },
33
+ plugins: [
34
+ react(),
35
+ ThemePlugin({
36
+ root: __dirname + '/dev',
37
+ content: [
38
+ resolve(__dirname, "./dev/index.html"),
39
+ resolve(__dirname, "./src/**/*.{js,ts,jsx,tsx}"),
40
+ resolve(__dirname, "./dev/**/*.{js,ts,jsx,tsx}"),
41
+ ${defaultPlugins && plate/* javascript */`
42
+ resolve(__dirname, "node_modules/@dxos/react-ui/dist/**/*.mjs"),
43
+ resolve(__dirname, "node_modules/@dxos/react-ui-theme/dist/**/*.mjs"),
44
+ resolve(
45
+ __dirname,
46
+ "node_modules/@dxos/react-ui-mosaic/dist/lib/**/*.mjs"
47
+ ),
48
+ resolve(
49
+ __dirname,
50
+ "node_modules/@dxos/react-ui-stack/dist/lib/**/*.mjs"
51
+ ),
52
+ resolve(
53
+ __dirname,
54
+ "node_modules/@dxos/react-ui-navtree/dist/lib/**/*.mjs"
55
+ ),
56
+ resolve(
57
+ __dirname,
58
+ "node_modules/@braneframe/plugin-*/dist/lib/**/*.mjs"
59
+ ),
60
+ `}
61
+ ],
62
+ }),
63
+ ${defaultPlugins && plate/* javascript */`
64
+ ConfigPlugin(),
65
+ TopLevelAwaitPlugin(),
66
+ WasmPlugin(),
67
+ `}
68
+ ],
69
+ });
70
+ `
71
+ }
72
+ })
@@ -0,0 +1,20 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { type InputOf } from '@dxos/plate';
6
+
7
+ import type template from '../src/template.t';
8
+
9
+ export const scenarios: InputOf<typeof template>[] = [
10
+ {
11
+ name: 'default',
12
+ createFolder: true,
13
+ defaultPlugins: true,
14
+ },
15
+ {
16
+ name: 'default-bare',
17
+ createFolder: true,
18
+ defaultPlugins: false,
19
+ },
20
+ ];
@@ -0,0 +1,40 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import chai, { expect } from 'chai';
6
+ import chaiAsPromised from 'chai-as-promised';
7
+ import path from 'path';
8
+ import tmp from 'tmp-promise';
9
+
10
+ import { scenarios } from './scenarios';
11
+ import packageJson from '../package.json';
12
+ import template from '../src/template.t';
13
+
14
+ chai.use(chaiAsPromised);
15
+
16
+ describe('plugin template', () => {
17
+ it('exists', () => {
18
+ expect(true).to.be.true;
19
+ });
20
+
21
+ it('execute with permuted inputs', async () => {
22
+ console.log('executing', scenarios.length, 'scenarios...');
23
+ const tempFolder = await tmp.dir({ unsafeCleanup: false, keep: true, prefix: 'plugin-template' });
24
+
25
+ const promises = scenarios.map(async (scenario) => {
26
+ const outputDirectory = path.resolve(tempFolder.path);
27
+
28
+ const results = await template.apply({
29
+ input: { ...scenario, name: `${packageJson.name.split('/')[1]}-${scenario.name}` },
30
+ outputDirectory,
31
+ after: false, // do not print messages
32
+ });
33
+
34
+ return await results.apply();
35
+ });
36
+ await Promise.all(promises);
37
+ console.log('done executing scenarios');
38
+ console.log(`temp folder: ${tempFolder.path}`);
39
+ });
40
+ });