create-wp-typia 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/README.md +33 -0
- package/dist/cli.js +87837 -0
- package/dist/highlights-eq9cgrbb.scm +604 -0
- package/dist/highlights-ghv9g403.scm +205 -0
- package/dist/highlights-hk7bwhj4.scm +284 -0
- package/dist/highlights-r812a2qc.scm +150 -0
- package/dist/highlights-x6tmsnaa.scm +115 -0
- package/dist/injections-73j83es3.scm +27 -0
- package/dist/tree-sitter-javascript-nd0q4pe9.wasm +0 -0
- package/dist/tree-sitter-markdown-411r6y9b.wasm +0 -0
- package/dist/tree-sitter-markdown_inline-j5349f42.wasm +0 -0
- package/dist/tree-sitter-typescript-zxjzwt75.wasm +0 -0
- package/dist/tree-sitter-zig-e78zbjpm.wasm +0 -0
- package/lib/entry.js +29 -0
- package/lib/node-cli.js +326 -0
- package/lib/package-managers.d.ts +29 -0
- package/lib/package-managers.js +170 -0
- package/lib/scaffold.d.ts +64 -0
- package/lib/scaffold.js +565 -0
- package/lib/template-registry.d.ts +18 -0
- package/lib/template-registry.js +58 -0
- package/package.json +64 -0
- package/src/cli.ts +329 -0
- package/templates/advanced/README.md.mustache +70 -0
- package/templates/advanced/block.json.mustache +42 -0
- package/templates/advanced/index.js +21 -0
- package/templates/advanced/package.json.mustache +48 -0
- package/templates/advanced/scripts/generate-migrations.ts.mustache +267 -0
- package/templates/advanced/scripts/lib/typia-metadata-core.ts +806 -0
- package/templates/advanced/scripts/migration-cli.ts.mustache +260 -0
- package/templates/advanced/scripts/sync-types-to-block-json.ts.mustache +25 -0
- package/templates/advanced/src/admin/migration-dashboard.tsx.mustache +450 -0
- package/templates/advanced/src/components/ErrorBoundary.tsx.mustache +47 -0
- package/templates/advanced/src/deprecated.ts.mustache +184 -0
- package/templates/advanced/src/edit.tsx.mustache +93 -0
- package/templates/advanced/src/hooks/useDebounce.ts.mustache +20 -0
- package/templates/advanced/src/hooks/useLocalStorage.ts.mustache +31 -0
- package/templates/advanced/src/hooks.ts.mustache +56 -0
- package/templates/advanced/src/index.tsx.mustache +16 -0
- package/templates/advanced/src/migration-detector.ts.mustache +417 -0
- package/templates/advanced/src/migrations/index.ts.mustache +361 -0
- package/templates/advanced/src/save.tsx.mustache +40 -0
- package/templates/advanced/src/style.scss.mustache +84 -0
- package/templates/advanced/src/types/versions.ts.mustache +108 -0
- package/templates/advanced/src/types.ts.mustache +45 -0
- package/templates/advanced/src/utils/classnames.ts.mustache +51 -0
- package/templates/advanced/src/utils/debounce.ts.mustache +37 -0
- package/templates/advanced/src/utils/index.ts.mustache +7 -0
- package/templates/advanced/src/utils/uuid.ts.mustache +17 -0
- package/templates/advanced/src/validators.ts.mustache +39 -0
- package/templates/advanced/src/view.ts.mustache +59 -0
- package/templates/advanced/tsconfig.json.mustache +9 -0
- package/templates/advanced/webpack.config.js.mustache +85 -0
- package/templates/basic/package.json.mustache +39 -0
- package/templates/basic/scripts/lib/typia-metadata-core.ts +806 -0
- package/templates/basic/scripts/sync-types-to-block-json.ts +25 -0
- package/templates/basic/src/block.json +51 -0
- package/templates/basic/src/edit.tsx +85 -0
- package/templates/basic/src/hooks.ts +75 -0
- package/templates/basic/src/index.tsx +37 -0
- package/templates/basic/src/save.tsx +27 -0
- package/templates/basic/src/style.scss +42 -0
- package/templates/basic/src/types.ts +47 -0
- package/templates/basic/src/validators.ts +39 -0
- package/templates/basic/tsconfig.json +20 -0
- package/templates/basic/webpack.config.js +85 -0
- package/templates/full/package.json.mustache +40 -0
- package/templates/full/scripts/lib/typia-metadata-core.ts +806 -0
- package/templates/full/scripts/sync-types-to-block-json.ts.mustache +25 -0
- package/templates/full/src/block.json.mustache +121 -0
- package/templates/full/src/edit.tsx.mustache +300 -0
- package/templates/full/src/editor.scss.mustache +251 -0
- package/templates/full/src/hooks.ts.mustache +140 -0
- package/templates/full/src/index.tsx.mustache +27 -0
- package/templates/full/src/save.tsx.mustache +39 -0
- package/templates/full/src/style.scss.mustache +224 -0
- package/templates/full/src/types.ts.mustache +34 -0
- package/templates/full/src/validators.ts.mustache +84 -0
- package/templates/full/tsconfig.json.mustache +9 -0
- package/templates/full/webpack.config.js.mustache +85 -0
- package/templates/interactivity/package.json.mustache +41 -0
- package/templates/interactivity/scripts/lib/typia-metadata-core.ts +806 -0
- package/templates/interactivity/scripts/sync-types-to-block-json.ts.mustache +25 -0
- package/templates/interactivity/src/block.json.mustache +75 -0
- package/templates/interactivity/src/edit.tsx.mustache +206 -0
- package/templates/interactivity/src/interactivity.ts.mustache +183 -0
- package/templates/interactivity/src/save.tsx.mustache +87 -0
- package/templates/interactivity/src/types.ts.mustache +29 -0
- package/templates/interactivity/tsconfig.json.mustache +9 -0
- package/templates/interactivity/webpack.config.js.mustache +85 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Debounce function
|
|
3
|
+
*/
|
|
4
|
+
export function debounce<T extends (...args: any[]) => void>(
|
|
5
|
+
func: T,
|
|
6
|
+
wait: number
|
|
7
|
+
): (...args: Parameters<T>) => void {
|
|
8
|
+
let timeout: NodeJS.Timeout;
|
|
9
|
+
|
|
10
|
+
return function executedFunction(...args: Parameters<T>) {
|
|
11
|
+
const later = () => {
|
|
12
|
+
clearTimeout(timeout);
|
|
13
|
+
func(...args);
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
clearTimeout(timeout);
|
|
17
|
+
timeout = setTimeout(later, wait);
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Throttle function
|
|
23
|
+
*/
|
|
24
|
+
export function throttle<T extends (...args: any[]) => void>(
|
|
25
|
+
func: T,
|
|
26
|
+
limit: number
|
|
27
|
+
): (...args: Parameters<T>) => void {
|
|
28
|
+
let inThrottle: boolean;
|
|
29
|
+
|
|
30
|
+
return function executedFunction(...args: Parameters<T>) {
|
|
31
|
+
if (!inThrottle) {
|
|
32
|
+
func.apply(this, args);
|
|
33
|
+
inThrottle = true;
|
|
34
|
+
setTimeout(() => inThrottle = false, limit);
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate UUID v4
|
|
3
|
+
*/
|
|
4
|
+
export function generateUUID(): string {
|
|
5
|
+
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
|
|
6
|
+
const r = Math.random() * 16 | 0;
|
|
7
|
+
const v = c === 'x' ? r : (r & 0x3 | 0x8);
|
|
8
|
+
return v.toString(16);
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Generate short ID (8 characters)
|
|
14
|
+
*/
|
|
15
|
+
export function generateShortId(): string {
|
|
16
|
+
return Math.random().toString(36).substring(2, 10);
|
|
17
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import typia from "typia";
|
|
2
|
+
import { {{titleCase}}Attributes } from "./types";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Typia validators for the block attributes
|
|
6
|
+
*/
|
|
7
|
+
export const validators = {
|
|
8
|
+
validate: typia.createValidate<{{titleCase}}Attributes>(),
|
|
9
|
+
assert: typia.createAssert<{{titleCase}}Attributes>(),
|
|
10
|
+
is: typia.createIs<{{titleCase}}Attributes>(),
|
|
11
|
+
random: typia.createRandom<{{titleCase}}Attributes>(),
|
|
12
|
+
clone: typia.misc.createClone<{{titleCase}}Attributes>(),
|
|
13
|
+
prune: typia.misc.createPrune<{{titleCase}}Attributes>(),
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Create safe attribute updater with validation
|
|
18
|
+
*/
|
|
19
|
+
export function createAttributeUpdater(
|
|
20
|
+
attributes: {{titleCase}}Attributes,
|
|
21
|
+
setAttributes: (attrs: Partial<{{titleCase}}Attributes>) => void,
|
|
22
|
+
validator = validators.validate
|
|
23
|
+
) {
|
|
24
|
+
return <K extends keyof {{titleCase}}Attributes>(
|
|
25
|
+
key: K,
|
|
26
|
+
value: {{titleCase}}Attributes[K]
|
|
27
|
+
) => {
|
|
28
|
+
const newAttrs = { ...attributes, [key]: value };
|
|
29
|
+
|
|
30
|
+
const validation = validator(newAttrs);
|
|
31
|
+
if (validation.success) {
|
|
32
|
+
setAttributes({ [key]: value } as Partial<{{titleCase}}Attributes>);
|
|
33
|
+
return true;
|
|
34
|
+
} else {
|
|
35
|
+
console.error(`Validation failed for ${String(key)}:`, validation.errors);
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { store, getContext } from '@wordpress/interactivity';
|
|
2
|
+
import { {{titleCase}}State } from './types';
|
|
3
|
+
|
|
4
|
+
const { state, actions, callbacks } = store('{{namespace}}/{{slug}}', {
|
|
5
|
+
state: {
|
|
6
|
+
isActive: false,
|
|
7
|
+
isVisible: true,
|
|
8
|
+
isLoading: false,
|
|
9
|
+
} as {{titleCase}}State,
|
|
10
|
+
|
|
11
|
+
actions: {
|
|
12
|
+
toggle() {
|
|
13
|
+
state.isActive = !state.isActive;
|
|
14
|
+
console.log('{{titleCase}} toggled:', state.isActive);
|
|
15
|
+
},
|
|
16
|
+
|
|
17
|
+
hide() {
|
|
18
|
+
state.isVisible = false;
|
|
19
|
+
},
|
|
20
|
+
|
|
21
|
+
show() {
|
|
22
|
+
state.isVisible = true;
|
|
23
|
+
},
|
|
24
|
+
|
|
25
|
+
async loadContent() {
|
|
26
|
+
state.isLoading = true;
|
|
27
|
+
|
|
28
|
+
try {
|
|
29
|
+
// Simulate async operation
|
|
30
|
+
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
31
|
+
|
|
32
|
+
// Get context data
|
|
33
|
+
const context = getContext<{
|
|
34
|
+
content: string;
|
|
35
|
+
alignment: string;
|
|
36
|
+
}>();
|
|
37
|
+
|
|
38
|
+
console.log('{{titleCase}} content loaded:', context);
|
|
39
|
+
|
|
40
|
+
} catch (error) {
|
|
41
|
+
state.error = error instanceof Error ? error.message : 'Unknown error';
|
|
42
|
+
console.error('{{titleCase}} loading failed:', error);
|
|
43
|
+
} finally {
|
|
44
|
+
state.isLoading = false;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
|
|
49
|
+
callbacks: {
|
|
50
|
+
init() {
|
|
51
|
+
console.log('{{titleCase}} initialized with Typia validation and Interactivity API');
|
|
52
|
+
},
|
|
53
|
+
|
|
54
|
+
mounted() {
|
|
55
|
+
const context = getContext();
|
|
56
|
+
console.log('{{titleCase}} mounted with context:', context);
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
});
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
const fs = require("fs");
|
|
2
|
+
const path = require("path");
|
|
3
|
+
const defaultConfig = require("@wordpress/scripts/config/webpack.config");
|
|
4
|
+
|
|
5
|
+
class TypiaManifestAssetPlugin {
|
|
6
|
+
apply(compiler) {
|
|
7
|
+
compiler.hooks.thisCompilation.tap("TypiaManifestAssetPlugin", (compilation) => {
|
|
8
|
+
compilation.hooks.processAssets.tap(
|
|
9
|
+
{
|
|
10
|
+
name: "TypiaManifestAssetPlugin",
|
|
11
|
+
stage: compiler.webpack.Compilation.PROCESS_ASSETS_STAGE_ADDITIONS,
|
|
12
|
+
},
|
|
13
|
+
() => {
|
|
14
|
+
for (const entry of getManifestEntries()) {
|
|
15
|
+
if (compilation.getAsset(entry.outputPath)) {
|
|
16
|
+
continue;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
compilation.emitAsset(
|
|
20
|
+
entry.outputPath,
|
|
21
|
+
new compiler.webpack.sources.RawSource(fs.readFileSync(entry.inputPath)),
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
);
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function getManifestEntries() {
|
|
31
|
+
const entries = [];
|
|
32
|
+
const rootManifestPath = path.resolve(process.cwd(), "typia.manifest.json");
|
|
33
|
+
|
|
34
|
+
if (fs.existsSync(rootManifestPath)) {
|
|
35
|
+
entries.push({
|
|
36
|
+
inputPath: rootManifestPath,
|
|
37
|
+
outputPath: "typia.manifest.json",
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const srcDir = path.resolve(process.cwd(), "src");
|
|
42
|
+
if (!fs.existsSync(srcDir)) {
|
|
43
|
+
return entries;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
for (const inputPath of findManifestFiles(srcDir)) {
|
|
47
|
+
entries.push({
|
|
48
|
+
inputPath,
|
|
49
|
+
outputPath: path.relative(srcDir, inputPath),
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return entries;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function findManifestFiles(directory) {
|
|
57
|
+
const manifestFiles = [];
|
|
58
|
+
|
|
59
|
+
for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
|
|
60
|
+
const entryPath = path.join(directory, entry.name);
|
|
61
|
+
|
|
62
|
+
if (entry.isDirectory()) {
|
|
63
|
+
manifestFiles.push(...findManifestFiles(entryPath));
|
|
64
|
+
continue;
|
|
65
|
+
}
|
|
66
|
+
if (entry.isFile() && entry.name === "typia.manifest.json") {
|
|
67
|
+
manifestFiles.push(entryPath);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return manifestFiles;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
module.exports = async () => {
|
|
75
|
+
const { default: UnpluginTypia } = await import("@typia/unplugin/webpack");
|
|
76
|
+
|
|
77
|
+
return {
|
|
78
|
+
...defaultConfig,
|
|
79
|
+
plugins: [
|
|
80
|
+
UnpluginTypia(),
|
|
81
|
+
...(defaultConfig.plugins || []),
|
|
82
|
+
new TypiaManifestAssetPlugin(),
|
|
83
|
+
],
|
|
84
|
+
};
|
|
85
|
+
};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "{{slug}}",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"packageManager": "bun@1.3.10",
|
|
5
|
+
"description": "{{description}}",
|
|
6
|
+
"author": "{{author}}",
|
|
7
|
+
"license": "GPL-2.0-or-later",
|
|
8
|
+
"main": "build/index.js",
|
|
9
|
+
"scripts": {
|
|
10
|
+
"sync-types": "tsx scripts/sync-types-to-block-json.ts",
|
|
11
|
+
"prebuild": "bun run sync-types",
|
|
12
|
+
"build": "wp-scripts build",
|
|
13
|
+
"start": "bun run sync-types && wp-scripts start",
|
|
14
|
+
"dev": "bun run start",
|
|
15
|
+
"lint:js": "wp-scripts lint-js",
|
|
16
|
+
"lint:css": "wp-scripts lint-style",
|
|
17
|
+
"lint": "bun run lint:js && bun run lint:css",
|
|
18
|
+
"format": "wp-scripts format"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"ajv": "^8.18.0",
|
|
22
|
+
"@types/wordpress__block-editor": "^11.5.17",
|
|
23
|
+
"@types/wordpress__blocks": "^12.5.18",
|
|
24
|
+
"@types/wordpress__components": "^23.8.0",
|
|
25
|
+
"@wordpress/browserslist-config": "^6.42.0",
|
|
26
|
+
"@wordpress/scripts": "^30.22.0",
|
|
27
|
+
"@typia/unplugin": "^12.0.1",
|
|
28
|
+
"tsx": "^4.20.5",
|
|
29
|
+
"typescript": "^5.9.2",
|
|
30
|
+
"typia": "^12.0.1"
|
|
31
|
+
},
|
|
32
|
+
"dependencies": {
|
|
33
|
+
"@wordpress/block-editor": "^15.2.0",
|
|
34
|
+
"@wordpress/blocks": "^15.2.0",
|
|
35
|
+
"@wordpress/components": "^30.2.0",
|
|
36
|
+
"@wordpress/element": "^6.29.0",
|
|
37
|
+
"@wordpress/i18n": "^6.2.0"
|
|
38
|
+
}
|
|
39
|
+
}
|